python實戰(zhàn)游戲之史上最難最虐的掃雷游戲沒有之一
導(dǎo)語
每日游戲更新系列——今天帶大家來看看掃雷小游戲!
它是許多人接觸到的第一款游戲,大概也是廣大辦公族和無網(wǎng)學(xué)生無聊時消遣的最佳游戲。
在那些還沒有網(wǎng)(被切斷網(wǎng))的歲月,掃雷曾陪伴無數(shù)人度過了他們的童年。你的最佳紀(jì)錄是多少了?
對于許多90后、00后來說,掃雷這個電腦上自帶的小游戲早就變成古早的歷史,再一次提到掃雷這個名字的時候,對許多人來說,仿佛就是上世紀(jì)的事情了。
就像是偶爾點開微信的跳一跳小游戲,發(fā)現(xiàn)排行榜上還有人在孤獨的霸榜一樣。已經(jīng)2021年了,還有許多90后、00后堅守在掃雷這個游戲上~
正文
首先準(zhǔn)備好相應(yīng)的素材可自選:
環(huán)境安裝:依舊是游戲模塊pygame,python3.6,pycharm2021。
pip install pygame
游戲規(guī)則:
在有限的時間里面用最短的時間找到所有的雷,每個數(shù)字代表附近有幾顆雷,踩到雷結(jié)束,找到全部的雷即過關(guān)。
導(dǎo)入所有的字體,圖片等:
def main(): pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('掃雷小游戲') images = {} for key, value in cfg.IMAGE_PATHS.items(): if key in ['face_fail', 'face_normal', 'face_success']: image = pygame.image.load(value) images[key] = pygame.transform.smoothscale(image, (int(cfg.GRIDSIZE*1.25), int(cfg.GRIDSIZE*1.25))) else: image = pygame.image.load(value).convert() images[key] = pygame.transform.smoothscale(image, (cfg.GRIDSIZE, cfg.GRIDSIZE)) font = pygame.font.Font(cfg.FONT_PATH, cfg.FONT_SIZE) pygame.mixer.music.load(cfg.BGM_PATH) pygame.mixer.music.play(-1)
定義表情按鈕,點開微笑即可重新開始游戲!
class EmojiButton(pygame.sprite.Sprite): def __init__(self, images, position, status_code=0, **kwargs): pygame.sprite.Sprite.__init__(self) # 導(dǎo)入圖片 self.images = images self.image = self.images['face_normal'] self.rect = self.image.get_rect() self.rect.left, self.rect.top = position # 表情按鈕的當(dāng)前狀態(tài) self.status_code = status_code '''畫到屏幕上''' def draw(self, screen): # 狀態(tài)碼為0, 代表正常的表情 if self.status_code == 0: self.image = self.images['face_normal'] # 狀態(tài)碼為1, 代表失敗的表情 elif self.status_code == 1: self.image = self.images['face_fail'] # 狀態(tài)碼為2, 代表成功的表情 elif self.status_code == 2: self.image = self.images['face_success'] # 綁定圖片到屏幕 screen.blit(self.image, self.rect) '''設(shè)置當(dāng)前的按鈕的狀態(tài)''' def setstatus(self, status_code): self.status_code = status_code
隨機生成雷:
class MinesweeperMap(): def __init__(self, cfg, images, **kwargs): self.cfg = cfg # 雷型矩陣 self.mines_matrix = [] for j in range(cfg.GAME_MATRIX_SIZE[1]): mines_line = [] for i in range(cfg.GAME_MATRIX_SIZE[0]): position = i * cfg.GRIDSIZE + cfg.BORDERSIZE, (j + 2) * cfg.GRIDSIZE mines_line.append(Mine(images=images, position=position)) self.mines_matrix.append(mines_line) # 隨機埋雷 for i in random.sample(range(cfg.GAME_MATRIX_SIZE[0]*cfg.GAME_MATRIX_SIZE[1]), cfg.NUM_MINES): self.mines_matrix[i//cfg.GAME_MATRIX_SIZE[0]][i%cfg.GAME_MATRIX_SIZE[0]].burymine() count = 0 for item in self.mines_matrix: for i in item: count += int(i.is_mine_flag) # 游戲當(dāng)前的狀態(tài) self.status_code = -1 # 記錄鼠標(biāo)按下時的位置和按的鍵 self.mouse_pos = None self.mouse_pressed = None
記錄方格狀態(tài),是不是點開了雷,狀態(tài)如何。
class Mine(pygame.sprite.Sprite): def __init__(self, images, position, status_code=0, **kwargs): pygame.sprite.Sprite.__init__(self) # 導(dǎo)入圖片 self.images = images self.image = self.images['blank'] self.rect = self.image.get_rect() self.rect.left, self.rect.top = position # 雷當(dāng)前的狀態(tài) self.status_code = status_code # 真雷還是假雷(默認(rèn)是假雷) self.is_mine_flag = False # 周圍雷的數(shù)目 self.num_mines_around = -1 '''設(shè)置當(dāng)前的狀態(tài)碼''' def setstatus(self, status_code): self.status_code = status_code '''埋雷''' def burymine(self): self.is_mine_flag = True '''設(shè)置周圍雷的數(shù)目''' def setnumminesaround(self, num_mines_around): self.num_mines_around = num_mines_around '''畫到屏幕上''' def draw(self, screen): # 狀態(tài)碼為0, 代表該雷未被點擊 if self.status_code == 0: self.image = self.images['blank'] # 狀態(tài)碼為1, 代表該雷已被點開 elif self.status_code == 1: self.image = self.images['mine'] if self.is_mine_flag else self.images[str(self.num_mines_around)] # 狀態(tài)碼為2, 代表該雷被玩家標(biāo)記為雷 elif self.status_code == 2: self.image = self.images['flag'] # 狀態(tài)碼為3, 代表該雷被玩家標(biāo)記為問號 elif self.status_code == 3: self.image = self.images['ask'] # 狀態(tài)碼為4, 代表該雷正在被鼠標(biāo)左右鍵雙擊 elif self.status_code == 4: assert not self.is_mine_flag self.image = self.images[str(self.num_mines_around)] # 狀態(tài)碼為5, 代表該雷在被鼠標(biāo)左右鍵雙擊的雷的周圍 elif self.status_code == 5: self.image = self.images['0'] # 狀態(tài)碼為6, 代表該雷被踩中 elif self.status_code == 6: assert self.is_mine_flag self.image = self.images['blood'] # 狀態(tài)碼為7, 代表該雷被誤標(biāo) elif self.status_code == 7: assert not self.is_mine_flag self.image = self.images['error'] # 綁定圖片到屏幕 screen.blit(self.image, self.rect)
游戲主循環(huán):
clock = pygame.time.Clock() while True: screen.fill(cfg.BACKGROUND_COLOR) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: mouse_pos = event.pos mouse_pressed = pygame.mouse.get_pressed() minesweeper_map.update(mouse_pressed=mouse_pressed, mouse_pos=mouse_pos, type_='down') elif event.type == pygame.MOUSEBUTTONUP: minesweeper_map.update(type_='up') if emoji_button.rect.collidepoint(pygame.mouse.get_pos()): minesweeper_map = MinesweeperMap(cfg, images) time_board.update('000') time_board.is_start = False remaining_mine_board.update(str(cfg.NUM_MINES)) emoji_button.setstatus(status_code=0) if minesweeper_map.gaming: if not time_board.is_start: start_time = time.time() time_board.is_start = True time_board.update(str(int(time.time() - start_time)).zfill(3)) remianing_mines = max(cfg.NUM_MINES - minesweeper_map.flags, 0) remaining_mine_board.update(str(remianing_mines).zfill(2)) if minesweeper_map.status_code == 1: emoji_button.setstatus(status_code=1) if minesweeper_map.openeds + minesweeper_map.flags == cfg.GAME_MATRIX_SIZE[0] * cfg.GAME_MATRIX_SIZE[1]: minesweeper_map.status_code = 1 emoji_button.setstatus(status_code=2) minesweeper_map.draw(screen) emoji_button.draw(screen) remaining_mine_board.draw(screen) time_board.draw(screen) pygame.display.update() clock.tick(cfg.FPS)
游戲效果:
總結(jié)
今日游戲更新好啦!我要去戰(zhàn)斗了!我就不信我過不了。。。。。。小聲BB:不行的話還是開個掛吧!
到此這篇關(guān)于python實戰(zhàn)游戲之史上最難最虐的掃雷游戲沒有之一的文章就介紹到這了,更多相關(guān)python 掃雷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3在同一行內(nèi)輸入n個數(shù)并用列表保存的例子
今天小編就為大家分享一篇python3在同一行內(nèi)輸入n個數(shù)并用列表保存的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python內(nèi)置模塊OS?實現(xiàn)SHELL端文件處理器
這篇文章主要介紹了python內(nèi)置模塊OS實現(xiàn)SHELL端文件處理器,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09使用Python實現(xiàn)在Excel工作表中添加、修改及刪除超鏈接
在創(chuàng)建Excel工作簿時,內(nèi)部文檔的互鏈、報告自動化生成或是創(chuàng)建外部資源快速訪問路徑是比較常見的需求,本文將介紹如何使用Python實現(xiàn)在Excel工作表中對超鏈接進(jìn)行添加、修改及刪除的操作,需要的朋友可以參考下2024-10-10Python多線程與多進(jìn)程相關(guān)知識總結(jié)
進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,是操作系統(tǒng)程序運行的基本單元,本文簡要介紹進(jìn)程和線程的概念以及Python中的多進(jìn)程和多線程.需要的朋友可以參考下2021-05-05Python的Socket編程過程中實現(xiàn)UDP端口復(fù)用的實例分享
這篇文章主要介紹了Python的Socket編程過程中實現(xiàn)UDP端口復(fù)用的實例分享,文中作者用到了Python的twisted異步框架,需要的朋友可以參考下2016-03-03Python解析json時提示“string indices must be integers”問題解決方法
這篇文章主要介紹了Python解析json時提示“string indices must be integers”問題解決方法,結(jié)合實例形式分析了Python解析json字符串操作規(guī)范與相關(guān)使用技巧,需要的朋友可以參考下2019-07-07通過Python編程將CSV文件導(dǎo)出為PDF文件的方法
CSV文件通常用于存儲大量的數(shù)據(jù),而PDF文件則是一種通用的文檔格式,便于與他人共享和打印,將CSV文件轉(zhuǎn)換成PDF文件可以幫助我們更好地管理和展示數(shù)據(jù),本文將介紹如何通過Python編程將CSV文件導(dǎo)出為PDF文件,需要的朋友可以參考下2024-06-06