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
0
投稿
猜你喜欢
- 和获取网页上的信息不同,想要进行模拟登录还需要向服务器发送一些信息,如账号、密码等等。模拟登录一个网站大致分为这么几步:1.先将登录网站的隐
- 1、元旦之前受赵晨之邀作为讨论嘉宾参加了ACM组织的“人与信息社会巡讲”。2、去之前赵晨发给了我大致的讨论提纲。咣当了好几下~说实话,我是硬
- 网上有不少生成缩略图的ASP组件。若你的虚拟空间不支持注册新组件,可能会感觉自己的网站失色不少。心晴不才,结合网上资源写了个无组件生成缩略图
- 见下:<form action="./calculation.asp"><input&nbs
- 一、相关代码数据库配置类 MongoDBConn.py#encoding=utf-8'''Mongo Conn连接类
- 文档介绍利用python写“猜数字”,“猜词语”,“谁是卧底”这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列表
- 目录楔子faker使用方法基本使用地理信息类基础信息类计算机基础、Internet信息类网络基础信息类浏览器信息类数字类文本、加密类时间信息
- 一个不错的js星级评分代码,可以评多个指标。相关文章推荐:用css制作星级投票评分功能 效果图:<script language=&q
- 本文实例为大家分享了Python tkinter实现计算器功能的具体代码,供大家参考,具体内容如下python版本:3.5一.计算器的功能描
- 随着网站访问量的加大,每次从数据库读取都是以效率作为代价的,很多用ACCESS作数据库的更会深有体会,静态页加在搜索时,也会被优先考虑。互联
- 论坛里面有不少人在使用Javascript编写Asp,经常有人在论坛提问,为什么Asp对象在对比指定值时返回结果不对?现在在这里给大家写点关
- 在平时,常常会提醒自己要做一个善于发现的人,时刻发现细节,这样才会更加懂得生活、会让生活更加精彩。在学习上也是如此,我们常常会发现有很多网站
- 最近对 Range 和 Selection 比较感兴趣。基本非 IE 的浏览器都支持 DOM Level2 中的 Range,而 IE 中仅
- sql exist的妙用create table b(a varchar(10),b varchar(10),c varchar(10))i
- 由于项目收尾,最近忙着做一些方法的优化,整理了一些分享给大家。 当页面内有许多控件,我们在需要清空其值的时候,一个个清空未免太麻烦。于是写了
- 之前用来整理图片的小程序,拿来备忘,算是使用Python复制文件的一个例子。# -*- coding: utf-8 -*-#程序用来拷贝文件
- show.php源代码: <? if ($action=="cp"){ echo"<div ali
- 解决2个问题:1.身份证之类的文本数据自动转为科学计数法的问题。2.中文乱码的问题excel从web页面上导出的原理。当我们把这些数据发送到
- 我们平日办公时用得最多的软件是Execl、Word或WPS Office等,你的计算机中一定储存着大量的XLS、DOC、WPS文件吧!网页制
- 前面简单介绍了Python列表基本操作,这里再来简单讲述一下Python元组相关操作>>> dir(tuple) #查看元