python实现文字版扫雷
作者:爱面条的可达 发布时间:2023-01-01 13:01:47
标签:python,扫雷
本文实例为大家分享了python实现文字版扫雷的具体代码,供大家参考,具体内容如下
python版本:2.7
游戏运行图:
代码已经注释得很清楚,不废话了,直接上代码:
2个算法:1、随机数生成算法,2、广度优先
#coding:utf-8
import sys
import random
import Queue
#保存不同游戏难度数据 格式:难度:(row,line,mine)
DIFFICUL_DATA = {1:(8,8,5),2:(10,10,20),3:(15,15,100)}
#保存不同游戏结果的一些数据
RESULT_DATA = {
0:" 数据统计",
1:" 游戏胜利",
2:" 游戏失败"
}
class Sweep_Mine(object):
def __init__(self):
"""
功能:实例化函数
"""
self.row = 0
self.line = 0
self.mine_num = 0
self.map_list = []
self.clean_count = 0
self.step_count = 0
self.level = 0
self.result = 0 # 保存游戏结果、0:还未结束,1:游戏胜利,2:游戏失败
self.queue = Queue.Queue()
def show_desc(self):
"""
功能:打印游戏说明
"""
print "=============================="
print "| 游戏说明 |"
print "| |"
print "| |"
print "| # 为没扫雷过的位置 |"
print "| * 为地雷的位置 |"
print "| 0 为空白区域 |"
print "| 1-8为周围雷的数目 |"
print "| |"
print "| |"
print "| 输入X/Y: 扫雷的位置 |"
print "| X/Y输入99: 刷新地图 |"
print "| X/Y输入88: 退出游戏 |"
print "| |"
print "=============================="
print "------------------------------"
def show_result(self):
"""
功能:打印信息显示
参数:
select 0 打印数据统计
1 打印游戏胜利
2 打印游戏结束
"""
print "\n============================"
print RESULT_DATA.get(self.result) #从RESULT_DATA中打印结果数据
print "\n 地雷数 : %d 步数 :%d " %(self.mine_num,self.step_count)
print " 已扫雷坑 : %d 剩余雷坑:%d " %(self.clean_count,\
self.row*self.line - self.clean_count -self.mine_num)
print "============================"
def init_data(self):
"""
功能:难度选择,数据初始化
"""
self.clean_count = 0
self.step_count = 0
self.row = DIFFICUL_DATA[self.level][0] #从全局变量Grade_Data获取难度数据
self.line = DIFFICUL_DATA[self.level][1]
self.mine_num = DIFFICUL_DATA[self.level][2]
self.map_list = [['#' for i in range(self.row)] for i in range(self.line)] #map_list填充'#'
random_list = random.sample(range(self.row*self.line),self.mine_num) #获取mine_num个随机数
for i in random_list:
x = i%self.row #用随机数对横取余
y = i/self.row #用随机数对横取商
self.map_list[y][x] = '*' #随机位置设置雷
def set_level(self,lvl):
"""
功能:设置游戏难度
参数:
lvl 为 1 2 3 不同难度
返回:
True 设置等级成功
False 设置等级失败
"""
if lvl ==1 or lvl == 2 or lvl == 3:
self.level = lvl
self.init_data()
return True
else:
return False
def check_result(self):
"""
功能:判断游戏是否胜利
返回:
self.result
0 未结束
1 胜利
2 失败
"""
if self.row*self.line-self.clean_count <= self.mine_num:
self.result = 1
return self.result
def bfs(self):
"""
BFS广度优先搜索空白区
"""
queue_temp = []
around = [[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]]
while not self.queue.empty():
self.clean_count += 1
mine = 0
q_x=self.queue.get()
q_y=self.queue.get()
for value in around:
line = q_y + value[0]
row = q_x + value[1]
if line<0 or line>=self.line or row<0 or row>=self.row:
continue
if self.map_list[line][row] == '*':
mine += 1
elif self.map_list[line][row] == '#':
queue_temp.append([line,row]) #暂时保存到queue_temp
if mine > 0:
self.map_list[q_y][q_x] = str(mine) #标注雷的数目
queue_temp = [] #清空queue_temp
else:
self.map_list[q_y][q_x] = '0' #设置为空白区'0'
while len(queue_temp): #将queue_temp里面的值放到queue队列里面
temp = queue_temp.pop(0)
self.map_list[temp[0]][temp[1]] = '0' #防止回头
self.queue.put(temp[1]) #将空白的点加入队列
self.queue.put(temp[0])
def show_game(self,showmine=False):
"""
功能:显示扫雷地图
参数:默认showmine 为 False 普通显示,隐藏地雷的位置
showmine 为 True 特殊显示,显示地图中地雷的位置
"""
output_temp = [] #保存输出字符
num_temp = [] #保存横纵坐标的序号
len = self.row if self.row >= self.line else self.line #保存row或line长的一边
for num in range(len):
if num <10:
num_temp.append(str(num)+' ')
else:
num_temp.append(str(num)+' ')
output_temp.append(" X ")
for x in range(self.row):
output_temp.append(num_temp[x])
output_temp.append('\nY ')
for x in range(self.row):
output_temp.append('---')
for y in range(self.line):
output_temp.append('\n'+num_temp[y]+'| ')
for x in range(self.row):
if self.map_list[y][x] == '*':
if showmine == True:
output_temp.append('* ')
else:
output_temp.append('# ')
else:
output_temp.append(self.map_list[y][x] + ' ')
print ''.join(output_temp)
def input_pos(self,y,x):
"""
功能:输入扫雷位置
参数:输入整型x,y
表示要扫雷的位置,x为横坐标,y为纵坐标
x/y = 99,刷新地图
x/y = 88,结束游戏
返回:
True:扫雷成功
False:扫雷失败
"""
if x in range(self.row) and y in range(self.line):
self.step_count += 1 #步数加一
if self.map_list[y][x] == '*': #踩到地雷
self.result = 2 #游戏结果设置失败
return True
elif self.map_list[y][x] == '#': #扫雷成功
self.queue.put(x)
self.queue.put(y)
self.bfs()
return True
else:
return False
else:
if x == 99 or y == 99: #输入99,刷新地图
self.init_data()
return True
elif x == 88 or y == 88: #输入88,游戏结束
self.result = 2
return True
else:
return False
if __name__ == '__main__':
game = Sweep_Mine()
game.show_desc() #打印游戏说明
while True: #大循环输入游戏难度
level = raw_input("请选择游戏的难度\n输入:1、2、3\n")
if level.isdigit() != True: #如果输入不是数字
print("无效,请输入数字!")
continue
else:
level = int(level)
if game.set_level(level) == True: #选择难度成功推出
break
else:
print("难度选择失败!")
while game.check_result() == 0: #游戏没结束,一直循环输入x/y
game.show_game()
game.show_result()
x = raw_input("Input X:")
y = raw_input("Input Y:")
if x.isdigit() != True or y.isdigit() != True: #如果输入不是数字
print "无效,请输入数字!"
continue
else:
x = int(x)
y = int(y)
if game.input_pos(y,x): #输入扫雷的位置
print "扫雷成功!"
else:
print "输入位置错误!"
game.show_game(True) #游戏结束
game.show_result()
sys.exit(0)
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
来源:https://blog.csdn.net/haha1fan/article/details/78997072


