溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python如何實現(xiàn)文字版掃雷

發(fā)布時間:2020-07-31 10:29:21 來源:億速云 閱讀:169 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要講解了python如何實現(xiàn)文字版掃雷,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

python版本:2.7

游戲運行圖:

python如何實現(xiàn)文字版掃雷

代碼已經(jīng)注釋得很清楚,不廢話了,直接上代碼:
2個算法:1、隨機數(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)計",
 1:" 游戲勝利",
 2:" 游戲失敗" 
}


class Sweep_Mine(object):
 def __init__(self):
 """
 功能:實例化函數(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)計
  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個隨機數(shù)
 for i in random_list:
 x = i%self.row    #用隨機數(shù)對橫取余
 y = i/self.row    #用隨機數(shù)對橫取商
 self.map_list[y][x] = '*'   #隨機位置設(shè)置雷

 def set_level(self,lvl):
 """
 功能:設(shè)置游戲難度
 參數(shù):
 lvl 為 1 2 3 不同難度
 返回: 
 True 設(shè)置等級成功
 False 設(shè)置等級失敗
 """
 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])  #暫時保存到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隊列里面
  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):
 """
 功能:顯示掃雷地圖
 參數(shù):默認(rèn)showmine 為 False 普通顯示,隱藏地雷的位置
  showmine 為 True 特殊顯示,顯示地圖中地雷的位置
 """
 output_temp = []  #保存輸出字符
 num_temp = []  #保存橫縱坐標(biāo)的序號
 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):
 """
 功能:輸入掃雷位置
 參數(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("請選擇游戲的難度\n輸入:1、2、3\n")
 if level.isdigit() != True: #如果輸入不是數(shù)字
 print("無效,請輸入數(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 "無效,請輸入數(shù)字!"
 continue
 else:
 x = int(x)
 y = int(y)
 if game.input_pos(y,x):  #輸入掃雷的位置
 print "掃雷成功!"
 else:
 print "輸入位置錯誤!"
 game.show_game(True)  #游戲結(jié)束
 game.show_result()
 sys.exit(0)

看完上述內(nèi)容,是不是對python如何實現(xiàn)文字版掃雷有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI