python+pygame实现扫雷游戏之二

接python+pygame实现扫雷游戏之一,继续写游戏局的类:

五、

mineblock.py

# -*- coding: utf-8 -*-
import randomfrom  blockstatus import *
from  mine import *# 9*9-10  16*16-40 30*16-99   30*24-**
# BLOCK_WIDTH = 30
# BLOCK_HEIGHT = 16
# MINE_COUNT = 99     # 地雷数
BLOCK_WIDTH = 9
BLOCK_HEIGHT = 9 
MINE_COUNT = 10     # 地雷数SIZE = 20           # 块大小#Mine构成游戏类MineBlock
class MineBlock:    def __init__(self):self._block = [[Mine(i, j) for i in range(BLOCK_WIDTH)] for j in range(BLOCK_HEIGHT)]# 埋雷# 使用random.sample函数,它的作用是从指定序列中随机获取指定长度的片断并随机排列,结果以列表的形式返回,# 返回结果是无序的,省去了写循环读取随机数的工作。# sample函数不会修改原有序列。for i in random.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT):self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1       #一维转二维def get_block(self):return self._block#定义属性blockblock = property(fget=get_block)def getmine(self, x, y):return self._block[y][x]def open_mine(self, x, y):# 踩到雷了if self._block[y][x].value:self._block[y][x].status = BlockStatus.bombreturn False# 先把状态改为 openedself._block[y][x].status = BlockStatus.openedaround = _get_around(x, y)_sum = 0for i, j in around:if self._block[j][i].value:_sum += 1self._block[y][x].around_mine_count = _sum# 如果周围没有雷,那么将周围8个未中未点开的递归算一遍# 这就能实现一点出现一大片打开的效果了if _sum == 0:for i, j in around:if self._block[j][i].around_mine_count == -1:self.open_mine(i, j)return Truedef double_mouse_button_down(self, x, y):if self._block[y][x].around_mine_count == 0:return Trueself._block[y][x].status = BlockStatus.doublearound = _get_around(x, y)sumflag = 0     # 周围被标记的雷数量for i, j in _get_around(x, y):if self._block[j][i].status == BlockStatus.flag:sumflag += 1# 周边的雷已经全部被标记result = Trueif sumflag == self._block[y][x].around_mine_count:for i, j in around:if self._block[j][i].status == BlockStatus.normal:if not self.open_mine(i, j):result = Falseelse:for i, j in around:if self._block[j][i].status == BlockStatus.normal:self._block[j][i].status = BlockStatus.hintreturn resultdef double_mouse_button_up(self, x, y):self._block[y][x].status = BlockStatus.openedfor i, j in _get_around(x, y):if self._block[j][i].status == BlockStatus.hint:self._block[j][i].status = BlockStatus.normaldef _get_around(x, y):"""返回(x, y)周围的点的坐标"""# 这里注意,range 末尾是开区间,所以要加 1return [(i, j) for i in range(max(0, x - 1), min(BLOCK_WIDTH - 1, x + 1) + 1)for j in range(max(0, y - 1), min(BLOCK_HEIGHT - 1, y + 1) + 1) if i != x or j != y]

由于这里有一定的逻辑,所以要看一下:

5.1  首先是一些常量的定义:

BLOCK_WIDTH = 9

BLOCK_HEIGHT = 9

MINE_COUNT = 10     # 地雷数

这里就是扫雷的初级模式

SIZE = 20 指的是每个格子的大小

5.2  在MineBlock类的__init__中,开始是初始化出一个二维的数组_block,数组大小是:BLOCK_WIDTH *BLOCK_HEIGHT,里面每一个元素就是一个Mine。同时利用random.sample函数产生MINE_COUNT 个地雷,将数组的相应元素的value赋值为1,表示地雷,其他的就不是地雷,其value值为默认值0.

5.3  接着定义了一个属性block,指向上面定义的二维数组

5.4 定义方法getmine,获取指定位置的Mine对象

