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中的集合类型操作符
Aug 19 Python
python如何实现内容写在图片上
Mar 23 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
python保存网页图片到本地的方法
Jul 24 Python
python读取和保存图片5种方法对比
Sep 12 Python
python+splinter自动刷新抢票功能
Sep 25 Python
Python高斯消除矩阵
Jan 02 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
基于FME使用Python过程图解
May 13 Python
python 实现批量图片识别并翻译
Nov 02 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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生成Flash动画的实现代码
2010/03/12 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
python中类的一些方法分析
2014/09/25 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python创建xml文件示例
2017/03/22 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
标准自荐信范文
2014/01/29 职场文书
医院检讨书范文
2014/02/01 职场文书
趣味比赛活动方案
2014/02/15 职场文书
优质服务口号
2014/06/11 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书