这篇文章主要讲解了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:
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如何实现文字版扫雷有进一步的了解,如果还想学习更多内容,欢迎关注天达云行业资讯频道。