原标题:Python制作打地鼠小游戏

导语

大家好,欢迎来到 Crossin的编程教室 !

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

今天就给大家分享一个用python写的打地鼠小游戏。同时也祝大家在新的一年把不开心的事情统统打跑~

环境搭建

安装Python并添加到环境变量,安装 pygame 模块

pipinstall pygame

或下载离线安装:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame

先睹为快

获取源码后在cmd窗口运行如下命令即可:

pythonGame21.py

效果如下:

原理简介

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

'''地鼠'''

classMole(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

'''设置位置'''

defsetPosition(self, pos):

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

'''设置被击中'''

defsetBeHammered(self):

self.is_hammer = True

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

defdraw(self, screen):

ifself.is_hammer: self.image = self.images[ 1]

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

'''重置'''

defreset(self):

self.image = self.images[ 0]

self.is_hammer = False

地鼠有被锤子击中和未被锤子击中这两种状态,所以需要加载两张图,当地鼠被击中时从未被击中的地鼠状态图切换到被击中后的地鼠状态图(我找的图可能不太像地鼠,请各位老哥见谅)。然后我们再来定义一下锤子这个游戏精灵类,和地鼠类似,锤子也有未锤下去和已锤下去两种状态,只不过锤下去之后需要迅速恢复回未锤下去的状态。

代码实现如下:

classHammer( 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

'''设置位置'''

defsetPosition( self, pos):

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

'''设置hammering'''

defsetHammering( self):

self.is_hammering = True

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

defdraw( self, screen):

ifself. is_hammering:

self.image = self.images[ 1]

self.hammer_count += 1

ifself.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,定义完游戏精灵之后,我们就可以开始写主程序啦。首先自然是游戏初始化:

'''游戏初始化'''

definitGame:

pygame.init

pygame.mixer.init

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

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

returnscreen

然后加载必要的游戏素材和定义必要的游戏变量(我都注释的比较详细了,就不在文章里赘述一遍了,自己看注释呗~)

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

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

接着就是游戏主循环啦:

# 游戏主循环

whileTrue:

# --游戏时间为60s

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

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

iftime_remain == 40:

pygame.time.set_timer(change_hole_event, 650)

eliftime_remain == 20:

pygame.time.set_timer(change_hole_event, 500)

# --倒计时音效

iftime_remain == 10:

audios[ 'count_down'].play

# --游戏结束

iftime_remain < 0: break

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

# --按键检测

forevent inpygame.event.get:

ifevent.type == pygame.QUIT:

pygame.quit

sys.exit

elifevent.type == pygame.MOUSEMOTION:

hammer.setPosition(pygame.mouse.get_pos)

elifevent.type == pygame.MOUSEBUTTONDOWN:

ifevent.button == 1:

hammer.setHammering

elifevent.type == change_hole_event:

hole_pos = random.choice(cfg.HOLE_POSITIONS)

mole.reset

mole.setPosition(hole_pos)

# --碰撞检测

ifhammer.is_hammering andnotmole.is_hammer:

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

ifis_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

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

ifyour_score > best_score:

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

f.write(str(your_score))

f.close

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

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

defstartInterface(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]

whileTrue:

forevent inpygame.event.get:

ifevent.type == pygame.QUIT:

pygame.quit

sys.exit

elifevent.type == pygame.MOUSEMOTION:

mouse_pos = pygame.mouse.get_pos

ifmouse_pos[ 0] inlist(range( 419, 574)) andmouse_pos[ 1] inlist(range( 374, 416)):

begin_image = begin_images[ 1]

else:

begin_image = begin_images[ 0]

elifevent.type == pygame.MOUSEBUTTONDOWN:

ifevent.button == 1andmouse_pos[ 0] inlist(range( 419, 574)) andmouse_pos[ 1] inlist(range( 374, 416)):

returnTrue

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

pygame.display.update

'''结束界面'''defendInterface(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_rectyour_score_rect.left, your_score_rect.top = (screensize[ 0] - your_score_rect.width) / 2, 215best_score_text = font.render( 'Best Score: %s'% score_info[ 'best_score'], True, font_colors[ 1])best_score_rect = best_score_text.get_rectbest_score_rect.left, best_score_rect.top = (screensize[ 0] - best_score_rect.width) / 2, 275whileTrue:forevent inpygame.event.get:ifevent.type == pygame.QUIT:pygame.quitsys.exitelifevent.type == pygame.MOUSEMOTION:mouse_pos = pygame.mouse.get_posifmouse_pos[ 0] inlist(range( 419, 574)) andmouse_pos[ 1] inlist(range( 374, 416)):again_image = again_images[ 1]else:again_image = again_images[ 0]elifevent.type == pygame.MOUSEBUTTONDOWN:ifevent.button == 1andmouse_pos[ 0] inlist(range( 419, 574)) andmouse_pos[ 1] inlist(range( 374, 416)):returnTruescreen.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

大功告成~

源码下载

获取源码及图片素材可在公众号内回复关键字打地鼠

音频与图片素材源于网络,仅供个人学习交流使用,如有侵权请联系作者删除。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:白露未晞me

来源:Charles的皮卡丘

用python写一个简单的贪吃蛇游戏 返回搜狐,查看更多

责任编辑:

matlab制作打地鼠游戏,Python制作打地鼠小游戏相关推荐

  1. 20行python代码的入门级小游戏-python实现石头剪刀布小游戏

    本文实例为大家分享了python实现石头剪刀布的具体代码,供大家参考,具体内容如下 老师布置了一个石头剪刀布的作业,要可视化,还是先用代码实现再说可视化的事. 环境:window7,Python 3. ...

  2. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

  3. python自制小游戏_教你用Python自制拼图小游戏,一起来制作吧

    摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...

  4. python猜数字小游戏制作

    教大家做一个简易的猜数字的游戏,但确实蛮简单的,我这个四年级的小盆友也才学了一天,所以给那些不会的教一下. 我们先来看导入模块: """ 简易python猜数小游戏&qu ...

  5. 使用UE4制作简单的局域网对战小游戏

    原帖地址:https://arcecho.github.io/2017/04/28/使用UE4制作简单的局域网对战小游戏/ 大多数文章都是只讲到大致的UE4网络的概念,并未涉及实际使用.事实上在使用的 ...

  6. python设计拼图小游戏_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  7. 教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  8. python拼图游戏编码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  9. python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  10. python pygame 简单小游戏

    python pygame 简单小游戏 最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单的小游戏 效果图 这是一个很简单的防守类小游戏 玩家可以使用wasd控制人物移动,并且鼠标控制 ...

最新文章

  1. 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )
  2. mysql 下一条数据_mysql 查询一条记录的下一条和上一条记录
  3. 【C】KoobooJson在asp.net core中的使用
  4. stm32 整数加法循环时间_【教学设计】小数加法教学设计
  5. 动态规划 —— 线性 DP —— 字符串编辑距离
  6. 推荐分享一个自定义绑定控件(附源码)
  7. sklearn.metrics.roc_curve
  8. Mac安装和配置Tomcat的教程
  9. 【粉丝福利】Logo评选投票,礼品赠送!
  10. FL Studio20.9最新中文fl水果编曲软件
  11. 同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载
  12. R语言绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)
  13. 易扩展,易复用,封装axios
  14. 访问对象存储资源下载变成预览
  15. php 的单例模式(一)
  16. 阿呆穿越当程序员之设计模式系列-总纲
  17. anaconda3 mysql_Win10+Anaconda3+Eclipse+Django+MySQL 配置Python的Web开发环境
  18. ORM进阶之Hibernate中关系映射
  19. 平安好医生技术栈的分析【转】
  20. 还在担心网聊相亲的小姐姐,美女变恐龙!Python帮你潜伏侦查

热门文章

  1. (105, b“Unclosed quotation mark after the character string ‘2020-07-01‘.DB-Lib error message 20018,
  2. 教你去除开机root字样(酷派大神F2、酷派高通平台手机)
  3. (KA)*(KA的伴随)
  4. 图片缩放、旋转、加水印
  5. SVG排版公众号文章『两次互动,展开长图』模板代码
  6. 【tk制作一个登陆界面】
  7. 35岁男子辛酸自述:整整5个月没工作了,我该如何养家糊口?
  8. 天肌1300和高通骁龙778g参数对比 天肌1300和骁龙778g哪个好
  9. 服务器提示位置不可用 拒绝访问,Win10纯净版系统提示位置不可用拒绝访问怎么办...
  10. cocos 添加遮罩后白屏_Cocos Creator(圆形遮罩头像)动态增加遮盖层 mask 并设为圆形生效...