打地鼠python程序设计说明,pygame打地鼠游戏代码

大家好,小编为大家解答python编写一个打地鼠的游戏程序的问题。很多人还不知道python编写一个打地鼠的游戏代码,现在让我们一起来看看吧!

 

Pygame库是专门为了帮助做出的游戏和其他多媒体应用Python编程语言的一个开放源代码模块。本文将利用Pygame模块制作一个打地鼠的小游戏,快跟随小编一起学习一下吧

前言

今天给大家写一个个打地鼠小游戏,废话不多说直接开始~

开发工具

Python版本: 3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块火车头采集文章批量伪原创

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠~

首先,让我们确定一下游戏中有哪些元素。打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类:

|

`'''地鼠'''`

`class` `Mole(pygame.sprite.Sprite):`

`def` `__init__(``self``, image_paths, position,` `*``*``kwargs):`

`pygame.sprite.Sprite.__init__(``self``)`

`self``.images` `=` `[pygame.transform.scale(pygame.image.load(image_paths[``0``]), (``101``,` `103``)),`

`pygame.transform.scale(pygame.image.load(image_paths[``-``1``]), (``101``,` `103``))]`

`self``.image` `=` `self``.images[``0``]`

`self``.rect` `=` `self``.image.get_rect()`

`self``.mask` `=` `pygame.mask.from_surface(``self``.image)`

`self``.setPosition(position)`

`self``.is_hammer` `=` `False`

`'''设置位置'''`

`def` `setPosition(``self``, pos):`

`self``.rect.left,` `self``.rect.top` `=` `pos`

`'''设置被击中'''`

`def` `setBeHammered(``self``):`

`self``.is_hammer` `=` `True`

`'''显示在屏幕上'''`

`def` `draw(``self``, screen):`

`if` `self``.is_hammer:` `self``.image` `=` `self``.images[``1``]`

`screen.blit(``self``.image,` `self``.rect)`

`'''重置'''`

`def` `reset(``self``):`

`self``.image` `=` `self``.images[``0``]`

`self``.is_hammer` `=` `False`

|

显然,地鼠有被锤子击中和未被锤子击中这两种状态,所以需要加载两张图,当地鼠被击中时从未被击中的地鼠状态图切换到被击中后的地鼠状态图(ps:图可能不像地鼠)。

然后我们再来定义一下锤子这个游戏精灵类,和地鼠类似,锤子也有未锤下去和已锤下去两种状态,只不过锤下去之后需要迅速恢复回未锤下去的状态,具体而言,代码实现如下:

|

`class` `Hammer(pygame.sprite.Sprite):`

`def` `__init__(``self``, image_paths, position,` `*``*``kwargs):`

`pygame.sprite.Sprite.__init__(``self``)`

`self``.images` `=` `[pygame.image.load(image_paths[``0``]), pygame.image.load(image_paths[``1``])]`

`self``.image` `=` `self``.images[``0``]`

`self``.rect` `=` `self``.image.get_rect()`

`self``.mask` `=` `pygame.mask.from_surface(``self``.images[``1``])`

`self``.rect.left,` `self``.rect.top` `=` `position`

`# 用于显示锤击时的特效`

`self``.hammer_count` `=` `0`

`self``.hammer_last_time` `=` `4`

`self``.is_hammering` `=` `False`

`'''设置位置'''`

`def` `setPosition(``self``, pos):`

`self``.rect.centerx,` `self``.rect.centery` `=` `pos`

`'''设置hammering'''`

`def` `setHammering(``self``):`

`self``.is_hammering` `=` `True`

`'''显示在屏幕上'''`

`def` `draw(``self``, screen):`

`if` `self``.is_hammering:`

`self``.image` `=` `self``.images[``1``]`

`self``.hammer_count` `+``=` `1`

`if` `self``.hammer_count >` `self``.hammer_last_time:`

`self``.is_hammering` `=` `False`

`self``.hammer_count` `=` `0`

`else``:`

`self``.image` `=` `self``.images[``0``]`

`screen.blit(``self``.image,` `self``.rect)`

|

OK,定义完游戏精灵之后,我们就可以开始写主程序啦。首先自然是游戏初始化:

|

`'''游戏初始化'''`

`def` `initGame():`

`pygame.init()`

`pygame.mixer.init()`

`screen` `=` `pygame.display.set_mode(cfg.SCREENSIZE)`

`pygame.display.set_caption(``'Whac A Mole-微信公众号:Charles的皮卡丘'``)`

`return` `screen`

|

然后加载必要的游戏素材和定义必要的游戏变量

|

`# 加载背景音乐和其他音效`

`pygame.mixer.music.load(cfg.BGM_PATH)`

`pygame.mixer.music.play(``-``1``)`

`audios` `=` `{`

`'count_down'``: pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),`

`'hammering'``: pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)`

`}`

`# 加载字体`

`font` `=` `pygame.font.Font(cfg.FONT_PATH,` `40``)`

`# 加载背景图片`

