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 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
Golang与python线程详解及简单实例
Apr 27 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
基于树莓派的语音对话机器人
Jun 17 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
python列表生成器迭代器实例解析
Dec 19 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
python实现程序重启和系统重启方式
Apr 16 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
python套接字socket通信
Apr 01 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反弹shell实现代码
2009/04/22 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
python搜索指定目录的方法
2015/04/29 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
python实现简单名片管理系统
2018/11/30 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
瑞典度假品牌:OAS
2019/05/28 全球购物
Linux如何压缩可执行文件
2014/03/27 面试题
卫校毕业生自我鉴定
2013/10/31 职场文书
个人自荐信
2013/12/05 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python
python前后端自定义分页器
2022/04/13 Python