python实现文字版扫雷

这篇文章主要为大家详细介绍了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: output_temp.append(" x ") for in range(self.row): output_temp.append(num_temp[x]) output_temp.append('\ny output_temp.append('---') y range(self.line): output_temp.append('\n'+num_temp[y]+'| if self.map_list[y][x]== '*': showmine== true: output_temp.append('* output_temp.append('# output_temp.append(self.map_list[y][x] + ' print ''.join(output_temp) def input_pos(self,y,x): """ 功能:输入扫雷位置 参数:输入整型x,y 表示要扫雷的位置,x为横坐标,y为纵坐标 99,刷新地图 88,结束游戏 返回: true:扫雷成功 false:扫雷失败 range(self.row) and self.step_count 1 #步数加一 #踩到地雷 self.result=2 #游戏结果设置失败 return true elif '#': #扫雷成功 self.queue.put(x) self.queue.put(y) self.bfs() false 99 or 99: #输入99,刷新地图 self.init_data() 88 88: #输入88,游戏结束 2 __name__== '__main__': game=Sweep_Mine() game.show_desc() #打印游戏说明 while #大循环输入游戏难度 level=raw_input("请选择游戏的难度\n输入:1、2、3\n") level.isdigit() !=True: #如果输入不是数字 print("无效,请输入数字!") continue int(level) game.set_level(level)== #选择难度成功推出 break print("难度选择失败!") game.check_result()== 0: #游戏没结束,一直循环输入x game.show_game() game.show_result() raw_input("input x:") y:") x.isdigit() y.isdigit() "无效,请输入数字!" int(x) int(y) game.input_pos(y,x): #输入扫雷的位置 "扫雷成功!" "输入位置错误!" game.show_game(true) #游戏结束 sys.exit(0)< pre>

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

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持html中文网。

以上就是python实现文字版扫雷的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » python