电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python用tkinter開發(fā)的掃雷游戲

瀏覽:11日期:2022-06-17 18:46:01
目錄2.實(shí)現(xiàn)代碼3.另一種精致一點(diǎn)的實(shí)現(xiàn)1.實(shí)現(xiàn)效果

python用tkinter開發(fā)的掃雷游戲

python用tkinter開發(fā)的掃雷游戲

2.實(shí)現(xiàn)代碼

# 導(dǎo)入所需庫from tkinter import *import randomclass main: # 定義一個(gè)類,繼承 tkinter 的 Button # 用來保存按鈕的狀態(tài)和在網(wǎng)格布局中的位置 class minebtn(Button):def __init__(self,master,xy,**kw): Button.__init__(self,master,**kw) self.xy = xy self._state = 0 # 狀態(tài) # 0: 未點(diǎn)開 # 1: 已點(diǎn)開 # 2: 標(biāo)記 # 3: 問號(hào)def __init__(self):# 定義規(guī)格及雷數(shù)self.width = 9self.height = 9self.minenum = 10# Windows 7 默認(rèn)的三種規(guī)格和雷數(shù)# 9*9,10# 16*16,40# 16*32,99self.rest = self.minenum # 剩余未標(biāo)記的雷# 雷數(shù)的顏色self.colorlist = [’green’,# 綠色 ’DodgerBlue’,# 淺藍(lán)色 ’DarkOrange1’,# 橙色 ’blue’,# 藍(lán)色 ’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) # 隨機(jī)抽取雷self.mineplace = [(x%self.width,x//self.height) for x in self.mineplace] # 將雷的序號(hào)轉(zhuǎn)變?yōu)樽鴺?biāo)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)) # 左鍵單擊點(diǎn)開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() # 點(diǎn)開 def _open(self,widget):xy = widget.xyx = xy[0]y = xy[1] # 獲取當(dāng)前按鈕的坐標(biāo)# 如果是雷則顯示全部雷的位置if widget.xy in self.mineplace: self.showmine() return# 如果已經(jīng)點(diǎn)開了就什么也不做if widget._state == 1: returnwidget.configure(relief=’flat’,bg=’white’) # 更改當(dāng)前按鈕的樣式widget._state = 1 # 按鈕狀態(tài)設(shè)為點(diǎn)開# 獲取周圍八個(gè)雷的坐標(biāo)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: # 排除掉在雷區(qū)之外的雷 if 0 <= o <= self.width - 1 and 0 <= p <= self.height - 1:around_.append((o,p))# 計(jì)算周圍的雷數(shù)if self.mines[(o,p)].xy in self.mineplace: _sum += 1#如果周圍沒有雷則打開周圍未標(biāo)記的雷,直到有雷為止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 # 顯示雷數(shù) # 對(duì)應(yīng)數(shù)字設(shè)置對(duì)應(yīng)顏色 widget[’fg’] = self.colorlist[_sum-1] # 右鍵單擊設(shè)置標(biāo)記/問號(hào) 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.另一種精致一點(diǎn)的實(shí)現(xiàn)

項(xiàng)目地址

需要導(dǎo)入額外的圖片和字體資源,在上面的項(xiàng)目地址里可以下載到

代碼

import sysimport timeimport randomimport pygamefrom pygame.locals import *BLOCK_WIDTH = 30BLOCK_HEIGHT = 16# 塊大小SIZE = 20# 地雷數(shù)MINE_COUNT = 66# 未點(diǎn)擊normal = 1# 已點(diǎn)擊opened = 2# 地雷mine = 3# 標(biāo)記為地雷flag = 4# 標(biāo)記為問號(hào)ask = 5# 踩中地雷bomb = 6# 被雙擊的周圍hint = 7# 正被鼠標(biāo)左右鍵雙擊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=’四周地雷數(shù)量’) 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# 先把狀態(tài)改為 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 個(gè)未中未點(diǎn)開的遞歸算一遍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)# 周圍被標(biāo)記的雷數(shù)量sumflag = 0for i, j in _get_around(x, y): if self._block[j][i].status == flag:sumflag += 1# 周邊的雷已經(jīng)全部被標(biāo)記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) 周圍的點(diǎn)坐標(biāo)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) # 加載資源圖片,因?yàn)橘Y源文件大小不一,所以做了統(tǒng)一的縮放處理 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 # 開始時(shí)間 start_time = None # 耗時(shí) 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: # 鼠標(biāo)左右鍵同時(shí)按下,如果已經(jīng)標(biāo)記了所有雷,則打開周圍一圈;如果還未標(biāo)記完所有雷,則有一個(gè)周圍一圈被同時(shí)按下的效果 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) # 按鼠標(biāo)左鍵 if b1 and not b3:if mine.status == normal: if not block.open_mine(x, y):game_status = over # 按鼠標(biāo)右鍵 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開發(fā)的掃雷游戲的詳細(xì)內(nèi)容,更多關(guān)于python 掃雷游戲的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 14米地磅厂家价价格,150吨地磅厂家价格-百科| 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 智能气瓶柜(大型气瓶储存柜)百科 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | HDPE储罐_厂家-山东九州阿丽贝防腐设备| 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 行星齿轮减速机,减速机厂家,山东减速机-淄博兴江机械制造 | 电渗析,废酸回收,双极膜-山东天维膜技术有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 重庆中专|职高|技校招生-重庆中专招生网 |