用python3写一个带界面的井字棋的最优下法
下面是一个简单的用Python3编写的带界面的井字棋游戏,它使用了最优下法来进行游戏。
import tkinter as tk
from tkinter import messagebox
class TicTacToe:
def __init__(self):
self.root = tk.Tk()
self.root.title("井字棋")
self.buttons = []
self.board = [[' ' for _ in range(3)] for _ in range(3)]
self.current_player = 'X'
self.create_board()
def create_board(self):
for i in range(3):
row = []
for j in range(3):
button = tk.Button(self.root, text=' ', font=('Arial', 20), width=6, height=3,
command=lambda i=i, j=j: self.make_move(i, j))
button.grid(row=i, column=j)
row.append(button)
self.buttons.append(row)
def make_move(self, row, col):
if self.board[row][col] == ' ':
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner():
messagebox.showinfo('游戏结束', f"{self.current_player} 赢了!")
self.reset_game()
elif self.check_draw():
messagebox.showinfo('游戏结束', "平局!")
self.reset_game()
else:
self.current_player = 'O' if self.current_player == 'X' else 'X'
self.ai_move()
def ai_move(self):
best_score = float('-inf')
best_move = None
for i in range(3):
for j in range(3):
if self.board[i][j] == ' ':
self.board[i][j] = 'O'
score = self.minimax(self.board, 0, False)
self.board[i][j] = ' '
if score > best_score:
best_score = score
best_move = (i, j)
row, col = best_move
self.board[row][col] = 'O'
self.buttons[row][col].config(text='O')
if self.check_winner():
messagebox.showinfo('游戏结束', "O 赢了!")
self.reset_game()
elif self.check_draw():
messagebox.showinfo('游戏结束', "平局!")
self.reset_game()
else:
self.current_player = 'X'
def minimax(self, board, depth, is_maximizing):
scores = {
'X': -1,
'O': 1,
'draw': 0
}
result = self.check_result(board)
if result:
return scores[result]
if is_maximizing:
best_score = float('-inf')
for i in range(3):
for j in range(3):
if board[i][j] == ' ':
board[i][j] = 'O'
score = self.minimax(board, depth + 1, False)
board[i][j] = ' '
best_score = max(score, best_score)
return best_score
else:
best_score = float('inf')
for i in range(3):
for j in range(3):
if board[i][j] == ' ':
board[i][j] = 'X'
score = self.minimax(board, depth + 1, True)
board[i][j] = ' '
best_score = min(score, best_score)
return best_score
def check_winner(self):
# 检查所有行
for i in range(3):
if self.board[i][0] == self.board[i][1] == self.board[i][2] != ' ':
return True
# 检查所有列
for j in range(3):
if self.board[0][j] == self.board[1][j] == self.board[2][j] != ' ':
return True
# 检查对角线
if self.board[0][0] == self.board[1][1] == self.board[2][2] != ' ':
return True
if self.board[0][2] == self.board[1][1] == self.board[2][0] != ' ':
return True
return False
def check_draw(self):
for i in range(3):
for j in range(3):
if self.board[i][j] == ' ':
return False
return True
def check_result(self, board):
# 检查所有行
for i in range(3):
if board[i][0] == board[i][1] == board[i][2] != ' ':
return board[i][0]
# 检查所有列
for j in range(3):
if board[0][j] == board[1][j] == board[2][j] != ' ':
return board[0][j]
# 检查对角线
if board[0][0] == board[1][1] == board[2][2] != ' ':
return board[0][0]
if board[0][2] == board[1][1] == board[2][0] != ' ':
return board[0][2]
# 平局
if self.check_draw():
return 'draw'
return None
def reset_game(self):
self.board = [[' ' for _ in range(3)] for _ in range(3)]
self.current_player = 'X'
for i in range(3):
for j in range(3):
self.buttons[i][j].config(text=' ')
def start(self):
self.root.mainloop()
if __name__ == '__main__':
game = TicTacToe()
game.start()
这个程序使用了tkinter库来创建界面,使用了minimax算法实现了最优下法。玩家和AI交替下棋,当出现赢家或者平局时,会弹出对话框显示游戏结果,并重置游戏
原文地址: https://www.cveoy.top/t/topic/h3V0 著作权归作者所有。请勿转载和采集!