python五子棋人机对战
时间: 2023-10-01 09:05:32 浏览: 85
好的,我可以为您提供一个简单的五子棋人机对战的Python程序。这个程序使用了Python的tkinter库来创建图形用户界面(GUI),并使用了一个基本的算法来模拟人类的下棋策略。
下面是程序的代码,您可以在本地的Python环境中运行它:
```
import tkinter as tk
import random
class Board:
def __init__(self, size=15):
self.size = size
self.board = [[0 for i in range(size)] for j in range(size)]
self.current_player = 1
def is_valid_move(self, x, y):
return self.board[x][y] == 0
def make_move(self, x, y):
self.board[x][y] = self.current_player
self.current_player = 3 - self.current_player
def is_game_over(self):
for i in range(self.size):
for j in range(self.size):
if self.board[i][j] == 0:
continue
if self.check_five(i, j):
return True
return False
def check_five(self, x, y):
if self.check_line(x, y, 1, 0):
return True
if self.check_line(x, y, 0, 1):
return True
if self.check_line(x, y, 1, 1):
return True
if self.check_line(x, y, 1, -1):
return True
return False
def check_line(self, x, y, dx, dy):
count = 1
for i in range(1, 5):
nx, ny = x + i * dx, y + i * dy
if nx < 0 or nx >= self.size or ny < 0 or ny >= self.size or self.board[nx][ny] != self.board[x][y]:
break
count += 1
for i in range(1, 5):
nx, ny = x - i * dx, y - i * dy
if nx < 0 or nx >= self.size or ny < 0 or ny >= self.size or self.board[nx][ny] != self.board[x][y]:
break
count += 1
return count >= 5
def get_empty_positions(self):
positions = []
for i in range(self.size):
for j in range(self.size):
if self.board[i][j] == 0:
positions.append((i, j))
return positions
class Game:
def __init__(self, size=15):
self.board = Board(size)
self.gui = GUI(size, self)
def human_make_move(self, x, y):
if self.board.is_valid_move(x, y):
self.board.make_move(x, y)
self.gui.update_board()
if self.board.is_game_over():
self.gui.show_message("You win!")
return
self.computer_make_move()
def computer_make_move(self):
positions = self.board.get_empty_positions()
random.shuffle(positions)
for x, y in positions:
if self.board.is_valid_move(x, y):
self.board.make_move(x, y)
self.gui.update_board()
if self.board.is_game_over():
self.gui.show_message("Computer wins!")
return
return
class GUI:
def __init__(self, size, game):
self.size = size
self.game = game
self.window = tk.Tk()
self.window.title("Five in a Row")
self.window.geometry("500x500")
self.canvas = tk.Canvas(self.window, width=480, height=480, bg="white")
self.canvas.place(x=10, y=10)
self.canvas.bind("<Button-1>", self.on_click)
self.update_board()
self.window.mainloop()
def update_board(self):
self.canvas.delete("all")
for i in range(self.size):
for j in range(self.size):
if self.game.board.board[i][j] == 1:
self.canvas.create_oval(j * 30 + 5, i * 30 + 5, j * 30 + 25, i * 30 + 25, fill="black")
elif self.game.board.board[i][j] == 2:
self.canvas.create_oval(j * 30 + 5, i * 30 + 5, j * 30 + 25, i * 30 + 25, fill="white")
else:
self.canvas.create_rectangle(j * 30 + 5, i * 30 + 5, j * 30 + 25, i * 30 + 25, fill="grey")
def on_click(self, event):
x, y = event.y // 30, event.x // 30
self.game.human_make_move(x, y)
def show_message(self, message):
tk.messagebox.showinfo("Message", message)
```
在运行程序之前,您需要安装Python的tkinter库,可以使用以下命令安装:
```
pip install tk
```
运行程序后,您将看到一个15x15的棋盘。您可以通过单击空白处来下棋,程序会自动切换到计算机玩家并进行下一个动作。当有一方获胜时,程序将弹出一个消息框显示胜利者。