python小游戏源代码pygame_【pygame】Python 制作 XP 经典扫雷游戏(附源码)

importsysimporttimefrom enum importEnumimportpygamefrom pygame.locals import *

from mineblock import *

#游戏屏幕的宽

SCREEN_WIDTH = BLOCK_WIDTH *SIZE#游戏屏幕的高

SCREEN_HEIGHT = (BLOCK_HEIGHT + 2) *SIZEclassGameStatus(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))defmain():

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) // 2face_pos_y= (SIZE * 2 - face_size) // 2img_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 #耗时

whileTrue:#填充背景色

screen.fill(bgcolor)for event inpygame.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 - 2b1, b2, b3=pygame.mouse.get_pressed()if game_status ==GameStatus.started:#鼠标左右键同时按下,如果已经标记了所有雷,则打开周围一圈

#如果还未标记完所有雷,则有一个周围一圈被同时按下的效果

if b1 andb3:

mine=block.getmine(x, y)if mine.status ==BlockStatus.opened:if notblock.double_mouse_button_down(x, y):

game_status=GameStatus.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=GameStatus.readied

block=MineBlock()

start_time=time.time()

elapsed_time=0continue

if game_status ==GameStatus.readied:

game_status=GameStatus.started

start_time=time.time()

elapsed_time=0if game_status ==GameStatus.started:

mine=block.getmine(x, y)if b1 and not b3: #按鼠标左键

if mine.status ==BlockStatus.normal:if notblock.open_mine(x, y):

game_status=GameStatus.overelif not b1 and b3: #按鼠标右键

if mine.status ==BlockStatus.normal:

mine.status=BlockStatus.flagelif mine.status ==BlockStatus.flag:

mine.status=BlockStatus.askelif mine.status ==BlockStatus.ask:

mine.status=BlockStatus.normalelif b1 andb3:if mine.status ==BlockStatus.double:

block.double_mouse_button_up(x, y)

flag_count=0

opened_count=0for row inblock.block:for mine inrow:

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 andmine.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.winif 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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值