`bg_img` `=` `pygame.image.load(cfg.GAME_BG_IMAGEPATH)`

`# 开始界面`

`startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)`

`# 地鼠改变位置的计时`

`hole_pos` `=` `random.choice(cfg.HOLE_POSITIONS)`

`change_hole_event` `=` `pygame.USEREVENT`

`pygame.time.set_timer(change_hole_event,` `800``)`

`# 地鼠`

`mole` `=` `Mole(cfg.MOLE_IMAGEPATHS, hole_pos)`

`# 锤子`

`hammer` `=` `Hammer(cfg.HAMMER_IMAGEPATHS, (``500``,` `250``))`

`# 时钟`

`clock` `=` `pygame.time.Clock()`

`# 分数`

`your_score` `=` `0`

|

接着就是游戏主循环啦:

|

`# 游戏主循环`

`while` `True``:`

`# --游戏时间为60s`

`time_remain` `=` `round``((``61000` `-` `pygame.time.get_ticks())` `/` `1000.``)`

`# --游戏时间减少, 地鼠变位置速度变快`

`if` `time_remain` `=``=` `40``:`

`pygame.time.set_timer(change_hole_event,` `650``)`

`elif` `time_remain` `=``=` `20``:`

`pygame.time.set_timer(change_hole_event,` `500``)`

`# --倒计时音效`

`if` `time_remain` `=``=` `10``:`

`audios[``'count_down'``].play()`

`# --游戏结束`

`if` `time_remain <` `0``:` `break`

`count_down_text` `=` `font.render(``'Time: '``+``str``(time_remain),` `True``, cfg.WHITE)`

`# --按键检测`

`for` `event` `in` `pygame.event.get():`

`if` `event.``type` `=``=` `pygame.QUIT:`

`pygame.quit()`

`sys.exit()`

`elif` `event.``type` `=``=` `pygame.MOUSEMOTION:`

`hammer.setPosition(pygame.mouse.get_pos())`

`elif` `event.``type` `=``=` `pygame.MOUSEBUTTONDOWN:`

`if` `event.button` `=``=` `1``:`

`hammer.setHammering()`

`elif` `event.``type` `=``=` `change_hole_event:`

`hole_pos` `=` `random.choice(cfg.HOLE_POSITIONS)`

`mole.reset()`

`mole.setPosition(hole_pos)`

`# --碰撞检测`

`if` `hammer.is_hammering` `and` `not` `mole.is_hammer:`

`is_hammer` `=` `pygame.sprite.collide_mask(hammer, mole)`

`if` `is_hammer:`

`audios[``'hammering'``].play()`

`mole.setBeHammered()`

`your_score` `+``=` `10`

`# --分数`

`your_score_text` `=` `font.render(``'Score: '``+``str``(your_score),` `True``, cfg.BROWN)`

`# --绑定必要的游戏元素到屏幕(注意顺序)`

`screen.blit(bg_img, (``0``,` `0``))`

`screen.blit(count_down_text, (``875``,` `8``))`

`screen.blit(your_score_text, (``800``,` `430``))`

`mole.draw(screen)`

`hammer.draw(screen)`

`# --更新`

`pygame.display.flip()`

`clock.tick(``60``)`

|

每一部分我也都做了注释,逻辑很简单,就不多废话了。60s后,游戏结束,我们就可以统计分数以及和历史最高分做对比了:

 | 

`# 读取最佳分数(try块避免第一次游戏无.rec文件)`

`try``:`

`best_score` `=` `int``(``open``(cfg.RECORD_PATH).read())`

`except``:`

`best_score` `=` `0`

`# 若当前分数大于最佳分数则更新最佳分数`

`if` `your_score > best_score:`

`f` `=` `open``(cfg.RECORD_PATH,` `'w'``)`

`f.write(``str``(your_score))`

`f.close()`

`为了使游戏看起来更“正式”,再随手添个开始界面和结束界面呗:`

`'''游戏开始界面'''`

`def` `startInterface(screen, begin_image_paths):`

`begin_images` `=` `[pygame.image.load(begin_image_paths[``0``]), pygame.image.load(begin_image_paths[``1``])]`

`begin_image` `=` `begin_images[``0``]`

`while` `True``:`

`for` `event` `in` `pygame.event.get():`

`if` `event.``type` `=``=` `pygame.QUIT:`

`pygame.quit()`

`sys.exit()`

`elif` `event.``type` `=``=` `pygame.MOUSEMOTION:`

`mouse_pos` `=` `pygame.mouse.get_pos()`

`if` `mouse_pos[``0``]` `in` `list``(``range``(``419``,` `574``))` `and` `mouse_pos[``1``]` `in` `list``(``range``(``374``,` `416``)):`

`begin_image` `=` `begin_images[``1``]`

`else``:`

`begin_image` `=` `begin_images[``0``]`

`elif` `event.``type` `=``=` `pygame.MOUSEBUTTONDOWN:`

