人机对战五子棋python代码
时间: 2023-05-12 19:02:23 浏览: 88
五子棋是一种智力运算的棋类游戏,现在我们可以使用 Python 编写五子棋的人机对战代码。Python 的 tkinter 模块可以实现界面的设计,我们可以使用这个模块将五子棋界面化。现在我们以下面的代码为基础,简单介绍一下五子棋人机对战的代码实现。
```python
from tkinter import *
class Board(object):
def __init__(self, row=15, column=15, board_width=500):
self.row = row #棋盘行数
self.column = column #棋盘列数
self.board_width = board_width #棋盘宽度
self.piece_size = self.board_width // self.row #棋子大小
self.radius = self.piece_size // 2 * 0.8 #棋子半径,减少棋子之间的间隔
self.board = [[0 for _ in range(self.column)] for _ in range(self.row)] #初始化棋盘
self.player = 1 #默认玩家1先手
self.chess_color = {0: 'white', 1: 'black', 2: 'red'} #棋子颜色,0为白色,1为黑色,2为红色
self.init_board()
def init_board(self):
self.canvas = Canvas(root, bg='burlywood', width=self.board_width, height=self.board_width)
self.canvas.pack()
for i in range(0, self.board_width, self.piece_size):
self.canvas.create_line(i, 0, i, self.board_width)
self.canvas.create_line(0, i, self.board_width, i)
self.canvas.bind('<Button-1>', self.callback)
def callback(self, event):
x = event.x
y = event.y
row = round(y / self.piece_size) - 1
column = round(x / self.piece_size) - 1
if row >= 0 and row < self.row and column >= 0 and column < self.column and self.board[row][column] == 0:
self.board[row][column] = self.player
self.draw_piece(row, column)
if self.check_win(row, column, self.player):
print("player %d win!" %(self.player))
self.player = 3 - self.player #交换玩家
def draw_piece(self, row, column):
color = self.chess_color[self.player]
x = (column+1) * self.piece_size
y = (row+1) * self.piece_size
self.canvas.create_oval(x-self.radius, y-self.radius, x+self.radius, y+self.radius, fill=color)
def check_win(self, row, column, player):
count = 1
for i in range(1, 5): #判断横向是否五连珠
if column-i >= 0 and self.board[row][column-i] == player:
count += 1
else:
break
for i in range(1, 5):
if column+i < self.column and self.board[row][column+i] == player:
count += 1
else:
break
if count >= 5:
return True
count = 1
for i in range(1, 5): #判断纵向是否五连珠
if row-i >= 0 and self.board[row-i][column] == player:
count += 1
else:
break
for i in range(1, 5):
if row+i < self.row and self.board[row+i][column] == player:
count += 1
else:
break
if count >= 5:
return True
count = 1
for i in range(1, 5): #判断右斜是否五连珠
if row-i >= 0 and column-i >= 0 and self.board[row-i][column-i] == player:
count += 1
else:
break
for i in range(1, 5):
if row+i < self.row and column+i < self.column and self.board[row+i][column+i] == player:
count += 1
else:
break
if count >= 5:
return True
count = 1
for i in range(1, 5): #判断左斜是否五连珠
if row-i >= 0 and column+i < self.column and self.board[row-i][column+i] == player:
count += 1
else:
break
for i in range(1, 5):
if row+i < self.row and column-i >= 0 and self.board[row+i][column-i] == player:
count += 1
else:
break
if count >= 5:
return True
return False
root = Tk()
root.title('五子棋')
board = Board()
root.mainloop()
```
该段代码中,我们用 board 类封装了五子棋的逻辑。init_board 方法实现了棋盘的初始化,callback 方法实现了玩家下棋及检查胜负的逻辑,draw_piece 方法实现了描画棋子的逻辑,check_win 方法实现了检查胜利条件的逻辑。代码中棋盘默认大小为 15 × 15,棋盘宽度为 500,玩家 1 的棋子是黑色,玩家 2 的棋子是白色,开始游戏时玩家 1 先手,点击棋盘上的空位进行下棋,当有一方玩家下五连珠时游戏结束。最后在主函数中,我们将该类实例化,并用 tkinter 库进行可视化窗口设计。
以上便是五子棋 Python 人机对战代码的简单介绍,该段代码的结构清晰,逻辑简单易懂,对于 Python 初学者来说,实现这个小项目也是一项不错的练习。