python 小游戏:扫雷

目录

1. 前言

2. 准备工作

3. 生成雷区

4. 鼠标点击扫雷

5. 胜利 or 失败

6. 游戏效果展示

7. 完整代码


1. 前言

本文使用 Pygame 实现的简化版扫雷游戏。

如上图所示,游戏包括基本的扫雷功能:生成雷区左键点击扫雷右键标记地雷显示数字提示等。

2. 准备工作

首先,当然要下载pygame 库文件,可以通过下面命令下载

pip install pygame

在这之前,我们需要提前规划好前期工作,例如游戏窗口多大,生成图形显示的颜色等等。

这里为了方便,我们采用大多数默认的版本,这里生成的格子数量就是 (400 / 40)*(400/40),也就是100个窗格

import pygame
import random# 初始化 Pygame
pygame.init()# 屏幕设置
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400
CELL_SIZE = 40
GRID_WIDTH = SCREEN_WIDTH // CELL_SIZE
GRID_HEIGHT = SCREEN_HEIGHT // CELL_SIZE# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
RED = (255, 0, 0)
GREEN = (0, 255, 0)# 字体设置
font = pygame.font.SysFont("Arial", 20)

如下:

3. 生成雷区

有了窗口格子区域,接下来就可以生成雷区,这里采用random函数随机生成,保证每次打开游戏雷区的位置不一样

# 生成雷区
def create_grid(width, height, num_mines):grid = [[0 for _ in range(width)] for _ in range(height)]mines = set()while len(mines) < num_mines:x = random.randint(0, width - 1)y = random.randint(0, height - 1)mines.add((x, y))grid[y][x] = -1  # -1 表示地雷# 计算每个格子周围的地雷数量for y in range(height):for x in range(width):if grid[y][x] == -1:continuecount = 0for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:if 0 <= x + dx < width and 0 <= y + dy < height:if grid[y + dy][x + dx] == -1:count += 1grid[y][x] = countreturn grid, mines
  • 使用 create_grid 函数生成雷区,随机放置地雷,并计算每个格子周围的地雷数量。

 

4. 鼠标点击扫雷

生成雷区后,下面就是扫雷环节,之前写C语言扫雷,还需要在控制台键入区域。这里可以直接调用鼠标

# 绘制格子
def draw_grid():for y in range(GRID_HEIGHT):for x in range(GRID_WIDTH):rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)if revealed[y][x]:if grid[y][x] == -1:pygame.draw.rect(screen, RED, rect)  # 地雷else:pygame.draw.rect(screen, GRAY, rect)if grid[y][x] > 0:text = font.render(str(grid[y][x]), True, BLACK)screen.blit(text, (x * CELL_SIZE + 10, y * CELL_SIZE + 10))else:pygame.draw.rect(screen, WHITE, rect)if flagged[y][x]:pygame.draw.circle(screen, GREEN, rect.center, 10)  # 标记地雷pygame.draw.rect(screen, BLACK, rect, 1)  # 格子边框# 翻开格子
def reveal_cell(x, y):if 0 <= x < GRID_WIDTH and 0 <= y < GRID_HEIGHT and not revealed[y][x]:revealed[y][x] = Trueif grid[y][x] == 0:for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:reveal_cell(x + dx, y + dy)  # 递归翻开空白区域

5. 胜利 or 失败

胜利条件:所有非地雷格子都被翻开时,玩家胜利。

  • 游戏结束显示

    • 如果踩到地雷,显示 "Game Over!"。

    • 如果胜利,显示 "You Win!"。

# 检查是否胜利
def check_win():for y in range(GRID_HEIGHT):for x in range(GRID_WIDTH):if grid[y][x] != -1 and not revealed[y][x]:return Falsereturn True

6. 游戏效果展示

失败:

胜利: 

7. 完整代码

直接复制到py脚本运行即可:

