怎么用Python制作打地鼠小游戏
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇内容主要讲解"怎么用Python制作打地鼠小游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用Python制作打地鼠小游戏"吧!简介打地鼠的游戏
千家信息网最后更新 2024年09月22日怎么用Python制作打地鼠小游戏
本篇内容主要讲解"怎么用Python制作打地鼠小游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用Python制作打地鼠小游戏"吧!
简介
打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~
首先,让我们确定一下游戏中有哪些元素。打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类呗:
'''地鼠'''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
显然,地鼠有被锤子击中和未被锤子击中这两种状态,所以需要加载两张图,当地鼠被击中时从未被击中的地鼠状态图切换到被击中后的地鼠状态图(我找的图可能不太像地鼠,请各位老哥见谅)。然后我们再来定义一下锤子这个游戏精灵类,和地鼠类似,锤子也有未锤下去和已锤下去两种状态,只不过锤下去之后需要迅速恢复回未锤下去的状态,具体而言,代码实现如下:
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制作打地鼠小游戏"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
地鼠
分数
锤子
状态
界面
位置
小游戏
制作
必要
屏幕
注释
精灵
元素
内容
就是
时间
背景
音效
学习
循环
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
低保真软件开发
服务器维修 长沙
数据库70年代
数据库管理体会
网络安全设备的性能和配置
网络技术文明是指的什么
ftp服务器时间命令
点金台 点金台网络技术
提高公司网络安全
数据库版本号表如何查找
软件开发工程师属于什么专业
什么叫网络安全避震器
天财商龙是本地服务器吗
远程服务器如何接网络
服务器上得安全数据库没有
自己在家装一个云服务器
服务器 限制访问流量
芮城天气预报软件开发
数据库查字和字段
江西通用软件开发单价
通ysql更新数据库
圣安列斯赛车服务器
ps5 gt7 无法连接服务器
数据库mul是什么约束
dellt320服务器说明书
萤石摄像头网络技术
乐陵软件开发找哪家
长城汽车的软件开发岗怎么样
软考 软件开发等级
软件开发功能偏差