python實(shí)現(xiàn)文字版掃雷
本文實(shí)例為大家分享了python實(shí)現(xiàn)文字版掃雷的具體代碼,供大家參考,具體內(nèi)容如下
python版本:2.7
游戲運(yùn)行圖:

代碼已經(jīng)注釋得很清楚,不廢話了,直接上代碼:
2個(gè)算法:1、隨機(jī)數(shù)生成算法,2、廣度優(yōu)先
#coding:utf-8
import sys
import random
import Queue
#保存不同游戲難度數(shù)據(jù) 格式:難度:(row,line,mine)
DIFFICUL_DATA = {1:(8,8,5),2:(10,10,20),3:(15,15,100)}
#保存不同游戲結(jié)果的一些數(shù)據(jù)
RESULT_DATA = {
0:" 數(shù)據(jù)統(tǒng)計(jì)",
1:" 游戲勝利",
2:" 游戲失敗"
}
class Sweep_Mine(object):
def __init__(self):
"""
功能:實(shí)例化函數(shù)
"""
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 # 保存游戲結(jié)果、0:還未結(jié)束,1:游戲勝利,2:游戲失敗
self.queue = Queue.Queue()
def show_desc(self):
"""
功能:打印游戲說明
"""
print "=============================="
print "| 游戲說明 |"
print "| |"
print "| |"
print "| # 為沒掃雷過的位置 |"
print "| * 為地雷的位置 |"
print "| 0 為空白區(qū)域 |"
print "| 1-8為周圍雷的數(shù)目 |"
print "| |"
print "| |"
print "| 輸入X/Y: 掃雷的位置 |"
print "| X/Y輸入99: 刷新地圖 |"
print "| X/Y輸入88: 退出游戲 |"
print "| |"
print "=============================="
print "------------------------------"
def show_result(self):
"""
功能:打印信息顯示
參數(shù):
select 0 打印數(shù)據(jù)統(tǒng)計(jì)
1 打印游戲勝利
2 打印游戲結(jié)束
"""
print "\n============================"
print RESULT_DATA.get(self.result) #從RESULT_DATA中打印結(jié)果數(shù)據(jù)
print "\n 地雷數(shù) : %d 步數(shù) :%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):
"""
功能:難度選擇,數(shù)據(jù)初始化
"""
self.clean_count = 0
self.step_count = 0
self.row = DIFFICUL_DATA[self.level][0] #從全局變量Grade_Data獲取難度數(shù)據(jù)
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個(gè)隨機(jī)數(shù)
for i in random_list:
x = i%self.row #用隨機(jī)數(shù)對(duì)橫取余
y = i/self.row #用隨機(jī)數(shù)對(duì)橫取商
self.map_list[y][x] = '*' #隨機(jī)位置設(shè)置雷
def set_level(self,lvl):
"""
功能:設(shè)置游戲難度
參數(shù):
lvl 為 1 2 3 不同難度
返回:
True 設(shè)置等級(jí)成功
False 設(shè)置等級(jí)失敗
"""
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 未結(jié)束
1 勝利
2 失敗
"""
if self.row*self.line-self.clean_count <= self.mine_num:
self.result = 1
return self.result
def bfs(self):
"""
BFS廣度優(yōu)先搜索空白區(qū)
"""
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]) #暫時(shí)保存到queue_temp
if mine > 0:
self.map_list[q_y][q_x] = str(mine) #標(biāo)注雷的數(shù)目
queue_temp = [] #清空queue_temp
else:
self.map_list[q_y][q_x] = '0' #設(shè)置為空白區(qū)'0'
while len(queue_temp): #將queue_temp里面的值放到queue隊(duì)列里面
temp = queue_temp.pop(0)
self.map_list[temp[0]][temp[1]] = '0' #防止回頭
self.queue.put(temp[1]) #將空白的點(diǎn)加入隊(duì)列
self.queue.put(temp[0])
def show_game(self,showmine=False):
"""
功能:顯示掃雷地圖
參數(shù):默認(rèn)showmine 為 False 普通顯示,隱藏地雷的位置
showmine 為 True 特殊顯示,顯示地圖中地雷的位置
"""
output_temp = [] #保存輸出字符
num_temp = [] #保存橫縱坐標(biāo)的序號(hào)
len = self.row if self.row >= self.line else self.line #保存row或line長(zhǎng)的一邊
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):
"""
功能:輸入掃雷位置
參數(shù):輸入整型x,y
表示要掃雷的位置,x為橫坐標(biāo),y為縱坐標(biāo)
x/y = 99,刷新地圖
x/y = 88,結(jié)束游戲
返回:
True:掃雷成功
False:掃雷失敗
"""
if x in range(self.row) and y in range(self.line):
self.step_count += 1 #步數(shù)加一
if self.map_list[y][x] == '*': #踩到地雷
self.result = 2 #游戲結(jié)果設(shè)置失敗
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,游戲結(jié)束
self.result = 2
return True
else:
return False
if __name__ == '__main__':
game = Sweep_Mine()
game.show_desc() #打印游戲說明
while True: #大循環(huán)輸入游戲難度
level = raw_input("請(qǐng)選擇游戲的難度\n輸入:1、2、3\n")
if level.isdigit() != True: #如果輸入不是數(shù)字
print("無效,請(qǐng)輸入數(shù)字!")
continue
else:
level = int(level)
if game.set_level(level) == True: #選擇難度成功推出
break
else:
print("難度選擇失??!")
while game.check_result() == 0: #游戲沒結(jié)束,一直循環(huán)輸入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: #如果輸入不是數(shù)字
print "無效,請(qǐng)輸入數(shù)字!"
continue
else:
x = int(x)
y = int(y)
if game.input_pos(y,x): #輸入掃雷的位置
print "掃雷成功!"
else:
print "輸入位置錯(cuò)誤!"
game.show_game(True) #游戲結(jié)束
game.show_result()
sys.exit(0)
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程
今天小編就為大家分享一篇Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
pandas 數(shù)據(jù)索引與選取的實(shí)現(xiàn)方法
這篇文章主要介紹了pandas 數(shù)據(jù)索引與選取的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Django中如何使用Celery執(zhí)行異步任務(wù)
這篇文章主要介紹了Django中如何使用Celery執(zhí)行異步任務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
詳解修改Anaconda中的Jupyter Notebook默認(rèn)工作路徑的三種方式
這篇文章主要介紹了詳解修改Anaconda中的Jupyter Notebook默認(rèn)工作路徑的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置代碼(推薦)
這篇文章主要介紹了Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04

