pygame10 扫雷游戏3

news2024/11/17 5:54:29

上一节课我们完成了扫雷游戏地图中雷数量的显示,今天我们将把雷的生成做出来

一、地雷的生成

地图中有20*20共400个格子,我们可以设定一共可以生成40个地雷,为了使得每次生成的地图都不一样,可以使用随机数randint,每次x的索引和y的索引分别从0至19中取随机数,当发现maps[x][y]不为0,我们就往里面放一个雷,放雷的逻辑很简单,通过masp[x][y] = 'X'完成

代码如下:

def _born(self):
    for i in range(40):
        x = randint(0, 19)
        y = randint(0, 19)
        while self.maps[x][y] != 0:
            x = randint(0, 19)
            y = randint(0, 19)
        self.maps[x][y] = 'X'
    return

雷放上去了,接下来需要计算地图上各个格子上雷的数量。根据第一课所述逻辑,每个格子周围8个格子如果有1个雷,那么此格子的数字是1,如果是2个雷,则是2,依此类推,最极端的情况是这个格子的周围8个格子全是雷,数字则为8.

换一种思路,也就是说每放下一个雷,则此雷周边8个格子如果不是雷的,就应该将数字增加1,这样只需要在产生雷时把周围相应的格子都增加一个数字1即可,计算雷周边的数字时需要注意的是如果在地图边沿时通过上下左右的移动超过地图边界时就不计算,代码如下:

    def _calc_thunder_num(self, x, y):
        for m in self.moves:
            i = m[0] + x
            j = m[1] + y
            if i >= 0 and i < 20 and j >= 0 and j < 20 and self.maps[i][j] != 'X':
                self.maps[i][j] += 1
        return

由于计算是根据每一个雷来算的,因此可以在生成雷时直接算出雷的数量,

    def _born(self):
        for i in range(40):
            # 略
            self._calc_thunder_num(x, y)
        return

贴出一个随机生成的地雷图:

 二、隐藏地雷,只在点击时显示数字或是雷

地雷生成好了,对应的数字也生成好了,只是游戏启动后,这些东西是不应该显示的,只有当鼠标点击对应格子才应该显示出来。我们可以用一个show_maps来记录需要显示的地图内容,每次点击地图,只将对应的地图索引存于show_maps中,然后显示出来,将原来直接显示的maps改为只显示show_maps

则原先的地图显示的代码更改为:

    def show(self):
        for item in self.show_maps:
            i = item[0]
            j = item[1]
            msg = "{}".format(self.maps[i][j])
            font = pygame.font.SysFont(None, 45)
            font_image = font.render(msg, True, [60, 0, 0], None)
            rect = font_image.get_rect()
            rect.top = j * 25
            rect.left = i * 25
            rect.width = 24
            rect.height = 24
            self.screen.blit(font_image, rect)

首先通过show_maps获取地图格子的索引,然后显示索引中对应的数字或是雷

点击格子时,将点击的位置转换为索引值存储于self.show_maps中即可

    def add(self, xpos, ypos):
        x = xpos // 25
        y = ypos // 25
        if x >= 0 and x < 20 and y >= 0 and y < 20:
            if [x, y] not in self.show_maps:
                self.show_maps.append([x, y])

简单的游戏界面:

现在的问题是,我们玩游戏时,点击到0时应该将0周围的一片区域都显示出来。

首先我们看一下逻辑,当点击的为0时,先将此格显示出来,然后查找周围的记录,若不为0且不是雷的,直接显示,若是0,查找此格周围8格,按同样的方式处理。

代码如下

    def _connect(self, x, y):
        tmp = list()
        if self.maps[x][y] == 0:
            tmp.append([x, y])
        while tmp:
            cur = tmp[-1]
            del tmp[-1]
            for m in self.moves:
                i = cur[0] + m[0]
                j = cur[1] + m[1]
                if i >= 0 and i < 20 and j >= 0 and j < 20 and self.maps[i][j] != 'X' and [i, j] not in self.show_maps:
                    self.show_maps.append([i, j])
                    self.cover.delete(i * 25, j * 25)
                    if self.maps[i][j] == 0:
                        tmp.append([i, j])

 效果图:

现在的问题是一般为0时,最好不要显示,这个只需在显示的时候判定maps[i][j]是否为0即可

代码如下:

    def show(self):
        for item in self.show_maps:
            i = item[0]
            j = item[1]
            if self.maps[i][j] == 0:
                continue
            # 略

 效果图:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么使用Junit单元测试?Junit的详解

Hi I’m Shendi 为什么使用Junit单元测试&#xff1f;Junit的详解 Junit简介 Junit是一个Java语言的单元测试框架。 单元测试是一个对单一实体&#xff08;类或方法&#xff09;的测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression test…

AUTOSAR FunctionalSafety

概述 随着汽车功能复杂度的急剧增加,功能安全作为一个系统特征开始被重视,影响着系统设计决策。软件作为一个因素影响着系统级的复杂度。新的技术和概念可以被用在软件开发中来减少复杂度,来实现功能安全。 AUTOSAR提供了一些安全措施和机制来支持安全系统开发,但是并不是…

MATLAB绘制椭圆形相关系矩阵图

数据/代码准备 数据及代码下载&#xff1a; 下载专区-《MATLAB统计分析与应用&#xff1a;40个案例分析》程序与数据 绘图函数&#xff1a; matrixplot(data, PARAM1,val1, PARAM2,val2, ...) 案例 数据如下&#xff1a; MATLAB代码如下&#xff1a; clc close all clear …

升级 vue3 常见问题总汇

