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

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

python實(shí)現(xiàn)掃雷游戲的示例

瀏覽:22日期:2022-07-07 17:11:17

掃雷是一款益智類小游戲,最早于 1992 年由微軟在 Windows 上發(fā)行,游戲適合于全年齡段,規(guī)則簡(jiǎn)單,即在最短的時(shí)間內(nèi)找出所有非雷格子且在中間過(guò)程中不能踩到雷, 踩到雷則失敗,需重新開始。

本文我們使用 Python 來(lái)實(shí)現(xiàn)掃雷游戲,主要用的 Python 庫(kù)是 pygame。

實(shí)現(xiàn)

游戲組成比較簡(jiǎn)單,主要包括:小方格、計(jì)時(shí)器、地雷等。

首先,我們初始化一些常量,比如:橫豎方塊數(shù)、地雷數(shù)、鼠標(biāo)點(diǎn)擊情況等,如下所示:

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 = 4

接著定義一個(gè)地雷類,類中定義一些基本屬性(如:坐標(biāo)、狀態(tài)等)及 get、set 方法,代碼實(shí)現(xiàn)如下:

class Mine: def __init__(self, x, y, value=0): self._x = x self._y = y self._value = 0 self._around_mine_count = -1 self._status = normal self.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 = 1 else: 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’)

再接著定義一個(gè) MineBlock 類,用來(lái)處理掃雷的基本邏輯,代碼實(shí)現(xiàn)如下:

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)改為 opened self._block[y][x].status = opened around = _get_around(x, y) _sum = 0 for i, j in around: if self._block[j][i].value: _sum += 1 self._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 True self._block[y][x].status = double around = _get_around(x, y) # 周圍被標(biāo)記的雷數(shù)量 sumflag = 0 for i, j in _get_around(x, y): if self._block[j][i].status == flag: sumflag += 1 # 周邊的雷已經(jīng)全部被標(biāo)記 result = True if 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 = False else: for i, j in around: if self._block[j][i].status == normal: self._block[j][i].status = hint return result def double_mouse_button_up(self, x, y): self._block[y][x].status = opened for i, j in _get_around(x, y): if self._block[j][i].status == hint: self._block[j][i].status = normal

我們接下來(lái)初始化界面,首先生成由小方格組成的面板,主要代碼實(shí)現(xiàn)如下

for 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)

看一下效果:

python實(shí)現(xiàn)掃雷游戲的示例

再接著添加面板的 head 部分,包括:顯示雷數(shù)、重新開始按鈕(笑臉)、顯示耗時(shí),主要代碼實(shí)現(xiàn)如下:

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))

看一下效果:

python實(shí)現(xiàn)掃雷游戲的示例

再接著添加各種點(diǎn)擊事件,代碼實(shí)現(xiàn)如下:

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 = overelif 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 = startedstart_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 = normalelif b1 and b3:if mine.status == double:block.double_mouse_button_up(x, y)

我們來(lái)看一下最終實(shí)現(xiàn)效果:

python實(shí)現(xiàn)掃雷游戲的示例

總結(jié)

本文我們通過(guò) Python 簡(jiǎn)單的實(shí)現(xiàn)了掃雷游戲,大家有興趣的話,可以實(shí)際操作一下,看看自己能否排除全部的雷。

完整代碼

項(xiàng)目地址