import pygame
import random# 初始化 Pygame
pygame.init()# 屏幕设置
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400
CELL_SIZE = 40
GRID_WIDTH = SCREEN_WIDTH // CELL_SIZE
GRID_HEIGHT = SCREEN_HEIGHT // CELL_SIZE# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
RED = (255, 0, 0)
GREEN = (0, 255, 0)# 字体设置
font = pygame.font.SysFont("Arial", 20)# 初始化屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Minesweeper")# 游戏状态
game_over = False
win = False# 生成雷区
def create_grid(width, height, num_mines):grid = [[0 for _ in range(width)] for _ in range(height)]mines = set()while len(mines) < num_mines:x = random.randint(0, width - 1)y = random.randint(0, height - 1)mines.add((x, y))grid[y][x] = -1  # -1 表示地雷# 计算每个格子周围的地雷数量for y in range(height):for x in range(width):if grid[y][x] == -1:continuecount = 0for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:if 0 <= x + dx < width and 0 <= y + dy < height:if grid[y + dy][x + dx] == -1:count += 1grid[y][x] = countreturn grid, mines# 初始化雷区
grid, mines = create_grid(GRID_WIDTH, GRID_HEIGHT, 10)# 记录翻开的格子和标记的地雷
revealed = [[False for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]
flagged = [[False for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]# 绘制格子
def draw_grid():for y in range(GRID_HEIGHT):for x in range(GRID_WIDTH):rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)if revealed[y][x]:if grid[y][x] == -1:pygame.draw.rect(screen, RED, rect)  # 地雷else:pygame.draw.rect(screen, GRAY, rect)if grid[y][x] > 0:text = font.render(str(grid[y][x]), True, BLACK)screen.blit(text, (x * CELL_SIZE + 10, y * CELL_SIZE + 10))else:pygame.draw.rect(screen, WHITE, rect)if flagged[y][x]:pygame.draw.circle(screen, GREEN, rect.center, 10)  # 标记地雷pygame.draw.rect(screen, BLACK, rect, 1)  # 格子边框# 翻开格子
def reveal_cell(x, y):if 0 <= x < GRID_WIDTH and 0 <= y < GRID_HEIGHT and not revealed[y][x]:revealed[y][x] = Trueif grid[y][x] == 0:for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:reveal_cell(x + dx, y + dy)  # 递归翻开空白区域# 检查是否胜利
def check_win():for y in range(GRID_HEIGHT):for x in range(GRID_WIDTH):if grid[y][x] != -1 and not revealed[y][x]:return Falsereturn True# 游戏主循环
clock = pygame.time.Clock()
running = Truewhile running:screen.fill(WHITE)# 事件处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif not game_over and not win:if event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posgrid_x = x // CELL_SIZEgrid_y = y // CELL_SIZEif event.button == 1:  # 左键翻开格子if grid[grid_y][grid_x] == -1:game_over = True  # 踩到地雷else:reveal_cell(grid_x, grid_y)if check_win():win = Trueelif event.button == 3:  # 右键标记地雷if not revealed[grid_y][grid_x]:flagged[grid_y][grid_x] = not flagged[grid_y][grid_x]# 绘制雷区draw_grid()# 游戏结束显示if game_over:text = font.render("Game Over!", True, RED)screen.blit(text, (SCREEN_WIDTH // 2 - 60, SCREEN_HEIGHT // 2 - 10))if win:text = font.render("You Win!", True, GREEN)screen.blit(text, (SCREEN_WIDTH // 2 - 50, SCREEN_HEIGHT // 2 - 10))# 更新屏幕pygame.display.flip()clock.tick(30)# 退出游戏
pygame.quit()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12283.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全策略实验报告

1.实验拓扑图 2.实验需求 vlan2属于办公区&#xff0c;vlan3生产区 办公区pc在工作日时间可以正常访问OAserver&#xff0c;i其他时间不允许 办公区pc可以在任意时间访问Web server 生产区pc可以在任意时间访问OA server但不能访问web server 特例&#xff1a;生产区pc可以…

力扣73矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[…

蓝桥杯C语言组:暴力破解

基于C语言的暴力破解方法详解 暴力破解是一种通过穷举所有可能的解来找到正确答案的算法思想。在C语言中&#xff0c;暴力破解通常用于解决那些问题规模较小、解的范围有限的问题。虽然暴力破解的效率通常较低&#xff0c;但它是一种简单直接的方法&#xff0c;适用于一些简单…

【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用

文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页&#xff1a;道友老…

介绍一下Mybatis的Executor执行器

Executor执行器是用来执行我们的具体的SQL操作的 有三种基本的Executor执行器&#xff1a; SimpleExecutor简单执行器 每执行一次update或select&#xff0c;就创建一个Statement对象&#xff0c;用完立刻关闭Statement对象 ReuseExecutor可重用执行器 可重复利用Statement…

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;1.登录-持久层 &…

VSCode设置内容字体大小

1、打开VSCode软件&#xff0c;点击左下角的“图标”&#xff0c;选择“Setting”。 在命令面板中的Font Size处选择适合自己的字体大小。 2、对比Font Size值为14与20下的字体大小。

企业商业秘密百问百答之三十八【商务保密协议签订】

《企业商业秘密百问百答》是由天禾律所陈军律师团队精心编撰的成果&#xff0c;汇集了该团队律师在处理商业秘密相关的刑事和民事案件中的丰富经验。近年来&#xff0c;这份资料已通过线上和线下的方式向全国近千家企业进行了广泛宣讲&#xff0c;并获得了积极的社会反响。 其…

C++11中的bind

官方文档对于bind接口的概述解释&#xff1a;Bind function arguments 在C11中&#xff0c;std::bind 是一个非常有用的工具&#xff0c;用于将函数、成员函数或函数对象与特定的参数绑定在一起&#xff0c;生成一个新的可调用对象。std::bind 可以用于部分应用函数参数、改变…

Qt网络相关

“ 所有生而孤独的人&#xff0c;葆有的天真 ” 为了⽀持跨平台, QT对⽹络编程的 API 也进⾏了重新封装。本章会上手一套基于QT的网络通信编写。 UDP Socket 在使用Qt进行网络编程前&#xff0c;需要在Qt项目中的.pro文件里添加对应的网络模块( network ). QT core gui net…

会计学基础

【拯救者】会计学基础速成&#xff08;期末 复试 升本均可用&#xff09; ©无忌教育 重点: 适用课本: 会计基础 会计基础是指会计工作的基本原则和方法&#xff0c;它努力为会计核算提供一个共同的基础&#xff0c;以便各种组织在会计核算上得到一致的结果。会计基础主要…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化&#xff1a; 信任是我们最宝贵的资产。而现在&#xff0c;它正像黑色星期五促销的廉价平板电视一样&#xff0c;被一点点拆解。在过去&#xff0c;世界很简单&#xff1a;人们相信晚间新闻、那些满是灰尘书籍的教授&#xff0c;或者手持病历、眉头紧锁的医生。而如…

《DeepSeek R1:7b 写一个python程序调用摄像头获取视频并显示》

C:\Users\Administrator>ollama run deepseek-r1:7b hello Hello! How can I assist you today? &#x1f60a; 写一个python程序调用摄像头获取视频并显示 好&#xff0c;我需要帮用户写一个Python程序&#xff0c;它能够使用摄像头获取视频&#xff0c;并在屏幕上显示出…

Linux网络 | 进入数据链路层,学习相关协议与概念

前言&#xff1a;本节内容进入博主讲解的网络层级中的最后一层&#xff1a;数据链路层。 首先博主还是会线代友友们认识一下数据链路层的报文。 然后会带大家重新理解一些概念&#xff0c;比如局域网交换机等等。然后就是ARP协议。 讲完这些&#xff0c; 本节任务就算结束。 那…

Python 科学计算

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

18.[前端开发]Day18-王者荣耀项目实战(一)

01-06 项目实战 1 代码规范 2 CSS编写顺序 3 组件化开发思想 组件化开发思路 项目整体思路 – 各个击破 07_(掌握)王者荣耀-top-整体布局完成 完整代码 01_page_top1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

Java 大视界 -- Java 大数据在智能医疗影像诊断中的应用(72)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…

知识管理平台在提升组织智慧与执行力方面的关键作用探讨

内容概要 知识管理平台是现代组织在日益激烈的竞争环境中提升自身智慧和执行力的重要工具。其基本概念在于通过系统化的方式收集、整理和共享知识资源&#xff0c;确保组织内部的信息流畅和决策信息的及时性。这不仅强化了团队成员之间的沟通与协作&#xff0c;还促进了对复杂…

STM32F103ZET6完整技术点(持续更新~)

①STM32②F③103④Z⑤E⑥T⑦6简介&#xff1a; ①基于ARM核心的32位微控制器&#xff0c;②通用类型&#xff0c;③增强型&#xff0c;④引脚数目144个 ⑤闪存存储器容量&#xff1a;512K字节&#xff0c;⑥封装:LQFP&#xff0c;⑦温度范围&#xff1a;工业级温度范围&#xf…