日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python用tkinter開發的掃雷游戲

瀏覽:56日期:2022-06-17 18:46:01
目錄2.實現代碼3.另一種精致一點的實現1.實現效果

python用tkinter開發的掃雷游戲

python用tkinter開發的掃雷游戲

2.實現代碼

# 導入所需庫from tkinter import *import randomclass main: # 定義一個類,繼承 tkinter 的 Button # 用來保存按鈕的狀態和在網格布局中的位置 class minebtn(Button):def __init__(self,master,xy,**kw): Button.__init__(self,master,**kw) self.xy = xy self._state = 0 # 狀態 # 0: 未點開 # 1: 已點開 # 2: 標記 # 3: 問號def __init__(self):# 定義規格及雷數self.width = 9self.height = 9self.minenum = 10# Windows 7 默認的三種規格和雷數# 9*9,10# 16*16,40# 16*32,99self.rest = self.minenum # 剩余未標記的雷# 雷數的顏色self.colorlist = [’green’,# 綠色 ’DodgerBlue’,# 淺藍色 ’DarkOrange1’,# 橙色 ’blue’,# 藍色 ’red’,# 紅色 ’Chocolate4’,# 棕色 ’grey’,# 灰色 ’black’]# 黑色self.setgui() def setgui(self):# GUI界面self.root = Tk()self.root.title(’掃雷’)self.restlabel = Label(self.root,text=f’剩余:{self.minenum}’)self.restlabel.grid(row=0,column=0,columnspan=3)self.mineplace = random.sample(range(self.width*self.height),self.minenum) # 隨機抽取雷self.mineplace = [(x%self.width,x//self.height) for x in self.mineplace] # 將雷的序號轉變為坐標self.mines = {}for y in range(self.height): for x in range(self.width):self.mines[(x,y)] = self.minebtn(self.root,xy=(x,y),font=(’黑體’,8,’bold’),width=2,bd=1,relief=’ridge’)self.mines[(x,y)].bind(’<ButtonRelease-1>’,lambda event:self._open(event.widget)) # 左鍵單擊點開self.mines[(x,y)].bind(’<ButtonRelease-3>’,lambda event:self.make(event.widget)) # 右鍵單擊事件self.mines[(x,y)].grid(row=y+1,column=x,sticky=’nswe’)self.root.mainloop() # 點開 def _open(self,widget):xy = widget.xyx = xy[0]y = xy[1] # 獲取當前按鈕的坐標# 如果是雷則顯示全部雷的位置if widget.xy in self.mineplace: self.showmine() return# 如果已經點開了就什么也不做if widget._state == 1: returnwidget.configure(relief=’flat’,bg=’white’) # 更改當前按鈕的樣式widget._state = 1 # 按鈕狀態設為點開# 獲取周圍八個雷的坐標around = [(x-1,y-1),(x,y-1),(x+1,y-1),(x-1,y),(x+1,y),(x-1,y+1),(x,y+1),(x+1,y+1)]_sum = 0around_ = []for o, p in around: # 排除掉在雷區之外的雷 if 0 <= o <= self.width - 1 and 0 <= p <= self.height - 1:around_.append((o,p))# 計算周圍的雷數if self.mines[(o,p)].xy in self.mineplace: _sum += 1#如果周圍沒有雷則打開周圍未標記的雷,直到有雷為止if _sum == 0: widget[’text’] = ’’ for i, j in around:if self.mines[(i,j)]._state == 0: self._open(self.mines[(i,j)])else: widget[’text’] = _sum # 顯示雷數 # 對應數字設置對應顏色 widget[’fg’] = self.colorlist[_sum-1] # 右鍵單擊設置標記/問號 def make(self,widget):string = {0:’’,2:’♀’,3:’?’}if widget._state == 0: widget._state = 2 widget[’text’] = string[2] self.rest -= 1 self.restlabel[’text’] = f’剩余:{self.rest}’ elif widget._state == 2: widget._state = 3 widget[’text’] = string[3] self.rest += 1 self.restlabel[’text’] = f’剩余:{self.rest}’ elif widget._state == 3: widget._state = 0 widget[’text’] = string[0] # 如果踩到雷,顯示所有的雷 def showmine(self):for i, j in self.mineplace: self.mines[(i,j)].configure(text=’ி’,fg=’red’)main()3.另一種精致一點的實現

