用python写文字版扫雷

编程入门 行业动态 更新时间:2024-10-25 14:29:38

用python写<a href=https://www.elefans.com/category/jswz/34/1462767.html style=文字版扫雷"/>

用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 "

============================"

print RESULT_DATA.get(self.result) #从RESULT_DATA中打印结果数据

print "

地雷数 : %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("

Y ")

for x in range(self.row):

output_temp.append("---")

for y in range(self.line):

output_temp.append("

"+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("请选择游戏的难度

输入:1、2、3

")

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写文字版扫雷

本文发布于:2024-03-08 21:34:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文字版   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!