본문 바로가기
프로그램/Python 1000제

Python 278제] 파이썬 EXPRESS CHAPTER 9. 도전문제 p431

by 건티 2024. 5. 20.
728x90

출처 : 반크_독도2023

 

참고풀이]

from tkinter import *
from tkinter import messagebox #메세지박스 추가

Size=3
#승자여부를 체크한다.
def Count():
    p1=0 #X의 개수를 세는 변수
    p2=0 #O의 개수를 세는 변수
    px=False #X의 승리여부 체크변수
    po=False #O의 승리여부 체크변수
    #X=1로 체크, O=2로 체크된다.

    #열의 개수를 체크한다.
    for c in range(Size):
        p1=p2=0
        for r in range(Size):
            if Chk[r][c]==1:
                p1+=1
            else:
                p1=0
            if Chk[r][c]==2:
                p2+=1
            else:
                p2=0
                
            if p1==3:
                px=True
                break
            if p2==3:
                po=True
                break

    #행의 개수를 체크한다.
    for r in range(Size):
        p1=p2=0
        for c in range(Size):
            if Chk[r][c]==1:
                p1+=1
            else:
                p1=0
            if Chk[r][c]==2:
                p2+=1
            else:
                p2=0
                
            if p1==3:
                px=True
                break
            if p2==3:
                po=True
                break

    #왼쪽 대각선의 개수를 체크한다.
    p1=p2=0
    for r in range(Size):
        if Chk[r][r]==1:
            p1+=1
            if p1==3:
                px=True
                break
        else:
            p1=0
        if Chk[r][r]==2:
            p2+=1
            if p2==3:
                po=True
                break
        else:
            p2=0

    #오른쪽 대각선의 개수를 체크한다.
    p1=p2=0
    for r in range(Size):
        if Chk[r][Size-1-r]==1:
            p1+=1
            if p1==3:
                px=True
                break
        else:
            p1=0
        if Chk[r][Size-1-r]==2:
            p2+=1
            if p2==3:
                po=True
                break
        else:
            p2=0

    #승자여부를 체크한다.
    if px:
        messagebox.showinfo("승리여부 결과","Player1이 이겼습니다.")
    if po:
        messagebox.showinfo("승리여부 결과","Player2가 이겼습니다.")
        

#i번째 버튼을 누를 수 있는지 검사한다. 누를 수 있으면 X나 O를 표시한다. 
def checked(i):
    global player
    button = List[i] #리스트에서 I번째 버튼 객체를 가져온다. 

    #버튼이 초기상태가 아니면 이미 누른 버튼이므로 아무것도 하지 않고 리턴한다.
    if button["text"] != "            ":
        return
    button["text"] = "     " + player+"      "
    button["bg"] = "yellow"
    if player=="X":
        player = "O"
        button["bg"] = "yellow"
        Chk[i//Size][i%Size] = 1
        Count()
    else:
        player = "X"
        button["bg"] = "lightgreen"
        Chk[i//Size][i%Size] = 2
        Count()

window = Tk() #윈도우를 생성한다.  
player="X"    #시작은 플레이어 X이다. 
List = []
Chk=[[0 for j in range(Size)] for i in range(Size)] #승자여부 체크리스트
#9개의 버튼을 생성하여 격자 형태로 윈도우에 배치한다. 
for i in range(Size*Size):
    b = Button(window, text="            ", command=lambda k=i: checked(k))
    b.grid(row=i//Size, column=i%Size)
    List.append(b) # 버튼 객체를 리스트에 저장한다.

window.mainloop()

 

참고풀이 결과]

시작장)

 

게임 결과창)

 

 

 

 

 

대한민국의 아름다운 영토, 독도

 

반응형

댓글