挑戰人工智能,體驗經典井字棋的對決!AI 擁有強大的邏輯計算能力,每一步都經過精準推演。你能戰勝它嗎?還是會被 AI 徹底碾壓?
特點:
智能 AI,難度可調
極簡界面,快速上手
實時勝負統計,見證你的進步
代碼如下:
import sys
from random import choice
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QVBoxLayout, QHBoxLayout, QLabel
from PyQt5.QtCore import Qtclass TicTacToe(QWidget):def __init__(self):super().__init__()self.setWindowTitle('井字棋游戲')self.setGeometry(100, 100, 400, 400)self.buttons = []self.current_player = 'X' # 玩家是X,AI是Oself.game_over = Falseself.board = ['' for _ in range(9)]self.initUI()def initUI(self):# 頂部信息標簽self.info_label = QLabel("玩家的回合 - 點擊格子放置X", self)self.info_label.setAlignment(Qt.AlignCenter)# 創建3x3按鈕網格layout = QVBoxLayout()layout.addWidget(self.info_label)for i in range(3):row = QHBoxLayout()for j in range(3):index = i * 3 + jbutton = QPushButton('', self)button.setFixedSize(100, 100)button.clicked.connect(lambda _, idx=index: self.button_clicked(idx))row.addWidget(button)self.buttons.append(button)layout.addLayout(row)# 重新開始按鈕restart_button = QPushButton('重新開始', self)restart_button.clicked.connect(self.reset_game)layout.addWidget(restart_button)self.setLayout(layout)def button_clicked(self, index):if self.game_over or self.board[index] != '' or self.current_player != 'X':return# 玩家下棋self.board[index] = 'X'self.buttons[index].setText('X')self.buttons[index].setEnabled(False)# 檢查游戲是否結束if self.check_winner('X'):self.info_label.setText("玩家勝利!")self.game_over = TrueQMessageBox.information(self, "游戲結束", "你贏了!", QMessageBox.Ok)return# 檢查是否平局if '' not in self.board:self.info_label.setText("平局!")self.game_over = TrueQMessageBox.information(self, "游戲結束", "平局!", QMessageBox.Ok)return# AI下棋self.ai_move()def ai_move(self):self.current_player = 'O'self.info_label.setText("AI的回合...")# 簡單AI: 隨機選擇一個空格子empty_spots = [i for i, val in enumerate(self.board) if val == '']if empty_spots:# 可以在這里實現更復雜的AI邏輯move = self.simple_ai()self.board[move] = 'O'self.buttons[move].setText('O')self.buttons[move].setEnabled(False)self.info_label.setText("玩家的回合 - 點擊格子放置X")self.current_player = 'X'# 檢查游戲是否結束if self.check_winner('O'):self.info_label.setText("AI勝利!")self.game_over = TrueQMessageBox.information(self, "游戲結束", "AI贏了!", QMessageBox.Ok)return# 檢查是否平局if '' not in self.board:self.info_label.setText("平局!")self.game_over = TrueQMessageBox.information(self, "游戲結束", "平局!", QMessageBox.Ok)returndef simple_ai(self):# 先檢查是否有必勝的機會for i in range(9):if self.board[i] == '':self.board[i] = 'O'if self.check_winner('O'):self.board[i] = ''return iself.board[i] = ''# 如果沒有必勝機會,再檢查是否需要阻擋玩家for i in range(9):if self.board[i] == '':self.board[i] = 'X'if self.check_winner('X'):self.board[i] = ''return iself.board[i] = ''# 如果沒有必勝或阻擋的必要,嘗試占據中心if self.board[4] == '':return 4# 嘗試占據角位corners = [0, 2, 6, 8]empty_corners = [i for i in corners if self.board[i] == '']if empty_corners:return choice(empty_corners)# 最后選擇邊位edges = [1, 3, 5, 7]empty_edges = [i for i in edges if self.board[i] == '']return choice(empty_edges) if empty_edges else -1def check_winner(self, player):# 檢查行for i in range(0, 9, 3):if self.board[i] == self.board[i + 1] == self.board[i + 2] == player:return True# 檢查列for i in range(3):if self.board[i] == self.board[i + 3] == self.board[i + 6] == player:return True# 檢查對角線if self.board[0] == self.board[4] == self.board[8] == player:return Trueif self.board[2] == self.board[4] == self.board[6] == player:return Truereturn Falsedef reset_game(self):for i in range(9):self.buttons[i].setText('')self.buttons[i].setEnabled(True)self.board = ['' for _ in range(9)]self.current_player = 'X'self.game_over = Falseself.info_label.setText("玩家的回合 - 點擊格子放置X")if __name__ == '__main__':app = QApplication(sys.argv)game = TicTacToe()game.show()sys.exit(app.exec_())
效果展示: