五子棋小游戏-简单开发版

news/2025/3/17 10:05:01/

一、需求分析

开发一个基于 Pygame 库的五子棋小游戏,允许两名玩家在棋盘上轮流落子,当有一方达成五子连珠时游戏结束,显示获胜信息,并提供退出游戏和重新开始游戏的操作选项。

1.棋盘显示 :

        显示一个 15x15 的五子棋棋盘,棋盘背景为木头淡黄色,网格线为黑色。

2.落子操作 :

        玩家通过鼠标点击棋盘上的交叉点来落子,黑子和白子轮流交替落子。

        只有在空的交叉点上才能落子。

3.胜负判断 :

        每次落子后,检查是否有五子连珠的情况(横向、纵向、正斜向、反斜向)。

        如果有一方达成五子连珠,则判定该方获胜。

4.游戏结束处理 :

        游戏结束时,在屏幕中央显示获胜信息(如“Player 1 Win!” 或 “Player 2 Win!”)。

        同时显示操作提示,告知玩家可以按 “Q” 键退出游戏,按 “N” 键重新开始游戏。

        显示一个半透明的黑色提示框,将获胜信息和操作提示包含在内。

5.重新开始和退出 :

        游戏结束后,玩家可以按 “Q” 键退出游戏,按 “N” 键重新开始游戏。

        重新开始游戏时,清空棋盘,重置当前玩家为黑子先手。

二、关键模块

1. 常量定义

        定义游戏中使用的各种常量,如棋盘大小、网格大小、窗口尺寸、颜色、字体等。

2. 初始化

        初始化 Pygame 库。

        创建游戏窗口。

        初始化棋盘状态。

3. 绘制模块

        绘制棋盘:使用木头淡黄色填充屏幕,并绘制黑色的网格线。

        绘制棋子:根据棋盘状态,在相应位置绘制黑子和白子。

4. 胜负判断

        检查当前落子位置是否形成五子连珠,分别从横向、纵向、正斜向、反斜向四个方向进行检查。

5. 游戏控制

        处理鼠标点击事件,实现落子操作。

        处理键盘事件,实现退出游戏和重新开始游戏的功能。

        控制游戏的主循环,更新游戏状态。 6. 提示信息显示模块

        在游戏结束时,显示获胜信息和操作提示,并绘制半透明的提示框。

三、完整代码