項目地址

需要導入額外的圖片和字體資源,在上面的項目地址里可以下載到

代碼

import sysimport timeimport randomimport pygamefrom pygame.locals import *BLOCK_WIDTH = 30BLOCK_HEIGHT = 16# 塊大小SIZE = 20# 地雷數MINE_COUNT = 66# 未點擊normal = 1# 已點擊opened = 2# 地雷mine = 3# 標記為地雷flag = 4# 標記為問號ask = 5# 踩中地雷bomb = 6# 被雙擊的周圍hint = 7# 正被鼠標左右鍵雙擊double = 8readied = 1,started = 2,over = 3,win = 4class Mine: def __init__(self, x, y, value=0):self._x = xself._y = yself._value = 0self._around_mine_count = -1self._status = normalself.set_value(value) def __repr__(self):return str(self._value) def get_x(self):return self._x def set_x(self, x):self._x = x x = property(fget=get_x, fset=set_x) def get_y(self):return self._y def set_y(self, y):self._y = y y = property(fget=get_y, fset=set_y) def get_value(self):return self._value def set_value(self, value):if value: self._value = 1else: self._value = 0 value = property(fget=get_value, fset=set_value, doc=’0:非地雷 1:雷’) def get_around_mine_count(self):return self._around_mine_count def set_around_mine_count(self, around_mine_count):self._around_mine_count = around_mine_count around_mine_count = property(fget=get_around_mine_count, fset=set_around_mine_count, doc=’四周地雷數量’) def get_status(self):return self._status def set_status(self, value):self._status = value status = property(fget=get_status, fset=set_status, doc=’BlockStatus’)class MineBlock: def __init__(self):self._block = [[Mine(i, j) for i in range(BLOCK_WIDTH)] for j in range(BLOCK_HEIGHT)]# 埋雷for i in random.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT): self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1 def get_block(self):return self._block block = property(fget=get_block) def getmine(self, x, y):return self._block[y][x] def open_mine(self, x, y):# 踩到雷了if self._block[y][x].value: self._block[y][x].status = bomb return False# 先把狀態改為 openedself._block[y][x].status = openedaround = _get_around(x, y)_sum = 0for i, j in around: if self._block[j][i].value:_sum += 1self._block[y][x].around_mine_count = _sum# 如果周圍沒有雷,那么將周圍 8 個未中未點開的遞歸算一遍if _sum == 0: for i, j in around:if self._block[j][i].around_mine_count == -1: self.open_mine(i, j)return True def double_mouse_button_down(self, x, y):if self._block[y][x].around_mine_count == 0: return Trueself._block[y][x].status = doublearound = _get_around(x, y)# 周圍被標記的雷數量sumflag = 0for i, j in _get_around(x, y): if self._block[j][i].status == flag:sumflag += 1# 周邊的雷已經全部被標記result = Trueif sumflag == self._block[y][x].around_mine_count: for i, j in around:if self._block[j][i].status == normal: if not self.open_mine(i, j):result = Falseelse: for i, j in around:if self._block[j][i].status == normal: self._block[j][i].status = hintreturn result def double_mouse_button_up(self, x, y):self._block[y][x].status = openedfor i, j in _get_around(x, y): if self._block[j][i].status == hint:self._block[j][i].status = normal# 返回 (x, y) 周圍的點坐標def _get_around(x, y): return [(i, j) for i in range(max(0, x - 1), min(BLOCK_WIDTH - 1, x + 1) + 1) for j in range(max(0, y - 1), min(BLOCK_HEIGHT - 1, y + 1) + 1) if i != x or j != y]# 游戲屏幕的寬SCREEN_WIDTH = BLOCK_WIDTH * SIZE# 游戲屏幕的高SCREEN_HEIGHT = (BLOCK_HEIGHT + 2) * SIZEdef print_text(screen, font, x, y, text, fcolor=(255, 255, 255)): imgText = font.render(text, True, fcolor) screen.blit(imgText, (x, y))def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption(’掃雷’) # 得分的字體 font1 = pygame.font.Font(’resources/a.TTF’, SIZE * 2) fwidth, fheight = font1.size(’999’) red = (200, 40, 40) # 加載資源圖片,因為資源文件大小不一,所以做了統一的縮放處理 img0 = pygame.image.load(’resources/0.bmp’).convert() img0 = pygame.transform.smoothscale(img0, (SIZE, SIZE)) img1 = pygame.image.load(’resources/1.bmp’).convert() img1 = pygame.transform.smoothscale(img1, (SIZE, SIZE)) img2 = pygame.image.load(’resources/2.bmp’).convert() img2 = pygame.transform.smoothscale(img2, (SIZE, SIZE)) img3 = pygame.image.load(’resources/3.bmp’).convert() img3 = pygame.transform.smoothscale(img3, (SIZE, SIZE)) img4 = pygame.image.load(’resources/4.bmp’).convert() img4 = pygame.transform.smoothscale(img4, (SIZE, SIZE)) img5 = pygame.image.load(’resources/5.bmp’).convert() img5 = pygame.transform.smoothscale(img5, (SIZE, SIZE)) img6 = pygame.image.load(’resources/6.bmp’).convert() img6 = pygame.transform.smoothscale(img6, (SIZE, SIZE)) img7 = pygame.image.load(’resources/7.bmp’).convert() img7 = pygame.transform.smoothscale(img7, (SIZE, SIZE)) img8 = pygame.image.load(’resources/8.bmp’).convert() img8 = pygame.transform.smoothscale(img8, (SIZE, SIZE)) img_blank = pygame.image.load(’resources/blank.bmp’).convert() img_blank = pygame.transform.smoothscale(img_blank, (SIZE, SIZE)) img_flag = pygame.image.load(’resources/flag.bmp’).convert() img_flag = pygame.transform.smoothscale(img_flag, (SIZE, SIZE)) img_ask = pygame.image.load(’resources/ask.bmp’).convert() img_ask = pygame.transform.smoothscale(img_ask, (SIZE, SIZE)) img_mine = pygame.image.load(’resources/mine.bmp’).convert() img_mine = pygame.transform.smoothscale(img_mine, (SIZE, SIZE)) img_blood = pygame.image.load(’resources/blood.bmp’).convert() img_blood = pygame.transform.smoothscale(img_blood, (SIZE, SIZE)) img_error = pygame.image.load(’resources/error.bmp’).convert() img_error = pygame.transform.smoothscale(img_error, (SIZE, SIZE)) face_size = int(SIZE * 1.25) img_face_fail = pygame.image.load(’resources/face_fail.bmp’).convert() img_face_fail = pygame.transform.smoothscale(img_face_fail, (face_size, face_size)) img_face_normal = pygame.image.load(’resources/face_normal.bmp’).convert() img_face_normal = pygame.transform.smoothscale(img_face_normal, (face_size, face_size)) img_face_success = pygame.image.load(’resources/face_success.bmp’).convert() img_face_success = pygame.transform.smoothscale(img_face_success, (face_size, face_size)) face_pos_x = (SCREEN_WIDTH - face_size) // 2 face_pos_y = (SIZE * 2 - face_size) // 2 img_dict = {0: img0, 1: img1, 2: img2, 3: img3, 4: img4, 5: img5, 6: img6, 7: img7, 8: img8} bgcolor = (225, 225, 225) block = MineBlock() game_status = readied # 開始時間 start_time = None # 耗時 elapsed_time = 0 while True:screen.fill(bgcolor)for event in pygame.event.get(): if event.type == QUIT:sys.exit() elif event.type == MOUSEBUTTONDOWN:mouse_x, mouse_y = event.posx = mouse_x // SIZEy = mouse_y // SIZE - 2b1, b2, b3 = pygame.mouse.get_pressed()if game_status == started: # 鼠標左右鍵同時按下,如果已經標記了所有雷,則打開周圍一圈;如果還未標記完所有雷,則有一個周圍一圈被同時按下的效果 if b1 and b3:mine = block.getmine(x, y)if mine.status == opened: if not block.double_mouse_button_down(x, y):game_status = over elif event.type == MOUSEBUTTONUP:if y < 0: if face_pos_x <= mouse_x <= face_pos_x + face_size and face_pos_y <= mouse_y <= face_pos_y + face_size:game_status = readiedblock = MineBlock()start_time = time.time()elapsed_time = 0continueif game_status == readied: game_status = started start_time = time.time() elapsed_time = 0if game_status == started: mine = block.getmine(x, y) # 按鼠標左鍵 if b1 and not b3:if mine.status == normal: if not block.open_mine(x, y):game_status = over # 按鼠標右鍵 elif not b1 and b3:if mine.status == normal: mine.status = flagelif mine.status == flag: mine.status = askelif mine.status == ask: mine.status = normal elif b1 and b3:if mine.status == double: block.double_mouse_button_up(x, y)flag_count = 0opened_count = 0for row in block.block: for mine in row:pos = (mine.x * SIZE, (mine.y + 2) * SIZE)if mine.status == opened: screen.blit(img_dict[mine.around_mine_count], pos) opened_count += 1elif mine.status == double: screen.blit(img_dict[mine.around_mine_count], pos)elif mine.status == bomb: screen.blit(img_blood, pos)elif mine.status == flag: screen.blit(img_flag, pos) flag_count += 1elif mine.status == ask: screen.blit(img_ask, pos)elif mine.status == hint: screen.blit(img0, pos)elif game_status == over and mine.value: screen.blit(img_mine, pos)elif mine.value == 0 and mine.status == flag: screen.blit(img_error, pos)elif mine.status == normal: screen.blit(img_blank, pos)print_text(screen, font1, 30, (SIZE * 2 - fheight) // 2 - 2, ’%02d’ % (MINE_COUNT - flag_count), red)if game_status == started: elapsed_time = int(time.time() - start_time)print_text(screen, font1, SCREEN_WIDTH - fwidth - 30, (SIZE * 2 - fheight) // 2 - 2, ’%03d’ % elapsed_time, red)if flag_count + opened_count == BLOCK_WIDTH * BLOCK_HEIGHT: game_status = winif game_status == over: screen.blit(img_face_fail, (face_pos_x, face_pos_y))elif game_status == win: screen.blit(img_face_success, (face_pos_x, face_pos_y))else: screen.blit(img_face_normal, (face_pos_x, face_pos_y))pygame.display.update()if __name__ == ’__main__’: main()

