当前位置: 首页 > news >正文

pygame8 扫雷游戏

一、游戏规则:

1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利

2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷

二、游戏主逻辑:

主要逻辑即调用run_game, 然后循环检测事件和更新屏幕

检测事件逻辑主要分两种,一种为是否退出,另一种是否有鼠标点击

更新屏幕主要分三部分,首先是刷白屏幕,然后是画出覆盖物,最后是将缓存更新到屏幕

至此游戏的主要逻辑就完成了

三、游戏细节

根据此主要逻辑我们可以设计一个游戏类Game,定义三个函数,

run_game()

_event_check()

_update_screen()

分别对应为运行游戏主逻辑,事件检测,更新屏幕

现在我们来看一下所谓的覆盖物是一个什么东西:

从图上可以看出是一个20*20的方格列表,我们可以定义一个类Cover 将关于怎样画这些小方格包在里面,

看起来是需要设计一个列表,其长度是20,宽度也是20,每一个方格都是一个25像素的正方形,画的时候可以用一个循环,将列表中的方格依次用draw.rect画出来

for cur in self.covers:pygame.draw.rect(self.screen, self.setting.cover_color, [cur[0] * 25, cur[1] * 25, 24, 24])

这儿注意的是方格是宽高都为25,但真正画的时候宽高应该少一个像素,原因是画满的话格子边界就会混在一起,看不出来了

self.covers在一开始需要定义:

    def __init__(self, setting, screen):  # 游戏参数设置和游戏主界面self.setting = settingself.screen = screenself.covers = []  # 存储未被点击过的方块的覆盖物的位置for i in range(20):for j in range(20):self.covers.append([i, j])  # 刚开始时整个界面都是被覆盖的

主程序的实现代码非常简单:

if __name__ == '__main__':my_game = Game()my_game.run_game()

Game的定义主要是为了实现前面定义的三个函数,初始化时需要将covers也一并引入:


class Game:def __init__(self):pygame.init()self.setting = setting()self.screen = pygame.display.set_mode(self.setting.screen_size)self.covers = Cover(self.setting, self.screen)  # 表面覆盖物def run_game(self):while True:self._event_check_()  # 检测事件self._update_screen_()  # 更新屏幕def _event_check_(self):for event in pygame.event.get():if event.type == pygame.QUIT:  # 结束游戏sys.exit()elif event.type == pygame.MOUSEBUTTONDOWN:x, y = pygame.mouse.get_pos()  # 检测到单击鼠标事件,将鼠标的位置传入self.covers.delete(x, y)  # 删除对应方块上的覆盖物def _update_screen_(self):self.screen.fill(self.setting.background_color)  # 填充背景颜色self.covers.show()  # 将还没有被点击过的数字展现出来pygame.display.flip()  # 更新屏幕显示,将上面所做的工作展现在游戏界面上

最后附上本节课的全部代码:
 

import pygame
from settings import setting  # 游戏参数设置
from covers import Cover  # 未点击方块时表面的覆盖物
import sysclass Game:def __init__(self):pygame.init()self.setting = setting()self.screen = pygame.display.set_mode(self.setting.screen_size)self.covers = Cover(self.setting, self.screen)  # 表面覆盖物def run_game(self):while True:self._event_check_()  # 检测事件self._update_screen_()  # 更新屏幕def _event_check_(self):for event in pygame.event.get():if event.type == pygame.QUIT:  # 结束游戏sys.exit()elif event.type == pygame.MOUSEBUTTONDOWN:x, y = pygame.mouse.get_pos()  # 检测到单击鼠标事件,将鼠标的位置传入self.covers.delete(x, y)  # 删除对应方块上的覆盖物def _update_screen_(self):self.screen.fill(self.setting.background_color)  # 填充背景颜色self.covers.show()  # 将还没有被点击过的数字展现出来self.covers.show_frame()pygame.display.flip()  # 更新屏幕显示,将上面所做的工作展现在游戏界面上if __name__ == '__main__':my_game = Game()my_game.run_game()
"""
@funcs: 覆盖们
"""
import pygameclass Cover:"""管理游戏覆盖物的类"""def __init__(self, setting, screen):  # 游戏参数设置和游戏主界面self.setting = settingself.screen = screenself.covers = []  # 存储未被点击过的方块的覆盖物的位置for i in range(20):for j in range(20):self.covers.append([i, j])  # 刚开始时整个界面都是被覆盖的def show_frame(self):for i in range(20):pygame.draw.line(self.screen, self.setting.frame_color, [0, i*25], [500, i*25])pygame.draw.line(self.screen, self.setting.frame_color, [i*25, 0], [i*25, 500])def show(self):  # 将所有未被点击过的方块展现出来for cur in self.covers:pygame.draw.rect(self.screen, self.setting.cover_color, [cur[0] * 25, cur[1] * 25, 24, 24])def delete(self, posx, posy):x = posx // 25y = posy // 25if [x, y] in self.covers:self.covers.remove([x, y])
class setting:"""管理游戏中的参数的类"""def __init__(self):self.screen_size = [500, 500]  # 屏幕大小self.background_color = [255, 255, 255]  # 背景色self.frame_width = 1  # 线条粗细self.cover_color = [150, 150, 150]  # 展示界面的颜色self.frame_color = [120, 120, 120]