`if` `event.button` `=``=` `1` `and` `mouse_pos[``0``]` `in` `list``(``range``(``419``,` `574``))` `and` `mouse_pos[``1``]` `in` `list``(``range``(``374``,` `416``)):`

`return` `True`

`screen.blit(begin_image, (``0``,` `0``))`

`pygame.display.update()`

`'''结束界面'''`

`def` `endInterface(screen, end_image_path, again_image_paths, score_info, font_path, font_colors, screensize):`

`end_image` `=` `pygame.image.load(end_image_path)`

`again_images` `=` `[pygame.image.load(again_image_paths[``0``]), pygame.image.load(again_image_paths[``1``])]`

`again_image` `=` `again_images[``0``]`

`font` `=` `pygame.font.Font(font_path,` `50``)`

`your_score_text` `=` `font.render(``'Your Score: %s'` `%` `score_info[``'your_score'``],` `True``, font_colors[``0``])`

`your_score_rect` `=` `your_score_text.get_rect()`

`your_score_rect.left, your_score_rect.top` `=` `(screensize[``0``]` `-` `your_score_rect.width)` `/` `2``,` `215`

`best_score_text` `=` `font.render(``'Best Score: %s'` `%` `score_info[``'best_score'``],` `True``, font_colors[``1``])`

`best_score_rect` `=` `best_score_text.get_rect()`

`best_score_rect.left, best_score_rect.top` `=` `(screensize[``0``]` `-` `best_score_rect.width)` `/` `2``,` `275`

`while` `True``:`

`for` `event` `in` `pygame.event.get():`

`if` `event.``type` `=``=` `pygame.QUIT:`

`pygame.quit()`

`sys.exit()`

`elif` `event.``type` `=``=` `pygame.MOUSEMOTION:`

`mouse_pos` `=` `pygame.mouse.get_pos()`

`if` `mouse_pos[``0``]` `in` `list``(``range``(``419``,` `574``))` `and` `mouse_pos[``1``]` `in` `list``(``range``(``374``,` `416``)):`

`again_image` `=` `again_images[``1``]`

`else``:`

`again_image` `=` `again_images[``0``]`

`elif` `event.``type` `=``=` `pygame.MOUSEBUTTONDOWN:`

`if` `event.button` `=``=` `1` `and` `mouse_pos[``0``]` `in` `list``(``range``(``419``,` `574``))` `and` `mouse_pos[``1``]` `in` `list``(``range``(``374``,` `416``)):`

`return` `True`

`screen.blit(end_image, (``0``,` `0``))`

`screen.blit(again_image, (``416``,` `370``))`

`screen.blit(your_score_text, your_score_rect)`

`screen.blit(best_score_text, best_score_rect)`

`pygame.display.update()`

 |

到此这篇关于Python Pygame实战之打地鼠小游戏的文章就介绍到这了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python Pygame地鼠图片计时游戏代码,其中包含了计时器、得分计算和随机出现的地鼠图片: ```python import pygame import random # 初始化 Pygame pygame.init() # 游戏窗口大小 WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 # 设置游戏窗口 game_window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("打地鼠") # 载入地鼠图片 mouse_image = pygame.image.load("mouse.png") # 游戏开始时间 start_time = 0 # 游戏得分 score = 0 # 地鼠出现的时间间隔(单位:毫秒) mouse_interval = 1000 # 游戏时钟 game_clock = pygame.time.Clock() # 游戏结束标志 game_over = False # 游戏主循环 while not game_over: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True # 处理鼠标点击事件 if event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos() # 判断是否点击到地鼠 if mouse_rect.collidepoint(mouse_x, mouse_y): score += 1 # 绘制背景 game_window.fill((255, 255, 255)) # 绘制计时器 current_time = pygame.time.get_ticks() if start_time == 0: start_time = current_time else: elapsed_time = current_time - start_time time_left = max(0, 30 - elapsed_time // 1000) font = pygame.font.SysFont(None, 30) text = font.render("Time: " + str(time_left), True, (0, 0, 0)) game_window.blit(text, (10, 10)) if time_left == 0: game_over = True # 绘制得分 font = pygame.font.SysFont(None, 30) text = font.render("Score: " + str(score), True, (0, 0, 0)) game_window.blit(text, (WINDOW_WIDTH - 100, 10)) # 绘制地鼠 current_time = pygame.time.get_ticks() if current_time - mouse_last_time >= mouse_interval: mouse_x = random.randint(0, WINDOW_WIDTH - mouse_rect.width) mouse_y = random.randint(0, WINDOW_HEIGHT - mouse_rect.height) mouse_rect = mouse_image.get_rect().move(mouse_x, mouse_y) mouse_last_time = current_time game_window.blit(mouse_image, mouse_rect) # 更新屏幕 pygame.display.update() # 控制游戏帧率 game_clock.tick(60) # 游戏结束 pygame.quit() ``` 需要注意的是,此代码中需要提前准备好“mouse.png”地鼠图片。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值