基于python pyqt的围棋游戏制作

您所在的位置:网站首页 围棋盘摆图案图片 基于python pyqt的围棋游戏制作

基于python pyqt的围棋游戏制作

2024-06-03 20:53| 来源: 网络整理| 查看: 265

文章目录 1、初始化棋盘2、初始化棋子3、开始游戏4、落子设置5、吃子判断6 悔棋和弃一子7 重新开始、推出与切换棋盘8 显示9 初始化 本文使用python中的pygame库设计制作了一个围棋游戏。 参考项目资料: https://github.com/HapHac/weiqi

1、初始化棋盘 # 绘制棋盘 def draw_chessboard(self): # 画棋盘,填充颜色 pygame.draw.rect(self.screen, (204, 85, 17), [0 * self.size, 0 * self.size, 400 * self.size, 400 * self.size]) pygame.draw.rect(self.screen, (51, 102, 153), [400 * self.size, 0 * self.size, 200 * self.size, 400 * self.size]) # 画外框 outer_frame_color = (60, 20, 0) pygame.draw.rect(self.screen, outer_frame_color, [20 * self.size, 20 * self.size, 360 * self.size, 360 * self.size], 5) # 棋盘上的九个定位点,以中点为模型,移动位置,以作出其余八个点 for m in [-1, 0, 1]: for n in [-1, 0, 1]: rect = pygame.Rect([200 * self.size - self.size * 2, 200 * self.size - self.size * 2, self.size * 4, self.size * 4]) pygame.draw.ellipse(self.screen, (0, 0, 0), rect, width=0) rect = rect.move(m * self.interval * (2 if self.mode_num == 9 else (3 if self.mode_num == 13 else 6)), n * self.interval * (2 if self.mode_num == 9 else (3 if self.mode_num == 13 else 6))) pygame.draw.ellipse(self.screen, (0, 0, 0), rect, width=0) # 画中间的线条 for i in range(1, self.mode_num - 1): pygame.draw.line(self.screen, (0, 0, 0), (20 * self.size, 20 * self.size + i * self.interval), (380 * self.size, 20 * self.size + i * self.interval), width=2) pygame.draw.line(self.screen, (0, 0, 0), (20 * self.size + i * self.interval, 20 * self.size), (20 * self.size + i * self.interval, 380 * self.size), width=2) # 放置右侧初始图片 if self.stop: self.screen.blit(self.photoW, (480 * self.size, 65 * self.size)) self.screen.blit(self.photoB, (480 * self.size - 45, 65 * self.size)) elif self.present == 1: self.screen.blit(self.photoB, (480 * self.size - 45, 65 * self.size)) else: self.screen.blit(self.photoW, (480 * self.size, 65 * self.size)) # # 几个功能按钮 button_color = (255, 255, 255) self.start_button = Button('开始游戏', button_color, 'msyh.ttc', 23) self.start_button.draw(self.screen, 480 * self.size, 200 * self.size) self.pass_me_button = Button('弃一子', button_color, 'msyh.ttc', 23) self.pass_me_button.draw(self.screen, 480 * self.size, 225 * self.size) self.regert_button = Button('悔棋', button_color, 'msyh.ttc', 23) self.regert_button.draw(self.screen, 480 * self.size, 250 * self.size) self.restsrt_button = Button('重新开始', button_color, 'msyh.ttc', 23) self.restsrt_button.draw(self.screen, 480 * self.size, 275 * self.size) self.thirteen_way_button = Button('十三路棋', button_color, 'msyh.ttc', 23) self.thirteen_way_button.draw(self.screen, 480 * self.size, 300 * self.size) self.nineteenth_way_button = Button('十九路棋', button_color, 'msyh.ttc', 23) self.nineteenth_way_button.draw(self.screen, 480 * self.size, 325 * self.size) self.exit_button = Button('退出游戏', button_color, 'msyh.ttc', 23) self.exit_button.draw(self.screen, 480 * self.size, 350 * self.size)

在上述代码中,首先绘制棋盘的框架,使用pygame中的pygame.draw.rect,然后通过pygame.draw.line绘制线条,形成完整的棋盘。除此之外,在棋盘的一旁,添加了一个太极图用以表示当前的棋手,以及一些按钮用于控制游戏的进程(按钮使用自定义类完成)。

class Text: def __init__(self, text: str, text_color, font_type: str, font_size: int): """ text: 文本内容,注意是字符串形式 text_color: 字体颜色 font_type: 字体文件 font_size: 字体大小 """ self.text = text self.text_color = text_color self.font_type = font_type self.font_size = font_size font = pygame.font.Font(os.path.join('font', (self.font_type)), self.font_size) self.text_image = font.render(self.text, True, self.text_color).convert_alpha() self.text_width = self.text_image.get_width() self.text_height = self.text_image.get_height() def draw(self, surface: pygame.Surface, center_x, center_y): """ surface: 文本放置的表面 center_x, center_y: 文本放置在表面的 """ upperleft_x = center_x - self.text_width / 2 upperleft_y = center_y - self.text_height / 2 surface.blit(self.text_image, (upperleft_x, upperleft_y)) class Button(Text): def __init__(self, text: str, text_color, font_type: str, font_size: int): super().__init__(text, text_color, font_type, font_size) self.rect = self.text_image.get_rect() self.enable = True def draw(self, surface: pygame.Surface, center_x, center_y): super().draw(surface, center_x, center_y) self.rect.center = center_x, center_y def handle_event(self, command): self.hovered = self.rect.collidepoint(pygame.mouse.get_pos()) if self.hovered: if self.enable: command() else: pass 2、初始化棋子 # 绘制棋子 def draw_chess(self): # 遍历棋盘二维数组,绘制出棋盘中所有已下子 for i in range(self.mode_num): for j in range(self.mode_num): pos = i * self.interval + 20 * self.size - 30 * self.p, j * self.interval + 20 * self.size - 30 * self.p if self.positions[i][j] == 0: continue elif self.positions[i][j] == 1: self.screen.blit(self.photoBD, pos) elif self.positions[i][j] == -1: self.screen.blit(self.photoWD, pos)

定义一个数组:self.positions用以存储棋盘中棋子的状态。

3、开始游戏

点击开始游戏按钮,正式开始游戏,删除白色太极图,表示黑棋先行。

# 开始游戏函数,点击“开始游戏”时调用 def start(self): # 删除右侧太极图 self.screen.blit(self.bg_rect, (400 * self.size, 65 * self.size)) # 利用右侧图案提示开始时谁先落子 if self.present == 1: self.screen.blit(self.photoB, (480 * self.size - 45, 65 * self.size)) else: self.screen.blit(self.photoW, (480 * self.size, 65 * self.size)) # 开始标志,解除stop self.stop = None 4、落子设置

首先定义一个函数,用以获取当前鼠标的位置。

# 获取鼠标当前位置 def get_mouse_current_position(self, x, y): self.mouse_x = x self.mouse_y = y

然后设置棋子跟随鼠标移动。

# 棋子跟随鼠标移动 def chess_follow(self): if 20 * self.size


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3