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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
python实现下载文件的三种方法
Feb 09 Python
Python列表切片用法示例
Apr 19 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
python字符串Intern机制详解
Jul 01 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP修改session_id示例代码
2014/01/08 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
react 生命周期实例分析
2020/05/18 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python MD5加密实例详解
2017/08/02 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
python移位运算的实现
2019/07/15 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
安全教育心得体会
2013/12/29 职场文书
经理助理岗位职责
2014/03/05 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
纪检监察建议书
2014/05/19 职场文书
小学班级口号
2014/06/09 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
会议欢迎词范文
2015/01/27 职场文书
员工家属慰问信
2015/03/24 职场文书
2015年大学生实习评语
2015/03/25 职场文书
python神经网络Xception模型
2022/05/06 Python