注:压缩包解压后可直接运行 import sys import time from enum import Enum import pygame from pygame.locals import * from mineblock import * # 游戏屏幕的宽 SCREEN_WIDTH = BLOCK_WIDTH * SIZE # 游戏屏幕的高 SCREEN_HEIGHT = (BLOCK_HEIGHT + 2) * SIZE class GameStatus(Enum): readied = 1, started = 2, over = 3, win = 4 def 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 = GameStatus.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.pos x = mouse_x // SIZE y = mouse_y // SIZE - 2 b1, b2, b3 = pygame.mouse.get_pressed() if game_status == GameStatus.started: # 鼠标左右键同时按下,如果已经标记了所有雷,则打开周围一圈 # 如果还未标记完所有雷,则有一个周围一圈被同时按下的效果 if b1 and b3: mine = block.getmine(x, y) if mine.status == BlockStatus.opened: if not block.double_mouse_button_down(x, y): game_status = GameStatus.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 = GameStatus.readied block = MineBlock() start_time = time.time() elapsed_time = 0 continue if game_status == GameStatus.readied: game_status = GameStatus.started start_time = time.time() elapsed_time = 0 if game_status == GameStatus.started: mine = block.getmine(x, y) if b1 and not b3: # 按鼠标左键 if mine.status == BlockStatus.normal: if not block.open_mine(x, y): game_status = GameStatus.over elif not b1 and b3: # 按鼠标右键 if mine.status == BlockStatus.normal: mine.status = BlockStatus.flag elif mine.status == BlockStatus.flag: mine.status = BlockStatus.ask elif mine.status == BlockStatus.ask: mine.status = BlockStatus.normal elif b1 and b3: if mine.status == BlockStatus.double: block.double_mouse_button_up(x, y) flag_count = 0 opened_count = 0 for row in block.block: for mine in row: pos = (mine.x * SIZE, (mine.y + 2) * SIZE) if mine.status == BlockStatus.opened: screen.blit(img_dict[mine.around_mine_count], pos) opened_count += 1 elif mine.status == BlockStatus.double: screen.blit(img_dict[mine.around_mine_count], pos) elif mine.status == BlockStatus.bomb: screen.blit(img_blood, pos) elif mine.status == BlockStatus.flag: screen.blit(img_flag, pos) flag_count += 1 elif mine.status == BlockStatus.ask: screen.blit(img_ask, pos) elif mine.status == BlockStatus.hint: screen.blit(img0, pos) elif game_status == GameStatus.over and mine.value: screen.blit(img_mine, pos) elif mine.value == 0 and mine.status == BlockStatus.flag: screen.blit(img_error, pos) elif mine.status == BlockStatus.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 == GameStatus.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 = GameStatus.win if game_status == GameStatus.over: screen.blit(img_face_fail, (face_pos_x, face_pos_y)) elif game_status == GameStatus.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()
lvvx