扫雷小游戏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,根据第一篇的介绍 ...
随机推荐
- c#通过socket判断服务器连接是否正常
判断Socket是否连接上,需要通过发包来确认. 之前确认都是调用调用socket的connected属性,然而该属性是上次的连接是否成功的结果,不及时. // 检查一个Socket是否可连接 pri ...
- python jieba
https://www.cnblogs.com/jiayongji/p/7119065.html 安装 pip install jieba 简单用法 结巴分词分为三种模式:精确模式(默认).全模式和搜 ...
- leetcode腾讯精选练习(50 题)(持续更新)
1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...
- 2019年广东外语外贸大学程序设计竞赛(新手赛)-F题(好快的刀)题解
题面: 题目意为,任意连接两个圆的圆心形成一条直线,计算与该直线相交或相切的圆的数量,求这些直线最多能相交或相切多少个圆 解题思路: 遍历所有的圆,计算出两圆圆心生成的直线,再遍历其他的圆,检测这些圆 ...
- LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)
23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...
- 创建 django 项目命令
创建Django项目 django-admin startproject HelloWorld Django创建app cd HelloWorld python manage.py startapp ...
- Django RuntimeError: Model class app_anme.models.Ad doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.报错
报错内容 RuntimeError: Model class app_anme.models.Ad doesn't declare an explicit app_label and isn't in ...
- Django连接多个数据库并实现读写分离
当一个项目当中有大量的数据的时候,你所有的IO操作都在一个数据库中操作,会造成项目的性能的降低.如果你能对项目中的数据进行读写分离的话,那么将大大提高你项目的性能.而Django自带的机制也对此提供了 ...
- LOJ2267 SDOI2017 龙与地下城 FFT、概率密度函数、Simpson
传送门 概率论神仙题-- 首先一个暴力做法是设\(f_{i,j}\)表示前\(i\)个骰子摇出点数和为\(j\)的概率,不难发现DP的过程是一个多项式快速幂,FFT优化可以做到\(O(XYlog(XY ...
- 通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
原文:通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息 WPF 框架自己实现了一套触摸机制,但同一窗口只能支持一套触摸机制,于是这会禁用系统的触摸消 ...