python实现文字版扫雷


Posted in Python onApril 24, 2020

本文实例为大家分享了python实现文字版扫雷的具体代码,供大家参考,具体内容如下

python版本:2.7

游戏运行图:

python实现文字版扫雷

代码已经注释得很清楚,不废话了,直接上代码:
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)

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分享python数据统计的一些小技巧
Jul 21 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
Django 数据库同步操作技巧详解
Jul 19 Python
pycharm配置git(图文教程)
Aug 16 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
Python双链表原理与实现方法详解
Feb 22 Python
详解Django配置JWT认证方式
May 09 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
python实现简单反弹球游戏
Apr 12 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 #Python
python3中sys.argv的实例用法
Apr 24 #Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 #Python
Python实现仿射密码的思路详解
Apr 23 #Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 #Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 #Python
使用matplotlib动态刷新指定曲线实例
Apr 23 #Python
You might like
如何使用PHP往windows中添加用户
2006/12/06 PHP
php使用curl访问https示例分享
2014/01/17 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
XML的代替者----JSON
2007/07/21 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
javascript如何实现create方法
2019/11/04 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
Django实现分页功能
2018/07/02 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
给男朋友的道歉信
2014/01/12 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
学校教师读书活动总结
2014/07/08 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
小学班主任评语
2014/12/29 职场文书
欢送领导祝酒词
2015/08/12 职场文书
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