用python实现一个带图形界面的五子棋游戏,棋盘大小可自定义

要用Python实现一个带图形用户界面的可自定义棋盘大小的五子棋游戏,可以使用 tkinter 库。下面是一个完整的代码示例,实现了带图形用户界面的五子棋游戏。

import tkinter as tk
from tkinter import simpledialog, messagebox

class Gomoku:
    def __init__(self, root, size=20):
        self.size = size
        self.board = [['.' for _ in range(size)] for _ in range(size)]
        self.current_player = 'X'
        self.root = root
        self.canvas = tk.Canvas(root, width=30*size, height=30*size)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.click)
        self.draw_board()
        self.root.title("五子棋")

    def draw_board(self):
        self.canvas.delete("all")
        for i in range(self.size):
            for j in range(self.size):
                x0, y0 = i * 30, j * 30
                x1, y1 = x0 + 30, y0 + 30
                self.canvas.create_rectangle(x0, y0, x1, y1, outline="black")
                if self.board[i][j] != '.':
                    self.canvas.create_text(x0 + 15, y0 + 15, text=self.board[i][j], font=("Arial", 20))

    def is_valid_move(self, x, y):
        return 0 <= x < self.size and 0 <= y < self.size and self.board[x][y] == '.'

    def place_stone(self, x, y):
        if self.is_valid_move(x, y):
            self.board[x][y] = self.current_player
            return True
        return False

    def check_winner(self, x, y):
        def count_stones(dx, dy):
            count = 0
            nx, ny = x + dx, y + dy
            while 0 <= nx < self.size and 0 <= ny < self.size and self.board[nx][ny] == self.current_player:
                count += 1
                nx += dx
                ny += dy
            return count

        directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
        for dx, dy in directions:
            if count_stones(dx, dy) + count_stones(-dx, -dy) + 1 >= 5:
                return True
        return False

    def switch_player(self):
        self.current_player = 'O' if self.current_player == 'X' else 'X'

    def click(self, event):
        x, y = event.x // 30, event.y // 30
        if self.place_stone(x, y):
            self.draw_board()
            if self.check_winner(x, y):
                messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 获胜!")
                self.reset()
            else:
                self.switch_player()

    def reset(self):
        self.board = [['.' for _ in range(self.size)] for _ in range(self.size)]
        self.current_player = 'X'
        self.draw_board()

if __name__ == "__main__":
    root = tk.Tk()
    size = simpledialog.askinteger("棋盘大小", "请输入棋盘大小(如20):", minvalue=5, maxvalue=50)
    if size:
        game = Gomoku(root, size)
        root.mainloop()

说明
初始化棋盘:

init 方法初始化棋盘和当前玩家。
使用 tk.Canvas 创建绘制棋盘的画布,并绑定鼠标点击事件。

绘制棋盘:
draw_board 方法绘制棋盘和棋子。
使用 create_rectangle 和 create_text 方法在画布上绘制格子和棋子。

有效移动检查:
is_valid_move 方法检查在给定坐标是否可以放置棋子。

放置棋子:
place_stone 方法在给定坐标放置当前玩家的棋子。

胜利检查:
check_winner 方法检查当前玩家是否在给定坐标获胜。通过在四个方向(水平、垂直、两条对角线)上计数连续的棋子数来判断是否满足五子连珠的条件。

玩家切换:
switch_player 方法在两个玩家之间切换。

鼠标点击事件处理:
click 方法处理鼠标点击事件,计算点击位置的坐标,并调用 place_stone 和 check_winner 方法更新棋盘状态和检查胜利条件。

游戏重置:
reset 方法重置游戏状态,清空棋盘。

主程序:
使用 tk.Tk 创建主窗口。

使用 simpledialog.askinteger 提示用户输入棋盘大小。

实例化 Gomoku 类并启动主循环。

运行这个代码,你将获得一个带图形用户界面的五子棋游戏,棋盘大小可由用户输入自定义。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来写一个五子棋游戏的代码,难度中等,采用字符界面,使用Python语言实现。 首先,我们需要定义一个棋盘,使用一个二维列表来表示: ```python board = [['+' for i in range(15)] for j in range(15)] ``` 其中,'+'表示空位,'O'表示玩家棋子,'X'表示电脑棋子。 接着,我们需要定义一个函数来打印出棋盘: ```python def print_board(board): print(' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15') for i in range(15): print(chr(i + ord('A')), end=' ') for j in range(15): print(board[i][j], end=' ') print() ``` 这个函数会输出一个15x15的棋盘,每个位置都有一个坐标。 接下来,我们需要定义一个判断胜负的函数,这里采用的是枚举所有五个棋子连成一线的情况,判断是否有五个相同的棋子连成一线: ```python def check_win(board, row, col): directions = [(0, 1), (1, 0), (1, 1), (1, -1)] for d in directions: count = 1 for i in range(1, 5): r = row + i * d[0] c = col + i * d[1] if r < 0 or r >= 15 or c < 0 or c >= 15 or board[r][c] != board[row][col]: break count += 1 for i in range(1, 5): r = row - i * d[0] c = col - i * d[1] if r < 0 or r >= 15 or c < 0 or c >= 15 or board[r][c] != board[row][col]: break count += 1 if count >= 5: return True return False ``` 其中,directions表示四个方向,分别为横向、纵向、正斜线、反斜线。 接着,我们需要定义一个函数来判断是否下满了棋子: ```python def check_full(board): for i in range(15): for j in range(15): if board[i][j] == '+': return False return True ``` 最后,我们需要编写游戏主体代码,实现人机对战: ```python import random def game(): board = [['+' for i in range(15)] for j in range(15)] player = 'O' computer = 'X' while True: print_board(board) if player == 'O': move = input('请落子,例如 A1:') row = ord(move[0]) - ord('A') col = int(move[1:]) - 1 if row < 0 or row >= 15 or col < 0 or col >= 15 or board[row][col] != '+': print('落子无效,请重新输入。') continue board[row][col] = player if check_win(board, row, col): print_board(board) print('恭喜,你获得胜利!') break if check_full(board): print_board(board) print('平局!') break player, computer = computer, player else: row, col = random.randint(0, 14), random.randint(0, 14) while board[row][col] != '+': row, col = random.randint(0, 14), random.randint(0, 14) board[row][col] = computer if check_win(board, row, col): print_board(board) print('很遗憾,你失败了。') break if check_full(board): print_board(board) print('平局!') break player, computer = computer, player game() ``` 这个代码中,我们使用了一个while循环来不断交替落子,直到游戏结束。其中,player表示玩家,computer表示电脑,每次交替落子后,都要检查是否有一方获胜或者平局。如果是玩家落子,就需要等待玩家输入坐标,如果是电脑落子,则随机生成一个坐标。 这就是一个基于字符界面的五子棋游戏,难度中等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值