python">import pygame
import sys# 初始化 Pygame
pygame.init()# 定义常量
BOARD_SIZE = 15
GRID_SIZE = 40
WINDOW_WIDTH = GRID_SIZE * (BOARD_SIZE + 1)
WINDOW_HEIGHT = GRID_SIZE * (BOARD_SIZE + 1)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# 定义木头淡黄色
WOOD_COLOR = (205, 133, 63) 
BLUE = (0, 0, 255)
FONT = pygame.font.Font(None, 36)  # 创建游戏窗口
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("五子棋小游戏")# 初始化棋盘
board = [[0] * BOARD_SIZE for _ in range(BOARD_SIZE)]# 绘制棋盘
def draw_board():# 使用木头淡黄色填充屏幕screen.fill(WOOD_COLOR)  for i in range(BOARD_SIZE):pygame.draw.line(screen, BLACK, (GRID_SIZE, GRID_SIZE * (i + 1)), (GRID_SIZE * BOARD_SIZE, GRID_SIZE * (i + 1)), 2)pygame.draw.line(screen, BLACK, (GRID_SIZE * (i + 1), GRID_SIZE), (GRID_SIZE * (i + 1), GRID_SIZE * BOARD_SIZE), 2)# 绘制棋子
def draw_pieces():for i in range(BOARD_SIZE):for j in range(BOARD_SIZE):if board[i][j] == 1:pygame.draw.circle(screen, BLACK, (GRID_SIZE * (j + 1), GRID_SIZE * (i + 1)), 18)elif board[i][j] == 2:pygame.draw.circle(screen, WHITE, (GRID_SIZE * (j + 1), GRID_SIZE * (i + 1)), 18)# 检查是否有五子连珠
def check_win(x, y, player):directions = [(1, 0), (0, 1), (1, 1), (1, -1)]for dx, dy in directions:count = 1# 正向检查for i in range(1, 5):new_x = x + i * dxnew_y = y + i * dyif 0 <= new_x < BOARD_SIZE and 0 <= new_y < BOARD_SIZE and board[new_x][new_y] == player:count += 1else:break# 反向检查for i in range(1, 5):new_x = x - i * dxnew_y = y - i * dyif 0 <= new_x < BOARD_SIZE and 0 <= new_y < BOARD_SIZE and board[new_x][new_y] == player:count += 1else:breakif count >= 5:return Truereturn False# 重置游戏状态
def reset_game():global board, current_player, game_overboard = [[0] * BOARD_SIZE for _ in range(BOARD_SIZE)]current_player = 1game_over = False# 显示获胜信息和操作提示
def show_winner_info(player):winner_text = FONT.render(f"Player {player} Win!", True, WHITE)prompt_text = FONT.render("Press Q to Quit, Press N to Restart", True, WHITE)# 创建半透明的矩形框winner_rect = winner_text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 - 30))prompt_rect = prompt_text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 + 30))# 调整内边距以确保提示框足够大padding = 30combined_width = max(winner_rect.width, prompt_rect.width) + 2 * paddingcombined_height = winner_rect.height + prompt_rect.height + 3 * paddingrect = pygame.Rect(winner_rect.x - padding, winner_rect.y - padding, combined_width, combined_height)rect.center = (WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)# 创建一个带有透明度的表面surface = pygame.Surface((rect.width, rect.height), pygame.SRCALPHA)surface.fill((0, 0, 0, 128))  # 半透明黑色screen.blit(surface, (rect.x, rect.y))screen.blit(winner_text, (rect.centerx - winner_rect.width // 2, rect.centery - winner_rect.height - padding // 2))screen.blit(prompt_text, (rect.centerx - prompt_rect.width // 2, rect.centery + padding // 2))pygame.display.flip()# 主游戏循环
current_player = 1
game_over = False
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:x, y = event.poscol = (x - GRID_SIZE // 2) // GRID_SIZErow = (y - GRID_SIZE // 2) // GRID_SIZEif 0 <= col < BOARD_SIZE and 0 <= row < BOARD_SIZE and board[row][col] == 0:board[row][col] = current_playerif check_win(row, col, current_player):print(f"Player {current_player} Win!")# 先显示最后一个子draw_board()draw_pieces()pygame.display.flip()# 显示获胜信息和操作提示show_winner_info(current_player)game_over = True# 进入等待状态,直到用户按下 Q 或者 N 键while game_over:for inner_event in pygame.event.get():if inner_event.type == pygame.QUIT:pygame.quit()sys.exit()elif inner_event.type == pygame.KEYDOWN:if inner_event.key == pygame.K_q:pygame.quit()sys.exit()elif inner_event.key == pygame.K_n:reset_game()game_over = Falsecurrent_player = 3 - current_player  # 切换玩家elif event.type == pygame.KEYDOWN:if event.key == pygame.K_q:pygame.quit()sys.exit()elif event.key == pygame.K_n:reset_game()if not game_over:draw_board()draw_pieces()pygame.display.flip()

四、代码运行方式

1.代码运行环境

        Python 3.x

        Pygame 库

python">pip install pygame

2.运行代码

        将上述代码保存为 gobang_game.py 文件,然后在终端中运行以下命令:

python">python gobang_game.py

3.游戏操作说明

        游戏开始后,黑子先手,玩家通过鼠标点击棋盘上的交叉点落子。
        当有一方达成五子连珠时,游戏结束,屏幕中央会显示获胜信息和操作提示。
        按 “Q” 键退出游戏,按 “N” 键重新开始游戏。

4.游戏画面


http://www.ppmy.cn/news/1579782.html

相关文章

C语言动态内存管理(上)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;C语言动态内存管理(上) 发布时间&#xff1a;2025.3.16 隶属专栏&#xff1a;C语言 目录 为什么需要动态内存管理静态分配的局限性动态分配的优势 动态内存函数malloc函数介绍函数使用 free函数介绍函数使用 calloc…

基于SSM+Vue+uniapp的科创微应用(可改为研学)小程序+LW示例

1.项目介绍 系统角色&#xff1a;管理员、企业、普通用户功能模块&#xff1a;用户管理、企业管理、场地管理、场地类型管理、预约参观管理、场地预约管理、活动信息管理、报名信息管理、试题管理、试卷管理等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&…

理解光场模型:uv与st的结合

在计算机图形学和计算机视觉领域&#xff0c;光场模型是一种强大的技术&#xff0c;它允许我们捕捉和呈现复杂的三维场景&#xff0c;以更真实的方式表达光的传播和交互。本文将探讨光场模型的基本概念&#xff0c;并深入分析其中两个关键平面——uv平面和st平面&#xff0c;它…

linux 下消息队列

文章目录 &#x1f4e8; Linux System V 消息队列实战一、消息队列核心概念 &#x1f4a1;1. 消息队列特点 &#x1f31f;2. 生命周期 &#x1f504; 二、项目概述三、完整代码实现1. 公共头文件 common.hpp2. 发送端 sender.cpp3. 接收端 receiver.cpp 三、编译与运行指南1. 编…

初探 Threejs 物理引擎CANNON,解锁 3D 动态魅力

简介 Cannon.js 是一个基于 JavaScript 的物理引擎&#xff0c;它可以在浏览器中模拟物理效果。它支持碰撞检测、刚体动力学、约束等物理效果&#xff0c;可以用于创建逼真的物理场景和交互。 参考文档 官方示例 原理 Cannon.js 使用了欧拉角来表示物体的旋转&#xff0c;…

【误差理论与可靠性工程】可靠性工程基本理论

可靠性工程是一种工程学科&#xff0c;主要涉及如何对产品和系统的可靠性进行评估、设计和管理等。可靠性工程的基本理论包括可靠性的定义、可靠性的特征、可靠性的评估方法、可靠性的设计原则和可靠性预测方法等。 1. 可靠性的定义 可靠性是指产品或系统在规定条件下保持正常…

1.5.3 掌握Scala内建控制结构 - for循环

Scala的for循环功能强大&#xff0c;支持单重和嵌套循环。单重for循环语法为for (变量 <- 集合或数组 (条件)) {语句组}&#xff0c;可选筛选条件&#xff0c;循环变量依次取集合值。支持多种任务&#xff0c;如输出指定范围整数&#xff08;使用Range、to、until&#xff0…

DeepSeek:技术教育领域的AI变革者——从理论到实践的全面解析

一、技术教育为何需要DeepSeek&#xff1f; 在数字化转型的浪潮下&#xff0c;技术教育面临着知识更新快、实践门槛高、个性化需求强三大核心挑战。传统的教学模式难以满足开发者快速掌握前沿技术、构建复杂系统能力的需求。DeepSeek作为国产开源大模型的代表&#xff0c;凭借…