扫雷小游戏PyQt5开发【附源代码】
也没啥可介绍哒,扫雷大家都玩过。

雷的分布算法也很简单,就是在雷地图(map:二维数组)中,随机放雷,然后这个雷的8个方位(上下左右、四个对角)的数字(非雷的标记、加一后不为雷的标记)都加一。
如何判断是否踩到雷有很多种方法,只要判断某个控件对应map中的值是否为雷的标记即可,其余的都是PyQt5的控件操作,没啦~~~
#coding: utf-8
* 扫雷小游戏
* 需要python3.x以上
* 需要安装PyQt5
* pip install PyQt5
"""
import sys
try:
import PyQt5
except ImportError:
import tkinter
from tkinter import messagebox
err_str = "请安装PyQt5后再打开: pip install PyQt5"
messagebox.showerror("模块错误!", err_str)
raise ImportError(err_str)
sys.exit()
from random import randint
from PyQt5.QtWidgets import \
QApplication, \
QWidget, \
QPushButton, \
QLCDNumber, \
QDesktopWidget, \
QMessageBox
from PyQt5.QtCore import Qt
class Mine(object):
mine = 9
no_mine = 0
n_mine = 10
width = 10
height = 10
def __init__(self, width=10, height=10, nMines=10):
self.map = []
for _ in range(height):
t_line = []
for _ in range(width):
t_line.append(self.no_mine)
self.map.append(t_line)
self.width = width
self.height = height
self.n_mine = nMines
self.remix()
# 打乱布局重新随机编排
def remix(self):
for y in range(self.height):
for x in range(self.width):
self.map[y][x] = self.no_mine
def add_mark(x, y):
# 如果不是雷的标记就+1
if self.map[y][x]+1 < self.mine:
self.map[y][x] += 1
mine_count = 0
while mine_count < self.n_mine:
x = randint(0, self.width-1)
y = randint(0, self.height-1)
if self.map[y][x] != self.mine:
self.map[y][x] = self.mine
mine_count += 1
# 雷所在的位置的8个方位的数值+1
## 上下左右
if y-1 >= 0: add_mark(x, y-1)
if y+1 < self.height: add_mark(x, y+1)
if x-1 >= 0: add_mark(x-1, y)
if x+1 < self.width: add_mark(x+1, y)
## 四个角: 左上角、左下角、右上角、右下角
if x-1 >= 0 and y-1 >=1: add_mark(x-1, y-1)
if x-1 >= 0 and y+1 < self.height: add_mark(x-1, y+1)
if x+1 < self.width and y-1 >= 1: add_mark(x+1, y-1)
if x+1 < self.width and y+1 < self.height: add_mark(x+1, y+1)
def __getitem__(self, key):
return self.map[key]
def __str__(self):
format_str = ""
for y in range(self.height):
format_str += str(self[y]) + "\n"
return format_str
__repr__ = __str__
class LCDCounter(QLCDNumber):
__counter = 0
def __init__(self, start=0, parent=None):
super().__init__(4, parent)
self.setSegmentStyle(QLCDNumber.Flat)
self.setStyleSheet("background: black; color: red")
self.counter = start
@property
def counter(self):
return self.__counter
@counter.setter
def counter(self, value):
self.__counter = value
self.display(str(self.__counter))
def inc(self):
self.counter += 1
def dec(self):
self.counter -= 1
class MineButton(QPushButton):
# 按钮类型
MINE = Mine.mine # 雷
NOTMINE = Mine.no_mine # 不是雷
m_type = None
# 按钮状态
mark = False # 是否是标记状态(默认: 未被标记)
s_flag = '⚑' # 标记
s_mine = '☠' # 雷
s_success = '扫雷小游戏PyQt5开发【附源代码】的更多相关文章
- Angular4 扫雷小游戏
扫雷小游戏,可以升级过关,难度随关卡增加.但是有很明显的bug,以后有时间会继续优化! HTML: <div class="mainContent"> <div ...
- web版扫雷小游戏(一)
作为一名程序猿,平时的爱好也不多,说起游戏,我不太喜欢大型的网游,因为太耗时间,偶尔玩玩经典的单机小游戏,比如windows下自带的游戏扫雷(秀一下,高级下最高纪录110s). 现阶段正在致力于web ...
- 无聊的周末用Java写个扫雷小游戏
周末无聊,用Java写了一个扫雷程序,说起来,这个应该是在学校的时候,写会比较好玩,毕竟自己实现一个小游戏,还是比较好玩的.说实话,扫雷程序里面核心的东西,只有点击的时候,去触发更新数据这一步. Sw ...
- C++扫雷小游戏(基于CMD命令行)
这个小游戏是笔者在大一C语言课程设计的时候写的,基于命令行,为了显得漂亮一些,特别加上了彩色特效~~~ 注意:Win10系统须将命令行调为旧版命令行,否则有可能会显示乱码! 代码示例: #includ ...
- 微信小程序(小游戏)后台开发
小程序开放接口功能,目的是方便小程序接入第三方服务器,比如,商城类小程序,小游戏,需要保存订单数据,玩家信息等.那就需要服务器和数据库, 开发者对于各方关系必须要理清,那就是小程序,用户,开发者服务器 ...
- 微信小游戏egret开发包括p2引擎小结
用egret + p2 做一个类似投球的小游戏,坑大致如下: 1.p2引擎与egret坐标不同注意转换,横坐标没什么,纵坐标egret.y = stageHeight - body.position[ ...
- 【源码项目+解析】C语言/C++开发,打造一个小项目扫雷小游戏!
一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的 ...
- 用python+pyqt5语言编写的扫雷小游戏软件
github源码地址:https://github.com/richenyunqi/Mine-game ,撒娇打滚求star哦~~ღ( ´・ᴗ・` )比心 扫雷主界面模块 整个扫雷界面使用大量的白色方 ...
- web版扫雷小游戏(四)
~~~接上篇,游戏的主体框架完成了,接下来我们对游戏中存在的两个主要实体进行分析,一个是雷点类BombObject(节点对象),一个是节点对象对应的图片对象BombImgObject,根据第一篇的介绍 ...
随机推荐
- 【视频开发】【Live555】通过live555实现H264 RTSP直播
前面的文章中介绍了<H264视频通过RTMP流直播>,下面将介绍一下如何将H264实时视频通过RTSP直播. 实现思路是将视频流发送给live555, 由live555来实现H264数据流 ...
- mysqlbinlog二三事儿
binlog的sql命令: SHOW VARIABLES LIKE 'log_%'; 查询各种log是否开启 SHOW MASTER STATUS; 查询当前binlog文件position状态 S ...
- LeetCode 704. 二分查找(Binary Search)
704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...
- vue中指令绑定的v-if逻辑结构
<!-- if判断 --> <div id="app2"> <p v-if="seen"> <!-- 给p标签绑定指令 ...
- class——python编程从入门到实践
创建和使用类 1. 创建Dog类 class Dog: """一次模拟小狗的简单尝试""" def __init__(self, name, ...
- 方法2:使用Jenkins构建Docker镜像 --SpringCloud
前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...
- Dubbo学习摘录(二)
扩展点机制 扩展点的配置 (1)根据关键字读取配置,获取具体的实现类 比如在 dubbo-demo-provider.xml 文件中配置: 则会根据rmi去读取具体的协议实现类RmiProtocol. ...
- node-red 流程的导入导出
流程的导入导出 流程的导出 选中所要导出的流程,点击右上角三条杠按钮 有两个选项,导出到剪贴板和库 1. 导出到剪贴板 导出到剪贴板可以复制,粘贴到任何地方 [{,,,,,,"wires&q ...
- 使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死)
原文:使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死) 在微软的官方文档中,说 SetParent 可以在进程内设置,也可以跨进程设置.当使用跨进程设置窗口的父子关系时,你需要注意 ...
- JAVA日期格式化yyyyMMddHHmmssSSS
String nowtime = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());