python扫雷文字程序_python实现文字版扫雷

本文实例为大家分享了python实现文字版扫雷的具体代码,供大家参考,具体内容如下

python版本:2.7

游戏运行图:

j2doguzjvi0.jpg

代码已经注释得很清楚,不废话了,直接上代码:

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经典小游戏汇总

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

本文标题: python实现文字版扫雷

本文地址: http://www.cppcns.com/jiaoben/python/309751.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值