tic-tac-toe

2026-06-27 23:20:00 创建

2026-06-29 12:35:15 修改

使用Python完成了井字棋

2026-06-29 更新:对代码做了修改,进一步对函数解耦

import numpy as np

class Grid:
    def __init__(self):
        self.grid = np.full((3, 3), -1)
        self.turn = np.random.randint(0, 2)
        self.list: list = [_ for _ in range(9)] # 维护一个列表,表示哪些位置是空的
    def __str__(self):
        return f"┌ {self.grid[0][0]:>2}  {self.grid[0][1]:>2}  {self.grid[0][2]:>2} ┐\n" + \
               f"├ {self.grid[1][0]:>2}  {self.grid[1][1]:>2}  {self.grid[1][2]:>2} ┤\n" + \
               f"└ {self.grid[2][0]:>2}  {self.grid[2][1]:>2}  {self.grid[2][2]:>2} ┘\n"
    def fill(self, num: int, turn: int)->int:
        self.grid[num // 3][num % 3] = turn
        self.list.remove(num)
        return num

    def check(self)->int:
        # 0 (bot), 1 (human) 表示谁赢了
        win = -2
        for i in range(3):
            if self.grid[i][0] != -1 and self.grid[i][0] == self.grid[i][1] and self.grid[i][1] == self.grid[i][2]:
                win = self.grid[i][0]
        for j in range(3):
            if self.grid[0][j] != -1 and self.grid[0][j] == self.grid[1][j] and self.grid[1][j] == self.grid[2][j]:
                win = self.grid[0][j]
        if self.grid[0][0] != -1 and self.grid[0][0] == self.grid[1][1] and self.grid[1][1] == self.grid[2][2]:
            win = self.grid[0][0]
        if self.grid[0][2] != -1 and self.grid[0][2] == self.grid[1][1] and self.grid[1][1] == self.grid[2][0]:
            win = self.grid[0][2]
        if win != -2:
            return win
        # -1 表示平局
        elif len(self.list) == 0:
            return -1
        # -2 表示尚未结束
        else:
            return -2
    
def main():
    print('=' * 20 + ' Tic-Tac-Toe ' + '=' * 20 + '\n')
    print('The grid position is:\n')
    print('┌ 1  2  3 ┐\n├ 4  5  6 ┤\n└ 7  8  9 ┘\n')
    game_grid = Grid()
    if game_grid.turn == 0:
        print('Bot first!\n')
    else:
        print('You first!\n')
    turn = game_grid.turn
    while True:
        print('*' * 20)
        if turn == 0:
            print('Bot turn!')
            num = np.random.choice(game_grid.list)
            game_grid.fill(num, turn)
        else:
            print('Your turn!')
            while True:
                print('Please select a position from ' + ', '.join([str(_ + 1) for _ in game_grid.list]) + ':')
                try:
                    num = int(input()) - 1
                    if num not in game_grid.list:
                        print('This position is already filled or you input an invalid number!\n')
                        continue
                    else:
                        game_grid.fill(num, turn)
                        break
                except ValueError:
                    print('Please input a number!')
        print(('You' if turn else 'Bot') + ' selected position: ' + str(num + 1) + '.\nNow the grid:\n')
        print(game_grid)
        check = game_grid.check()
        if check == -2:
            turn = 1 - turn
        else:
            if check == -1:
                print('Draw!')
            else:
                print(('You' if check else 'Bot') + ' win!')
            break
    print('Game over!')

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('\nGame interrupted!')

下一目标是训练AI玩井字棋,以此来学习强化学习算法等。