网络编程
位置:首页>> 网络编程>> Python编程>> python实现文字版扫雷

python实现文字版扫雷

作者:爱面条的可达  发布时间:2023-01-01 13:01:47 

标签:python,扫雷

本文实例为大家分享了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)

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

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

来源:https://blog.csdn.net/haha1fan/article/details/78997072

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com