以上就是python用tkinter開發的掃雷游戲的詳細內容,更多關于python 掃雷游戲的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美少妇精品| 婷婷综合福利| 蘑菇福利视频一区播放| 亚洲激情社区| 国产欧美日韩| 亚州精品视频| 女生影院久久| 久久精品一区| 久久精品99国产精品日本| 久久久影院免费| 国产乱子精品一区二区在线观看| 欧美日韩一区二区三区视频播放| 麻豆一区二区在线| 欧美精品观看| 国产精品亚洲综合久久| 亚洲日产国产精品| 一区二区三区午夜视频| 亚洲精品小说| 亚洲欧美日韩国产| 欧美日韩国产探花| 欧美日韩精品一本二本三本| 亚洲国产综合在线看不卡| 国产精品色在线网站| 成人国产精品一区二区网站| 免费污视频在线一区| 91精品国产成人观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲人成亚洲精品| 国产视频一区二| 亚洲成av人片一区二区密柚| 日本不卡视频在线观看| 中文在线中文资源| 日韩精彩视频在线观看| 少妇久久久久| 久久99精品久久久久久园产越南| 99热精品在线| 亚洲男人在线| 欧产日产国产精品视频| 青青草精品视频| 91精品高清| 国产精选在线| 久久国产视频网| 视频一区国产视频| 欧美1区2区3区| 精品一区二区三区的国产在线观看| 婷婷亚洲综合| 欧美99久久| 欧美一区久久久| 久久精品国产网站| 国产精品扒开腿做爽爽爽软件| 成人在线视频中文字幕| 久久激五月天综合精品| 亚洲一区欧美激情| 精品丝袜在线| 日韩一区自拍| 捆绑调教日本一区二区三区| 久久av超碰| 国产精品一区二区中文字幕| 最新亚洲国产| 婷婷综合一区| 性色一区二区| 午夜欧美在线| 国产中文一区| 香蕉成人久久| 日韩精品免费观看视频| 亚洲深爱激情| 亚洲我射av| 久久国产婷婷国产香蕉| 免费看一区二区三区| 国产精品115| 午夜欧美巨大性欧美巨大| 成人日韩在线观看| 国产亚洲福利| 日本一不卡视频| 久久免费精品| 久久蜜桃精品| 石原莉奈一区二区三区在线观看| 亚洲男人在线| 久久精品国内一区二区三区| 日韩久久精品网| 日韩网站在线| 国产精品香蕉| 久久久人人人| 欧美影院视频| 亚洲国产日韩欧美在线| 青草国产精品久久久久久| 老司机精品视频在线播放| 国产麻豆久久| 日韩国产欧美一区二区三区| 黑人精品一区| 日本在线不卡视频| 欧美日韩尤物久久| 综合一区在线| 99视频精品全部免费在线视频| 日本在线不卡视频| 日本免费一区二区三区四区| 视频一区中文字幕精品| 日韩在线观看一区| 日本成人在线视频网站| 日韩电影在线视频| 国产精品啊v在线| 亚洲人成高清| 在线综合欧美| 亚洲成人二区| 日韩成人精品一区二区| 日韩高清欧美激情| 亚洲欧美日韩视频二区| 久久激情一区| 国产一区二区色噜噜| 国产亚洲人成a在线v网站 | 亚洲午夜视频| 久久久久久一区二区| 国产精品乱战久久久| 亚洲tv在线| 天堂av在线一区| 激情婷婷亚洲| 日本国产精品| 成人免费网站www网站高清| 国产成人精品亚洲线观看 | 麻豆成全视频免费观看在线看| 亚洲精品少妇| 亚洲伊人精品酒店| 蜜臀va亚洲va欧美va天堂| 国产视频亚洲| 蜜桃视频在线观看一区| 中文不卡在线| 日本久久二区| 国产精品一区二区三区四区在线观看 | 国产精品毛片久久久| 久久99久久久精品欧美| 国产亚洲欧美日韩精品一区二区三区| 免费在线视频一区| 男人的天堂久久精品| 国产剧情一区| 国产精品久久久久久模特| 国产探花一区二区| 麻豆精品蜜桃视频网站| 久久精品亚洲| 久久精品主播| 亚洲一区二区毛片| 日韩一二三区在线观看| 日本中文字幕视频一区| 日韩高清不卡在线| 精品网站999| 亚洲婷婷在线| 日韩欧美高清一区二区三区| 国产精品久久国产愉拍| 日韩成人高清| 亚洲一二av| 国产一区二区精品久| 国产99久久久国产精品成人免费| 91成人精品视频| 日韩1区2区3区| 色偷偷色偷偷色偷偷在线视频| 欧美日韩第一| 欧美一区自拍| 久久人人97超碰国产公开结果| 欧美~级网站不卡| 日本a级不卡| 久久视频一区| 国产精品久一| 免费美女久久99| 精品国产乱码久久久久久樱花| 中文字幕一区久| 亚洲精品自拍| 欧美特黄视频| 日韩欧美一区二区三区免费观看| 日韩中文字幕无砖| 亚洲精品网址| 久久久国产亚洲精品| 国产精品欧美在线观看| 中文字幕免费一区二区| 97精品在线| 精品国产网站| 国产欧美88| 亚洲精品极品| 亚洲一区二区三区中文字幕在线观看| 亚洲黄色中文字幕| 91欧美精品| 国产调教精品| 国产亚洲电影| 久久狠狠亚洲综合| 欧美日韩视频免费看| 亚洲美女久久| 在线观看亚洲精品福利片| 99国产精品视频免费观看一公开 | 亚洲国产欧美日本视频| 国产精品a久久久久| 亚洲啊v在线免费视频| 综合一区二区三区| 中文字幕一区二区三区四区久久 | 欧美1区二区| 黄色欧美在线| 你懂的网址国产 欧美| 久久99性xxx老妇胖精品| 国产精品红桃| 激情久久99| 久久久久国产一区二区| 久久国产亚洲精品| 欧美日韩精品一区二区视频|