以上就是python實(shí)現(xiàn)掃雷游戲的示例的詳細(xì)內(nèi)容,更多關(guān)于python 掃雷的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆一区在线| 亚洲色诱最新| 国产伦一区二区三区| 清纯唯美亚洲综合一区| 日本少妇精品亚洲第一区| 深夜福利一区| 日韩精彩视频在线观看| 日本午夜精品久久久久| 视频一区二区中文字幕| 久久午夜精品| 日本不卡不码高清免费观看 | 国产九一精品| 日韩av网站在线免费观看| 国产精品一区二区三区av| 欧美交a欧美精品喷水| 丰满少妇一区| 欧美一级鲁丝片| 无码日韩精品一区二区免费| 国产日韩精品视频一区二区三区| 久久精品99国产精品| 麻豆国产精品| 日韩毛片在线| 夜夜嗨一区二区三区| 婷婷视频一区二区三区| 久久av影视| 亚洲成人国产| 涩涩涩久久久成人精品| 久久久精品国产**网站| 久久国产中文字幕| 亚洲欧洲美洲国产香蕉| 久久99影视| 日韩中文视频| 亚洲高清影视| 日本欧美在线| av资源新版天堂在线| 国产精品精品| 欧美天堂亚洲电影院在线观看| 亚洲尤物av| 欧美91在线|欧美| 久久精品国产99久久| 亚洲精品欧美| 日本黄色精品| 亚洲免费影视| 鲁大师精品99久久久| 蜜桃一区二区三区| 国产欧美日韩一区二区三区在线| 天堂av在线| 视频一区二区中文字幕| 国产一区二区三区四区五区| 亚洲激情二区| 国产欧美大片| 国产中文一区| 国产精品一区高清| 欧美日韩三区| 精品美女视频 | 国产中文欧美日韩在线| 在线亚洲自拍| 精品一区二区三区中文字幕在线| 精品1区2区3区4区| 天堂а√在线最新版中文在线| 日韩综合小视频| 久久久男人天堂| 亚洲香蕉视频| 日韩av有码| 日韩av中文在线观看| 秋霞影院一区二区三区| 久久精品av麻豆的观看方式| 国产亚洲精品久久久久婷婷瑜伽| 精品国产一区二区三区噜噜噜| 中文字幕免费一区二区| 久久精品动漫| 国产精品tv| 蜜桃av一区二区| 九九精品调教| 国产精品三p一区二区| 亚洲一区网站| se01亚洲视频| 国产精品男女| 久久国产精品久久久久久电车 | 亚洲福利精品| 国产在线观看91一区二区三区| 婷婷精品久久久久久久久久不卡| 欧美日韩激情| 91欧美在线| 国产日产一区| 在线精品亚洲| 国产精品av一区二区| 欧美a在线观看| 日韩国产欧美一区二区三区| 奶水喷射视频一区| 亚洲网站视频| 欧美黄色网页| 麻豆mv在线观看| 国产精品极品| 欧美精品影院| 婷婷亚洲精品| 亚洲精选91| 午夜在线视频观看日韩17c| 香蕉久久99| 日韩欧美看国产| 97精品在线| 国内精品伊人| 国产欧美午夜| 国产亚洲精品精品国产亚洲综合 | 少妇精品久久久一区二区三区| 午夜久久免费观看| 婷婷成人综合| 久久精品国产大片免费观看| 欧美日韩视频免费观看| 黄在线观看免费网站ktv| 欧美xxxx性| 嫩草伊人久久精品少妇av杨幂| 欧美一区成人| 国产日本亚洲| 国产亚洲人成a在线v网站| 亚洲精品三级| 日韩精品中文字幕吗一区二区 | 国产欧美综合一区二区三区| 欧美日韩 国产精品| 日韩av成人高清| 国产日韩中文在线中文字幕| 欧美片第1页综合| 国产精品亚洲四区在线观看| 国产精品久久乐| 老司机精品视频在线播放| 国产成人免费精品| 日本免费一区二区三区四区| 色在线视频观看| 欧美成人基地| 一区福利视频| 亚洲人亚洲人色久| 欧美一区网站| 麻豆国产欧美日韩综合精品二区| 麻豆精品视频在线| 丁香六月综合| 激情欧美国产欧美| 国产精品色网| 日本亚洲视频| 国产欧美精品久久| 九九久久国产| 日韩在线短视频| 午夜亚洲一区| 日本成人手机在线| 国产精品手机在线播放| 国产高清亚洲| 日韩精品永久网址| 自拍日韩欧美| 色狠狠一区二区三区| 国产精品男女| 四虎4545www国产精品| 国产视频一区在线观看一区免费| 亚洲日产国产精品| 另类小说一区二区三区| 亚洲福利久久| 日本午夜精品视频在线观看| 久久伊人国产| 蜜桃tv一区二区三区| 日韩av一区二| 国产精品专区免费| 亚洲欧美日韩国产一区| 国产日韩在线观看视频| 成人日韩在线观看| 亚洲开心激情| 国产成人精品免费视| 在线综合亚洲| 国产精品高潮呻吟久久久久| 福利在线免费视频| 视频在线观看国产精品| 美腿丝袜亚洲一区| 99国产精品自拍| 欧美韩一区二区| 91九色精品| 国产欧美欧美| 蜜桃一区二区三区| 国产日韩欧美一区二区三区在线观看 | 欧美va天堂在线| 午夜久久av| 日韩一区二区在线免费| 免费成人在线影院| 美女久久99| 亚洲欧美日本日韩| 97精品国产福利一区二区三区| 免费一级片91| 精品色999| 亚洲永久精品唐人导航网址| 成人污污视频| 一区二区三区网站| 另类专区亚洲| 日韩1区2区3区| 久久亚洲国产| 久久影视三级福利片| 亚洲色图国产| 久久狠狠婷婷| 久久三级毛片| 亚洲日韩中文字幕一区| 欧美亚洲激情| 日产精品一区二区| 欧美欧美黄在线二区| 色综合www| 国产探花在线精品|