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): """ 功能:打印游戲說(shuō)明 """ print "==============================" print "| 游戲說(shuō)明 |" print "| |" print "| |" print "| # 為沒(méi)掃雷過(guò)的位置 |" print "| * 為地雷的位置 |" print "| 0 為空白區(qū)域 |" print "| 1-8為周?chē)椎臄?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() #打印游戲說(shuō)明 while True: #大循環(huán)輸入游戲難度 level = raw_input("請(qǐng)選擇游戲的難度\n輸入:1、2、3\n") if level.isdigit() != True: #如果輸入不是數(shù)字 print("無(wú)效,請(qǐng)輸入數(shù)字!") continue else: level = int(level) if game.set_level(level) == True: #選擇難度成功推出 break else: print("難度選擇失??!") while game.check_result() == 0: #游戲沒(méi)結(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 "無(wú)效,請(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-03Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程
今天小編就為大家分享一篇Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01pandas 數(shù)據(jù)索引與選取的實(shí)現(xiàn)方法
這篇文章主要介紹了pandas 數(shù)據(jù)索引與選取的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Django中如何使用Celery執(zhí)行異步任務(wù)
這篇文章主要介紹了Django中如何使用Celery執(zhí)行異步任務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11詳解修改Anaconda中的Jupyter Notebook默認(rèn)工作路徑的三種方式
這篇文章主要介紹了詳解修改Anaconda中的Jupyter Notebook默認(rèn)工作路徑的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置代碼(推薦)
這篇文章主要介紹了Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04