導語
每日游戲更新系列——今天帶大家來看看掃雷小游戲!
它是許多人接觸到的第一款游戲,大概也是廣大辦公族和無網學生無聊時消遣的最佳游戲,
在那些還沒有網(被切斷網)的歲月,掃雷曾陪伴無數人度過了他們的童年,你的最佳紀錄是多少了?
對于許多90后、00后來說,掃雷這個電腦上自帶的小游戲早就變成古早的歷史,再一次提到掃雷這個名字的時候,對許多人來說,仿佛就是上世紀的事情了,
?
就像是偶爾點開微信的跳一跳小游戲,發現排行榜上還有人在孤獨的霸榜一樣,已經2021年了,還有許多90后、00后堅守在掃雷這個游戲上~
?
正文
首先準備好相應的素材可自選:
?
??
環境安裝:依舊是游戲模塊pygame,python3.6,pycharm2021,
pip install pygame?
游戲規則:

在有限的時間里面用最短的時間找到所有的雷,每個數字代表附近有幾顆雷,踩到雷結束,找到全部的雷即過關,
匯入所有的字體,圖片等:
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)
# 匯入圖片
self.images = images
self.image = self.images['face_normal']
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
# 表情按鈕的當前狀態
self.status_code = status_code
'''畫到螢屏上'''
def draw(self, screen):
# 狀態碼為0, 代表正常的表情
if self.status_code == 0:
self.image = self.images['face_normal']
# 狀態碼為1, 代表失敗的表情
elif self.status_code == 1:
self.image = self.images['face_fail']
# 狀態碼為2, 代表成功的表情
elif self.status_code == 2:
self.image = self.images['face_success']
# 系結圖片到螢屏
screen.blit(self.image, self.rect)
'''設定當前的按鈕的狀態'''
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)
# 游戲當前的狀態
self.status_code = -1
# 記錄滑鼠按下時的位置和按的鍵
self.mouse_pos = None
self.mouse_pressed = None
記錄方格狀態,是不是點開了雷,狀態如何,
class Mine(pygame.sprite.Sprite):
def __init__(self, images, position, status_code=0, **kwargs):
pygame.sprite.Sprite.__init__(self)
# 匯入圖片
self.images = images
self.image = self.images['blank']
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
# 雷當前的狀態
self.status_code = status_code
# 真雷還是假雷(默認是假雷)
self.is_mine_flag = False
# 周圍雷的數目
self.num_mines_around = -1
'''設定當前的狀態碼'''
def setstatus(self, status_code):
self.status_code = status_code
'''埋雷'''
def burymine(self):
self.is_mine_flag = True
'''設定周圍雷的數目'''
def setnumminesaround(self, num_mines_around):
self.num_mines_around = num_mines_around
'''畫到螢屏上'''
def draw(self, screen):
# 狀態碼為0, 代表該雷未被點擊
if self.status_code == 0:
self.image = self.images['blank']
# 狀態碼為1, 代表該雷已被點開
elif self.status_code == 1:
self.image = self.images['mine'] if self.is_mine_flag else self.images[str(self.num_mines_around)]
# 狀態碼為2, 代表該雷被玩家標記為雷
elif self.status_code == 2:
self.image = self.images['flag']
# 狀態碼為3, 代表該雷被玩家標記為問號
elif self.status_code == 3:
self.image = self.images['ask']
# 狀態碼為4, 代表該雷正在被滑鼠左右鍵雙擊
elif self.status_code == 4:
assert not self.is_mine_flag
self.image = self.images[str(self.num_mines_around)]
# 狀態碼為5, 代表該雷在被滑鼠左右鍵雙擊的雷的周圍
elif self.status_code == 5:
self.image = self.images['0']
# 狀態碼為6, 代表該雷被踩中
elif self.status_code == 6:
assert self.is_mine_flag
self.image = self.images['blood']
# 狀態碼為7, 代表該雷被誤標
elif self.status_code == 7:
assert not self.is_mine_flag
self.image = self.images['error']
# 系結圖片到螢屏
screen.blit(self.image, self.rect)
游戲主回圈:
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)
游戲效果:
?
??
?
??
?
???
??總結
今日游戲更新好啦!我要去戰斗了!我就不信我過不了,,,,,,小聲BB:不行的話還是開個掛吧!
?
??
制作不易,記得一鍵三連哦!!
如需打包好的原始碼+素材直接原始碼基地免費領:#959755565#嘿嘿老地方!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300345.html
標籤:其他
上一篇:FastAPI 學習之路(二)