猜你喜欢
- split() 通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。split()方法定义于
- 有时在我们注册账户、登陆系统时,当所有验证通过方可提交 这就需要Jquery来实现表单验证,今天分享给小伙伴们一段基于Jquery实现表单验
- 可视化单词统计词频统计中文分词项目架构新建一个文件,输入文件的内容,查询此文件中关键字的出现的次数,关键字出现的位置,将所有的文本按照中文分
- 需求一般Django开发为了保障避免 csrf 的攻击,如果使用Django的模板渲染页面,那么则可以在请求中渲染设置一个csrftoken
- 1000块钱做个百度?能提出这种要求的客户实乃乙方克星、民族之光、科创永动机、西虹市一大杰出青年,诺奖永远得不到的人才。但作为一个硬核的程序
- 这几天想统计一下《中国人文社会科学期刊 AMI 综合评价报告(2018 年):A 刊评价报告》中的期刊,但是只找到了该报告的PDF版,对于表
- 1. css背景图1.1 背景属性<!DOCTYPE html><html lang="en">
- 在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用
- 图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不
- 慢速SQL:执行时间超过给定时间范围的查询就称为慢速查询。在MySQL中如何记录慢速SQL?答:可以在my.cnf中设置如下信息:[mysq
- 前言对MySQL有研究的读者,可能会发现MySQL更新很快,在安装方式上,MySQL提供了两种经典安装方式:解压式和一键式,虽然是两种安装方
- 方法一: $(document).on('touchmove',function(e){ e.preventDefault(
- SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对S
- 利用mask(掩模)技术提取纯色背景图像ROI区域中的人和物,并将提取出来的人或物添加在其他图像上。1、实现原理先通过cv.cvtColor
- string操作在编程中具有极高的频率,那么string中有哪些有用的方法呢?使用strings直接操作Comparefunc Compar
- 一、安装mysqlclient网上看到很过通过命令:pip install mysqlclient 进行安装的教程,但是我却始终安装失败,遇
- <%If(Request.QueryString("Page")="") ThenPage=1
- 解决MySQL插入时间差八小时问题一般 jdbc url中 需要添加几个参数 , 大多数博客给的教程都是 useSSL=false&
- 在本篇文章里,我们会使用一个简单的Web表单,它会列出某个目录下的一些XML文件。然后,我们会从这个目录里选择一个文件,将它发送到另一个We
- 介绍set 顾明思义,就是个集合,集合的元素是唯一的,无序的。一个{ }里面放一些元素就构成了一个集合,set里面可以是多种数据类型(但不能