相关文章:

pygame8 扫雷游戏

一、游戏规则: 1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑: 主要逻辑即调用run_game, 然后循环检测事件…...

c/c++开发,无可避免的模板编程实践(篇四)

一、容器与模板 前文就说到,标准库基于模板编程,定义了许多容器类以及一系列泛型算法,使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器,这些容器通常包含一组数据或对象的集合,几乎可以和任何类…...

c++11 标准模板(STL)(std::unordered_set)(二)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

GEE学习笔记 七十二:【GEE之Python版教程六】命令行简介

这篇开始就要讲解GEE相关的内容&#xff0c;首先聊一下命令行的内容&#xff0c;这个在官方文档中有详细的介绍&#xff0c;这里我简单说一下常用的几个命令&#xff0c;剩余的大家在使用过程中如果又需要可以随时查看相关官方文档的介绍。官方文档地址&#xff1a;https://dev…...

DDD单根 聚合根 实体 值对象

前言2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software &#xff08;领域驱动设计&#xff09;&#xff0c;简称Evans DDD。快二十年的时间&#xff0c;领域驱动设计在不断地发展&#xff0c;后微服务时代强调的东西&#xff0c;在国…...

SpringMvc介绍。

目录 1、SpringMvc概述 1、基本介绍 2、工作流程 3、bean加载控制 二、请求 1、请求映射路径 2、请求方式 3、请求参数 4、请求参数&#xff08;传递json数据&#xff09; 5、日期类型参数传递 三、响应 四、REST风格 1、REST简介 2、RESTful入门案例 3、RESTfu…...

华为OD机试 - 最小传递延迟(JS)

最小传递延迟 题目 通讯网络中有N个网络节点 用1 ~ N进行标识 网络通过一个有向无环图进行表示 其中图的边的值,表示节点之间的消息传递延迟 现给定相连节点之间的延时列表times[i]={u,v,w} 其中u表示源节点,v表示目的节点,w表示u和v之间的消息传递延时 请计算给定源节点到…...

学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现

绪论&#xff1a; 本篇文章使结构体章节后的习题&#xff0c;如果你对C语言有问题&#xff0c;或者结构体有什么问题不妨看看我之前所写的文章&#xff08;章回体&#xff09;,对于文件管理和内存分配问题我将在后面补上&#xff0c;对于这个学生信息管理系统我用了多种方法和…...

Python抽奖系统

#免费源码见文末公众号# 抽奖系统① def choujiang1():def write():with open(d:\\抽奖系统\\抽奖1.1.pickle,rb) as file:lst1pickle.load(file)namevar1.get()if name not in lst1 and name!录入成功&#xff01; and name!录入失败&#xff01; and name!:lst1.append(name)…...

真实景观渲染技巧【Three.js】

受到一些很棒的 three.js 演示、与 covid 相关的旅行禁令以及可能在 pinterest 上花太多时间看美丽的旅行照片的启发——我开始看看我是否可以使用 three.js 和r3f在浏览器中渲染一个令人信服的风景场景。 推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链。 在过去一个…...

MySQL知识汇总:MySQL函数CASE WHEN用法详解

Case When的两种简单用法 用法一&#xff1a; CASE seasonWHEN Spring THEN 春天 WHEN Summer THEN 夏天 WHEN autumn THEN 秋天 else 冬天 end 用法二&#xff1a; CASE WHEN season Spring THEN 春天WHEN season Summer THEN 夏天WHEN season autumn THEN 秋天 els…...

Python学习-----模块1.0(模块的简介、定义与使用)

目录 前言&#xff1a; 1.什么是模块 2.模块的分类 &#xff08;1&#xff09;内置模块 &#xff08;2&#xff09;第三方模块 &#xff08;3&#xff09;自定义模块 3.模块的使用 4.自定义模块 5.模块和执行文件的判断 前言&#xff1a; 今天就开始讲Python中的模块篇…...

Linux进程学习【二】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

我问chatGPT,在JavaScript中构造函数和类的区别

问&#xff1a;构造器函数和面向中的类是同样的东西吗|&#xff1f; 答&#xff1a;构造器函数和面向对象中的类并不是同样的东西&#xff0c;它们之间有些许不同。 在面向对象编程中&#xff0c;类是一种抽象的概念&#xff0c;它描述了一类具有相同属性和行为的对象。类可以…...

软考高级-信息系统管理师之沟通管理(最新版)

项目沟通管理 1、项目沟通管理基础项目沟通管理的重要性项目沟通管理相关理论2、规划沟通管理3、管理沟通4、控制沟通项目沟通管理的技术和工具1、项目沟通管理基础 项目沟通管理的重要性 1、与1T项目成功有关的最重要的四个因素是:主管层的支持、用户参与、有经验的项目经理…...

PyQt5 自定义富文本编辑器

