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玩井字棋,以此来学习强化学习算法等。