下面是一个简单的用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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录