介绍 一款使用PyQt5和网页端框架wangEditor集成的富文本编辑器 代码片段 PyQt5客户端 与网页端建立连接def create_connect(self):self.web_view QWebEngineView()self.bridge JSBridge(self.web_view.page())self.web_view.load(QUrl.fromLocalFile(self.editor_path))w…...

【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...

如何保证服务的高可用性 HA&#xff08;High Availability&#xff09;?高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。方法论上&#xff0c;高可用是通…...

微服务架构设计模式-(14)面向生产环境

生产环境要求 应用安全 数据权限 服务可配置性 不同环境的配置不一样&#xff0c;不能写死代码&#xff0c;所以要配置 可观测性 需要日志系统 应用安全 四个方面 身份验证 验证主体的身份解决方案 单体 cookie 微服务中 API Gateway 访问令牌 不透明令牌透明令牌&#xff…...

HTML5新增用法

新增语义化标签 并无特殊含义&#xff0c;是语义&#xff01;语义&#xff01;语义&#xff01; <header> 头部区域 <nav> 导航区域 <main> 主体区域 <article> 内部标签 <section> 块级标签 <aside> 侧边栏标签 <footer> 尾部…...

富足金字塔:人的努力是为了扩大选择的范围

人的努力是为了扩大选择的范围&#xff0c;这是熵减的另一种表述。富足金字塔代表着人生的三重境界。第一层是温饱。人需要食物、水、住所。第二层是品质。能源、ICT、教育带来更有品质的生活&#xff0c;如智能门锁、智能马桶、扫地机、洗碗机、洗衣烘衣机。第三层是梦想。包括…...

STM32移植U8g2库驱动OLED:源码精简与硬件适配实战

1. 项目概述与核心思路之前玩ESP8266的时候&#xff0c;在Arduino环境下用U8g2库驱动OLED&#xff0c;画点线面、显示文字&#xff0c;确实方便。但很多实际项目&#xff0c;尤其是对成本、功耗有要求的&#xff0c;还是绕不开STM32这类更纯粹的MCU。最近有个小项目&#xff0c…...

鼠标点击也能如此惊艳!ClickShow让你的Windows操作充满视觉魔力 ✨

鼠标点击也能如此惊艳&#xff01;ClickShow让你的Windows操作充满视觉魔力 ✨ 【免费下载链接】ClickShow 鼠标点击特效 项目地址: https://gitcode.com/gh_mirrors/cl/ClickShow 还在为枯燥的鼠标点击操作感到乏味吗&#xff1f;每天重复的点击、拖拽、选择&#xff0…...

终极指南:5分钟学会用FanControl免费掌控Windows风扇转速

终极指南&#xff1a;5分钟学会用FanControl免费掌控Windows风扇转速 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

django-stubs模型类型检查实战:告别运行时错误的终极指南

django-stubs模型类型检查实战&#xff1a;告别运行时错误的终极指南 【免费下载链接】django-stubs PEP-484 stubs for Django 项目地址: https://gitcode.com/gh_mirrors/dj/django-stubs 在Django开发中&#xff0c;模型定义是核心环节&#xff0c;但传统开发模式下&…...

观察taotoken用量看板如何清晰展示各项目api调用明细

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察taotoken用量看板如何清晰展示各项目API调用明细 对于项目管理者而言&#xff0c;清晰掌握团队在大模型API上的资源消耗情况至…...

Windows安卓应用安装器终极指南:3种方法实现跨平台无缝体验

Windows安卓应用安装器终极指南&#xff1a;3种方法实现跨平台无缝体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在移动互联网时代&#xff0c;我们经常遇到这样…...

构建智能工单协同系统:Agent技术驱动研发效能提升

1. 项目概述&#xff1a;一个面向开发者的智能工单与任务协同系统最近在梳理团队内部的工作流时&#xff0c;我一直在思考一个问题&#xff1a;如何让代码仓库&#xff08;比如 GitHub、GitLab&#xff09;里的 Issues、Pull Requests 这些“待办事项”&#xff0c;不再只是静态…...

8255 Boot流程深度解析与Bring Up实战避坑指南

1. 8255芯片启动流程全景解析 第一次拿到8255芯片开发板时&#xff0c;最让我困惑的就是这个"安全岛"架构的启动流程。和传统芯片不同&#xff0c;8255的启动更像是一场精心编排的交响乐&#xff0c;SAIL&#xff08;安全岛&#xff09;、APPS&#xff08;应用处理器…...

让 SACF 自动捕获授权对象,把新授权检查安全带进生产系统

很多 ABAP 老系统里,最敏感的改造不是性能优化,也不是把一个古早 FORM 重构成类方法,而是在已经稳定运行多年的业务代码里补授权检查。原因很直接,少一次授权检查,审计和安全团队会觉得风险很大,多一次授权检查,生产用户可能第二天就打不开业务功能。SACF,也就是 Switc…...

ROFL-Player:基于C的多版本英雄联盟回放文件解析技术实现

ROFL-Player&#xff1a;基于C#的多版本英雄联盟回放文件解析技术实现 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player ROFL-Player是一款…...