5.5 这里先介绍在最后面的辅助的方法:_get_around(x, y):  返回(x, y)周围的点的坐标,因为当鼠标左右按键同时按下时;以及点击某点时,假如它恰好位于不是雷的地方,同时周围还没有雷,会开出一大片这两种时候,会去遍历(x,y)周围的8个方向,所以用_get_around函数获取周围点的坐标的集合。

5.6 主要逻辑函数是open_mine,由于这里不是界面元素,所以本质就是计算每个Mine对象的状态,并赋值给_block中相应下标的那个元素的status。(到这里,应该能够体会到前面Mine类中那样写属性的用处了。)就是这个逻辑:

   5.6.1 先判断坐标处是不是雷,

      5.6.1.1若是雷,就将状态设置为bomb,并返回False,结束该函数;

      5.6.1.2否则,就先将该坐标处状态设置为opened,同时调用5.5的辅助方法_get_around获取                     周围的坐标集合,计算这些集合对应的value之和,将这个和赋值给该点的属性                            around_mine_count(注意,这个属性默认值是-1),表示该点坐标周围的雷的总和。

   5.6.2 如果上述的雷的总和是0,表示周边没有雷,就遍历这个around集合,分别递归调用一下本         方法open_mine,执行完后返回True

5.7  有了5.5和5.6的基础,下面的鼠标左右双击逻辑就好理解了,它对应的是double_mouse_button_down函数和double_mouse_button_up函数,结合扫雷的实际操作很容易理解,将周边可能出现雷的地方显示一下就可以了(就是说如果已经标记了所有雷,则打开周围一圈, 如果还未标记完所有雷,则有一个周围一圈被同时按下的效果,状态如果是normal,就设置成hint),鼠标弹起up时恢复原状(状态如果是hint,就设置成normal)。

待续。。。

python+pygame实现扫雷游戏之三

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

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

相关文章

【zabbix6监控java-tomcat全流程】

目录 一、监控主机安装zabbix-server1、zabbix的安装2、配置数据库3、为zabbix server配置数据库4、启动服务,web界面安装 二、被监控主机安装tomcat1、安装JDK2、安装tomcat 三、zabbix的服务端安装zabbix-java-gateway四、被监控主机tomcat的配置五、web界面添加主机 一、监控…

使用 Web APi - MediaRecorder 获取麦克风资源,报错:Cannot find name ‘MediaRecorder‘ 的解决方法

