目录
游戏简介
五子棋,也称为连珠游戏,是一种传统的二人对弈游戏。玩家轮流在棋盘上落子,目标是在横、竖、斜的任意方向上先形成连续的五颗棋子,即五子连珠,以获得胜利。游戏规则简单,但是策略性很强,需要玩家在防守和进攻之间取得平衡,找到最佳的落子位置,以击败对手。
实现的基本功能
- 创建了一个图形化界面,用于展示棋盘和交互操作。
- 实现了玩家在棋盘上落子的功能,通过点击棋盘上的按钮来放置对应的棋子。
- 实现了简单的胜负判断逻辑,检查是否有玩家在横、竖、斜的任意方向上形成连续的五颗棋子。
- 提供了重置棋盘的功能,可以清空棋盘上的所有棋子,重新开始游戏。
主要的方法
__init__
: 初始化游戏窗口,设置窗口标题、大小(15×15)等参数。create_board_buttons
: 创建棋盘按钮,每个按钮代表棋盘上的一个格子。place_piece
: 玩家落子的操作,根据玩家的点击在棋盘上放置对应的棋子,并检查是否有玩家获胜。check_winner
: 判断指定玩家是否获胜,通过检查行、列、对角线上是否有连续五颗相同的棋子来判断。check_direction
: 检查指定方向上是否存在连续五颗相同的棋子。reset_board
: 重置棋盘状态,清空棋盘上的所有棋子。
游戏界面
![](https://i-blog.csdnimg.cn/blog_migrate/fae473710e3673d57961f8494f5a1597.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ced37903087ffeab354100d79e28e8a4.png)
完整代码
import tkinter as tk
from tkinter import messagebox
class FiveInARow(tk.Tk):
def __init__(self):
super().__init__()
self.title("Five in a Row") # 设置窗口标题
self.board_size = 15 # 棋盘大小
self.board = [['.' for _ in range(self.board_size)] for _ in range(self.board_size)] # 初始化棋盘状态
self.players = ['X', 'O'] # 玩家标记
self.current_player = 0 # 当前玩家(0代表'X',1代表'O')
self.create_board_buttons() # 创建棋盘按钮
def create_board_buttons(self):
# 创建棋盘按钮,每个按钮代表一个棋盘格子
self.buttons = [[tk.Button(self, text=' ', font=('Arial', 12), width=2, height=1,
command=lambda r=row, c=col: self.place_piece(r, c))
for col in range(self.board_size)] for row in range(self.board_size)]
# 将棋盘按钮放置在窗口中
for row in range(self.board_size):
for col in range(self.board_size):
self.buttons[row][col].grid(row=row, column=col)
# 将棋盘置于窗口中间
self.center_board()
def center_board(self):
# 计算窗口居中位置
window_width = self.winfo_reqwidth()
window_height = self.winfo_reqheight()
screen_width = self.winfo_screenwidth()
screen_height = self.winfo_screenheight()
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
self.geometry(f'+{x}+{y}') # 设置窗口位置
def place_piece(self, row, col):
# 玩家在棋盘上落子的操作
if self.board[row][col] == '.': # 检查当前位置是否为空
player = self.players[self.current_player] # 获取当前玩家标记
self.board[row][col] = player # 更新棋盘状态
self.buttons[row][col].config(text=player) # 更新按钮显示
if self.check_winner(player): # 检查是否有玩家获胜
messagebox.showinfo("Game Over", f"Player {player} wins!") # 弹出获胜提示框
self.reset_board() # 重置棋盘
else:
self.current_player = (self.current_player + 1) % 2 # 切换到下一个玩家
def check_winner(self, player):
# 判断指定玩家是否获胜
# 需要检查行、列、对角线上是否有连续5颗相同的棋子
for i in range(self.board_size):
for j in range(self.board_size):
if self.board[i][j] == player:
# 检查四个方向是否存在连续5颗相同的棋子
if self.check_direction(i, j, 1, 0, player) or \
self.check_direction(i, j, 0, 1, player) or \
self.check_direction(i, j, 1, 1, player) or \
self.check_direction(i, j, 1, -1, player):
return True
return False
def check_direction(self, row, col, dr, dc, player):
# 检查指定方向上是否存在连续5颗相同的棋子
count = 0
while 0 <= row < self.board_size and 0 <= col < self.board_size and self.board[row][col] == player:
count += 1
row += dr
col += dc
return count >= 5
def reset_board(self):
# 重置棋盘状态,清空棋盘上的所有棋子
for row in range(self.board_size):
for col in range(self.board_size):
self.board[row][col] = '.'
self.buttons[row][col].config(text=' ')
if __name__ == "__main__":
app = FiveInARow()
app.mainloop()