Ⅰ、前言 虽然 vue3 是没有删除 vue2 的 选项式 API &#xff0c; 但是我们升级vue3 还是需要修改很多问题的下面来看看我们升级常见的一些问题 &#x1f447; 文章目录Ⅰ、前言Ⅱ、解决兼容问题1、路由的创建方式2、路由的方法变化3、升级 vuex 到 4.x4、作用域 插槽语法修改…

Hyperf使用RabbitMQ消息队列

Hyperf连接使用RabbitMQ消息中间件 传送门 使用Docker部署RabbitMQ&#xff0c;->传送门<使用Docker部署Hyperf&#xff0c;->传送门-< 部署环境 安装amqp扩展 composer require hyperf/amqp安装command命令行扩展 composer require hyperf/command配置参数 假…

Windows+VS2019用vcpkg编译colmap以及用Cmake编译colmap源码

WindowsVS2019用vcpkg编译colmap以及用Cmake编译colmap源码 Window下官方建议用vcpkg安装。这里我已经安装好了VS2019以及cuda11.7。 1.安装vcpkg git clone https://github.com/microsoft/vcpkg cd vcpkg .\bootstrap-vcpkg.bat2. 使用vcpkg编译colmap .\vcpkg install co…

Java软件开发好学吗?学完好找工作吗?

互联网高速发展的当下&#xff0c;Java语言无处不在&#xff1a;手机APP、Java游戏、电脑应用&#xff0c;都有它的身影。作为最热门的开发语言之一&#xff0c;Java在编程圈的地位不可撼动。可是&#xff0c;听名字就很专业的样子。Java语言到底好学吗&#xff1f;刚入坑编程圈…

CAPL脚本要注意区分elcount和strlen求数组长度的区别,不然要吃大亏

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

【C++】AVL树,平衡二叉树详细解析

文章目录前言1.AVL树的概念2.AVL树节点的定义3.AVL树的插入4.AVL树的旋转左单旋右单旋左右双旋右左双旋AVL树的验证AVL树的删除AVL树的性能前言 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个共同点是&#xff1…

Linux基础命令-setfacl设置文件ACL策略规则

Setfacl 命令介绍 先查看文档中如何描述这个命令的NAME setfacl - set file access control lists setfacl&#xff08;Set file access control lists&#xff09;直译过来是设置文件访问控制列表 &#xff0c;其主要功能是用于设置文件ACL策略规则。FACL即文件访问控制列表…

GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

GEC6818开发板JPG图像显示 | 开发板实现录音一.GEC6818开发板JPG图像显示1.jpg图片特性2.如何解压缩jpg图片1.对jpegsrc.v8c.tar.gz进行arm移植2.进入~/jpeg-8c对jpeg库进行配置3.编译4.安装&#xff0c;将动态库存放到 /home/gec/armJPegLib5.清空编译记录6.自己查看下 /home/…

C语言-基础了解-06-C存储类

C存储类 一、存储类 存储类定义 C 程序中变量/函数的的存储位置、生命周期和作用域。 这些说明符放置在它们所修饰的类型之前。 下面列出 C 程序中可用的存储类&#xff1a; auto register static extern auto 存储类 auto 存储类是所有局部变量默认的存储类。 定义在函数…

【IDEA】如何在Tomcat上创建部署第一个Web项目?

看了网上很多教程&#xff0c;发现或多或都缺失了一些关键步骤信息&#xff0c;对于新手小白很不友好&#xff0c;那么今天就教大家如何在Tomcat服务器&#xff08;本地&#xff09;上部署我们的第一个Web项目&#xff1a; 共分为三个部分&#xff1a; 1. IDEA创建Web项目&am…

【编程实践】简单是好软件的关键:Simplicity is key to good software

Simplicity is key to good software 简单是好软件的关键 目录 Simplicity is key to good software简单是好软件的关键 Complexity is tempting. 复杂性很诱人。 The smallest way to create value创造价值的最小方法 Simple 简单的 Complexity is tempting. 复杂性很诱人…

【Vue】Vue的简单介绍与基本使用

一、什么是VueVue是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。1.构建用户界面传统方…

每日的时间安排规划

14:23 2023年3月4日星期六 开始 现在我要做一套试卷。模拟6级考试。 现在是&#xff1a; 16:22 2023年3月4日星期六。 做完了线上的试卷&#xff01; 发现我真的是不太聪明的样子&#xff01; 明明买的有历年真题&#xff0c;做真题就行了&#xff0c;还要做它们出的模拟的…

现代卷积神经网络(AlexNet)

专栏&#xff1a;神经网络复现目录 本章介绍的是现代神经网络的结构和复现&#xff0c;包括深度卷积神经网络&#xff08;AlexNet&#xff09;&#xff0c;VGG&#xff0c;NiN&#xff0c;GoogleNet&#xff0c;残差网络&#xff08;ResNet&#xff09;&#xff0c;稠密连接网络…

操作系统---存储管理

存储管理 操作系统将外存的文件调入到内存中&#xff0c;以便CPU调用&#xff0c;如果调用的内容不在内存中&#xff0c;则会产生缺页中断&#xff1b;产生缺页中断后&#xff0c;这事需要从外存调数据到内存中&#xff0c;然后CPU接着从断点继续调用内存中的数据&#xff1b;在…

Webshell管理工具

Webshell管理工具Webshell简介Webshell作用Webshell管理工具菜刀蚁剑Webshell简介 Webshell是以ASP、PHP、JSP或者CGl等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、权限管理等操作。 Webshell使用方法简单&#xff0c;只需上传一个代码文件…

C语言详解双向链表的基本操作

目录 双链表的定义与接口函数 定义双链表 接口函数 详解接口函数的实现 创建新节点&#xff08;BuyLTNode&#xff09; 初始化双链表&#xff08;ListInit&#xff09; 双向链表打印&#xff08;ListPrint&#xff09; 双链表查找&#xff08;ListFind&#xff09; 双链…