目录 一、背景: 二、具体解决方法 一、背景: angular 调用 MediaRecorder 来使用麦克风获取声音,(具体要求:angular 前端 按键调用 麦克风,松开按键生成音频文件)代码如下(来自通…

【树莓派3B+】控制引脚输出高低电平

前言一、安装RPI.GPIO库二、编写简单的输出高低电平的程序三、运行程序总结 前言 首先检查一下自己的板子有没有带库 我这个是有的。 ok,正式进入步骤 一、安装RPI.GPIO库 如果还没有安装RPi.GPIO库,可以通过以下命令在树莓派上安装: p…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接: https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置(对应PX4 1.13版) 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

Postman实战案例:从零开始设计API测试流程

Postman实战案例:从零开始设计API测试流程 API测试在现代软件开发中至关重要。Postman作为一款强大的API测试工具,不仅提供了直观的用户界面,还支持自动化测试、环境配置和脚本编写。本文将从零开始,详细介绍如何使用Postman设计…

php在服务器上部署可视化运维工具详细列表

如果你的项目很小,可以用宝塔。但对于并发大的服务器管理,选择适合的工具非常重要。 目录 以下是一些免费且适合高并发管理的服务器管理工具推荐: 1Panel: Portainer: Webmin: Cockpit: …

实战:详解Spring创建bean的流程(图解+示例+源码)

概叙 这篇主要总结Spring中bean的创建过程,主要分为加载bean信息–>实例化bean–>属性填充–>初始化阶段–>后置处理等步骤,且每个步骤Spring做的事情都很多,这块源码还是很值得我们都去看一看的。而Spring中Bean的声明周期其实…

GEO数据挖掘从数据下载处理质控到差异分析全流程分析步骤指南

0. 综合的教学视频介绍 GEO数据库挖掘分析作图全流程每晚11点在线教学直播录屏回放视频: https://www.bilibili.com/video/BV1rm42157CT/ GEO数据从下载到各种挖掘分析全流程详解: https://www.bilibili.com/video/BV1nm42157ii/ 一篇今年近期发表的转…

捷配总结的SMT工厂安全防静电规则

SMT工厂须熟记的安全防静电规则! 安全对于我们非常重要,特别是我们这种SMT加工厂,通常我们所讲的安全是指人身安全。 但这里我们须树立一个较为全面的安全常识就是在强调人身安全的同时亦必须注意设备、产品的安全。 电气: 怎样预…

IDEA 调试 Ja-Netfilter

首先本地需要有两款IDEA 可以是相同版本,也可以是不同版本。反正要有两个,一个用来调试代码,一个启动。 移除原有ja-netfiler 打开你的ja-netfiler的vmoptions目录,修改其中的idea.vmoptions文件。移除最后一行-javaagent ...参…

分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法

前言 树形结构是一种很常见的数据结构,类似于现实生活中的树的结构,具有根节点、父子关系和层级结构。 所谓根节点,就是整个树的起始节点。 节点则是树中的元素,每个节点可以有零个或多个子节点,节点按照层级排列&a…

有效应对服务器遭受CC攻击的策略与实践

分布式拒绝服务(DDoS)攻击,尤其是其中的HTTP洪水攻击或称为CC攻击(Challenge Collapsar),是当今互联网安全领域的一大挑战。这种攻击通过大量合法的请求占用大量网络资源,导致服务器无法正常响应…

数据可视化入门

文章目录 1. 数据可视化的发展历史1.1 古代与中世纪1.2 18世纪与19世纪1.3 20世纪1.4 21世纪 2. 数据可视化技术基础2.1 数据收集2.2 数据清洗2.3 数据加工 3. 图表库的选型3.1 常见图表库3.2 常用图表库 4. 数据可视化实战4.1 案例:使用Matplotlib和Seaborn进行数据…

AI智能名片S2B2C商城小程序在社群去中心化管理中的应用与价值深度探索

摘要:随着互联网技术的飞速发展,社群经济作为一种新兴的商业模式,正逐渐成为企业与用户之间建立深度连接、促进商业增长的重要途径。本文深入探讨了AI智能名片S2B2C商城小程序在社群去中心化管理中的应用,通过详细分析社群去中心化…

【DGL系列】DGLGraph.out_edges简介

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 函数说明 用法示例 示例 1: 获取所有边的源节点和目标节点 示例 2: 获取特定节点的出边 示例 3: 获取所有边的边ID 示例 4: 获取所有信息&a…

中国机器视觉行业上市公司市场竞争格局分析

中国机器视觉产业上市公司汇总:分布在各产业链环节 机器视觉就是用机器来代替人眼做测量和判断的系统,机器检测相较于人工视觉检测优势明显。目前,我国机器视觉产业的上市公司数量较多,分布在各产业链环节。具体包括:…

LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表

一、返回链表倒数第k个节点 . - 力扣(LeetCode) 本体思路参展寻找中间节点的方法,寻找中间节点是定义快慢指针,快指针每次走两步,慢指针每次走一步,当快指针为空或者快指针的下一个节点是空时,…

4000厂商默认账号密码、默认登录凭证汇总.pdf

获取方式: 链接:https://pan.baidu.com/s/1F8ho42HTQhebKURWWVW1BQ?pwdy2u5 提取码:y2u5

react页面指定dom转pdf导出

1. 使用jsPDFhtml2canvas将页面转成图片然后导出2. 自定义创建iframe调用iframe.print()进行页面打印转pdf导出3. 使用react-to-print插件打印pdf 1. 使用jsPDFhtml2canvas将页面转成图片然后导出 缺点:页面过长可能会导出失败,并且由于电脑分辨率的问题…