needmoreeasy EN 한국어
배우기

52 — 게임: 틱택토

★★★★☆ (4/5)게임
선수 지식
51 — 격자, 26 — 모험
결과물
승리 확인이 있는 두 명이 하는 틱택토

51 가이드가 판을 만들었고, 26 가이드가 물어봐, while True, break로 선택지를 게임 반복으로 바꾸는 법을 보여 주었습니다. 틱택토는 둘을 합칩니다: 두 플레이어가 돌아가며 행과 열을 고르고, 매 차례마다 함수가 세 개가 한 줄에 있는지 확인합니다.

단계

  1. 게임 전체가 파일 하나에 있습니다. tictactoe.ko.nme으로 저장합니다. 판과 판보여줘51에서 나오고, 승자확인은 행·열·대각선을 살펴 승리 표시를 돌려주며 한 줄도 없으면 None을 돌려줍니다. 숫자로 물어봐가 행과 열을 정수로 읽고, continue가 찬 칸을 거르며, 움직임 == 9가 무승부를 선언합니다:
    # tictactoe.ko.nme — 두 명이 하는 틱택토 게임.
    # 실행: nme 실행 tictactoe.ko
    # 판은 행들의 목록입니다(51 가이드). 차례마다 표시를 놓고,
    # 승자확인 함수가 가로·세로·대각선에서 세 개가 같은지 봅니다.
    
    판 = [["-", "-", "-"], ["-", "-", "-"], ["-", "-", "-"]]
    
    def 판보여줘(판):
        for 행 in 판:
            말해 행
    
    def 승자확인(판):
        # 가로: 나란히 같은 표시 세 개.
        for 행 in 판:
            if 행[0] == 행[1] and 행[1] == 행[2] and 행[0] != "-":
                return 행[0]
        # 세로: 아래로 곧게 같은 표시 세 개.
        for 열 in range(3):
            if 판[0][열] == 판[1][열] and 판[1][열] == 판[2][열] and 판[0][열] != "-":
                return 판[0][열]
        # 대각선: 구석에서 구석으로.
        if 판[0][0] == 판[1][1] and 판[1][1] == 판[2][2] and 판[0][0] != "-":
            return 판[0][0]
        if 판[0][2] == 판[1][1] and 판[1][1] == 판[2][0] and 판[0][2] != "-":
            return 판[0][2]
        return None
    
    표시 = "X"
    움직임 = 0
    말해 "틱택토! 행과 열은 0, 1, 2입니다."
    말해 "표시 세 개를 한 줄에 놓으면 이깁니다. X가 먼저입니다."
    
    while True:
        판보여줘(판)
        행을 숫자로 물어봐 f"{표시} 차례, 행 (0-2): "
        열을 숫자로 물어봐 f"{표시} 차례, 열 (0-2): "
        if 판[행][열] != "-":
            말해 "그 칸은 이미 차 있습니다. 다른 칸을 고르세요."
            continue
        판[행][열] = 표시
        움직임 = 움직임 + 1
        승자 = 승자확인(판)
        if 승자 is not None:
            말해 f"{움직임} 번 움직인 뒤:"
            판보여줘(판)
            말해 f"{승자} 표시가 이겼습니다!"
            break
        if 움직임 == 9:
            말해 f"{움직임} 번 움직인 뒤:"
            판보여줘(판)
            말해 "비겼습니다."
            break
        if 표시 == "X":
            표시 = "O"
        else:
            표시 = "X"
    
    실행해 보기 →
  2. 파이프로 게임 전체를 돌립니다 — 행·열을 다섯 차례 입력합니다. X가 한 행을 채우고 마지막 차례에 이깁니다:
    printf '0\n0\n1\n0\n0\n1\n2\n0\n0\n2\n' | nme 실행 tictactoe.ko
    
    틱택토! 행과 열은 0, 1, 2입니다.
    표시 세 개를 한 줄에 놓으면 이깁니다. X가 먼저입니다.
    ['-', '-', '-']
    ['-', '-', '-']
    ['-', '-', '-']
    X 차례, 행 (0-2): X 차례, 열 (0-2): ['X', '-', '-']
    ['-', '-', '-']
    ['-', '-', '-']
    O 차례, 행 (0-2): O 차례, 열 (0-2): ['X', '-', '-']
    ['O', '-', '-']
    ['-', '-', '-']
    X 차례, 행 (0-2): X 차례, 열 (0-2): ['X', 'X', '-']
    ['O', '-', '-']
    ['-', '-', '-']
    O 차례, 행 (0-2): O 차례, 열 (0-2): ['X', 'X', '-']
    ['O', '-', '-']
    ['O', '-', '-']
    X 차례, 행 (0-2): X 차례, 열 (0-2): 5 번 움직인 뒤:
    ['X', 'X', 'X']
    ['O', '-', '-']
    ['O', '-', '-']
    X 표시가 이겼습니다!
    

    마지막 판에 승리 행이 보입니다: 맨 위에 X가 가로로 있습니다. break가 게임을 끝냈으므로 승리 차례가 마지막 차례입니다.

직접 해보기

O가 이기는 게임과 무승부로 끝나는 게임을 해 보고, 승자확인이 어느 줄이 완성됐는지도 말하게 해 보세요 — 예를 들어 "0행".

배운 것

  • 숫자로 물어봐가 행과 열을 정수로 읽고, 판[행][열]이 표시를 씁니다.
  • 함수가 행·열·대각선에서 같은 표시 세 개를 확인합니다.
  • continue는 찬 칸을 거르고, break는 게임을 끝냅니다.
  • 움직임 == 9에 승자가 없으면 무승부입니다.

GitHub에서 이 문서 보기