You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import tkinter as tk
from tkinter import messagebox
class Gobang:
def __init__(self):
self.window = tk.Tk()
self.window.title("五子棋")
self.window.geometry("660x700")
self.canvas = tk.Canvas(self.window, bg="#CDBA96", width=660, height=660)
self.canvas.pack()
self.restart_btn = tk.Button(self.window, text="重新开始", command=self.restart)
self.restart_btn.pack()
# 游戏参数
self.grid_size = 30 # 网格间距
self.offset = 30 # 棋盘边距
self.board_size = 15 # 棋盘尺寸15x15
self.piece_size = 13 # 棋子半径
# 初始化棋盘
self.board = [[0] * self.board_size for _ in range(self.board_size)]
self.current_player = 1 # 当前玩家1: 黑棋2: 白棋)
self.game_over = False
self.draw_board()
self.canvas.bind("<Button-1>", self.click_handler)
def draw_board(self):
# 绘制棋盘网格
for i in range(self.board_size):
x_start = self.offset + i * self.grid_size
y_start = self.offset
x_end = self.offset + i * self.grid_size
y_end = self.offset + (self.board_size - 1) * self.grid_size
self.canvas.create_line(x_start, y_start, x_end, y_end)
self.canvas.create_line(y_start, x_start, y_end, x_end)
def draw_piece(self, row, col):
# 绘制棋子
x = self.offset + col * self.grid_size
y = self.offset + row * self.grid_size
color = "black" if self.current_player == 1 else "white"
self.canvas.create_oval(x - self.piece_size, y - self.piece_size,
x + self.piece_size, y + self.piece_size,
fill=color, outline=color)
def click_handler(self, event):
if self.game_over:
return
# 计算点击位置对应的棋盘坐标
col = round((event.x - self.offset) / self.grid_size)
row = round((event.y - self.offset) / self.grid_size)
if 0 <= row < self.board_size and 0 <= col < self.board_size:
if self.board[row][col] == 0:
self.board[row][col] = self.current_player
self.draw_piece(row, col)
if self.check_win(row, col):
self.show_winner()
else:
self.current_player = 2 if self.current_player == 1 else 1
def check_win(self, row, col):
# 检查四个方向是否五连
directions = [(1, 0), (0, 1), (1, 1), (1, -1)] # 水平,垂直,对角线
for dr, dc in directions:
count = 1
# 正向检查
r, c = row + dr, col + dc
while 0 <= r < self.board_size and 0 <= c < self.board_size:
if self.board[r][c] == self.current_player:
count += 1
r += dr
c += dc
else:
break
# 反向检查
r, c = row - dr, col - dc
while 0 <= r < self.board_size and 0 <= c < self.board_size:
if self.board[r][c] == self.current_player:
count += 1
r -= dr
c -= dc
else:
break
if count >= 5:
return True
return False
def show_winner(self):
self.game_over = True
winner = "黑方" if self.current_player == 1 else "白方"
messagebox.showinfo("游戏结束", f"{winner}获胜!")
def restart(self):
self.canvas.delete("all")
self.board = [[0] * self.board_size for _ in range(self.board_size)]
self.current_player = 1
self.game_over = False
self.draw_board()
def run(self):
self.window.mainloop()
if __name__ == "__main__":
game = Gobang()
game.run()