相关文件

关注小编,私信小编领取哟!
当然别忘了一件三连哟~~

对了大家可以关注小编的公众号哟~~
Python日志

开发环境

Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。

环境搭建

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

原理介绍

游戏规则:

玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不得分。

玩家需要在规定时间内获取尽可能高的得分。

逐步实现:

Step1:初始化

游戏初始化,并加载必要的游戏素材:


```python
def main():pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('消灭星星——彳余大胆')# 加载背景音乐pygame.mixer.init()pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))pygame.mixer.music.set_volume(0.6)pygame.mixer.music.play(-1)# 加载音效sounds = {}sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))sounds['match'] = []for i in range(6):sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))# 加载字体font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)# 图片加载gem_imgs = []for i in range(1, 8):gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))

Step2:定义游戏精灵类

游戏中需要用到鼠标与拼图块之间的碰撞检测,从而操作拼图块移动,因此我们定义一个拼图块游戏精灵类以方便实现这些功能:

'''拼图精灵类'''
class gemSprite(pygame.sprite.Sprite):def __init__(self, img_path, size, position, downlen, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(img_path)self.image = pygame.transform.smoothscale(self.image, size)self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.downlen = downlenself.target_x = position[0]self.target_y = position[1] + downlenself.type = img_path.split('/')[-1].split('.')[0]self.fixed = Falseself.speed_x = 10self.speed_y = 10self.direction = 'down''''拼图块移动'''def move(self):if self.direction == 'down':self.rect.top = min(self.target_y, self.rect.top+self.speed_y)if self.target_y == self.rect.top:self.fixed = Trueelif self.direction == 'up':self.rect.top = max(self.target_y, self.rect.top-self.speed_y)if self.target_y == self.rect.top:self.fixed = Trueelif self.direction == 'left':self.rect.left = max(self.target_x, self.rect.left-self.speed_x)if self.target_x == self.rect.left:self.fixed = Trueelif self.direction == 'right':self.rect.left = min(self.target_x, self.rect.left+self.speed_x)if self.target_x == self.rect.left:self.fixed = True'''获取坐标'''def getPosition(self):return self.rect.left, self.rect.top'''设置坐标'''def setPosition(self, position):self.rect.left, self.rect.top = position

Step3:实现游戏主循环

逻辑其实很简单,就是不断检测是否有鼠标点击事件发生,如果有,则判断鼠标点击时的位置是否在某拼图块的位置区域内,若在,则选中该拼图块,否则不选中。

当有第二块拼图块被选中时,则判断两个拼图块是否满足拼图交换的条件,若满足,则交换拼图块,并获得奖励,否则不交换并取消选这两个拼图块的选中状态。

源代码如下图所示:

 '''开始游戏'''def start(self):clock = pygame.time.Clock()# 遍历整个游戏界面更新位置overall_moving = True# 指定某些对象个体更新位置individual_moving = False# 定义一些必要的变量gem_selected_xy = Nonegem_selected_xy2 = Noneswap_again = Falseadd_score = 0add_score_showtimes = 10time_pre = int(time.time())# 游戏主循环while True:for event in pygame.event.get():if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()elif event.type == pygame.MOUSEBUTTONUP:if (not overall_moving) and (not individual_moving) and (not add_score):position = pygame.mouse.get_pos()if gem_selected_xy is None:gem_selected_xy = self.checkSelected(position)else:gem_selected_xy2 = self.checkSelected(position)if gem_selected_xy2:if self.swapGem(gem_selected_xy, gem_selected_xy2):individual_moving = Trueswap_again = Falseelse:gem_selected_xy = Noneif overall_moving:overall_moving = not self.dropGems(0, 0)# 移动一次可能可以拼出多个3连块if not overall_moving:res_match = self.isMatch()add_score = self.removeMatched(res_match)if add_score > 0:overall_moving = Trueif individual_moving:gem1 = self.getGemByPos(*gem_selected_xy)gem2 = self.getGemByPos(*gem_selected_xy2)gem1.move()gem2.move()if gem1.fixed and gem2.fixed:res_match = self.isMatch()if res_match[0] == 0 and not swap_again:swap_again = Trueself.swapGem(gem_selected_xy, gem_selected_xy2)self.sounds['mismatch'].play()else:add_score = self.removeMatched(res_match)overall_moving = Trueindividual_moving = Falsegem_selected_xy = Nonegem_selected_xy2 = Noneself.screen.fill((135, 206, 235))self.drawGrids()self.gems_group.draw(self.screen)if gem_selected_xy:self.drawBlock(self.getGemByPos(*gem_selected_xy).rect)if add_score:if add_score_showtimes == 10:random.choice(self.sounds['match']).play()self.drawAddScore(add_score)add_score_showtimes -= 1if add_score_showtimes < 1:add_score_showtimes = 10add_score = 0self.remaining_time -= (int(time.time()) - time_pre)time_pre = int(time.time())self.showRemainingTime()self.drawScore()if self.remaining_time <= 0:return self.scorepygame.display.update()clock.tick(self.cfg.FPS)

Step4:游戏结束界面

游戏倒计时结束后,进入游戏结束界面,界面显示用户当前得分。同时,若用户键入R键则重新开始游戏,键入ESC键则退出游戏。

源代码实现如下:

 while True:score = game.start()flag = False# 一轮游戏结束后玩家选择重玩或者退出while True:for event in pygame.event.get():if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()elif event.type == pygame.KEYUP and event.key == pygame.K_r:flag = Trueif flag:breakscreen.fill((135, 206, 235))text0 = 'Final score: %s' % scoretext1 = 'Press <R> to restart the game.'text2 = 'Press <Esc> to quit the game.'y = 150for idx, text in enumerate([text0, text1, text2]):text_render = font.render(text, 1, (85, 65, 0))rect = text_render.get_rect()if idx == 0:rect.left, rect.top = (212, y)elif idx == 1:rect.left, rect.top = (122.5, y)else:rect.left, rect.top = (126.5, y)y += 100screen.blit(text_render, rect)pygame.display.update()game.reset()

效果展示:

很多小伙伴在学习python的时候总会遇到一些问题和瓶颈,没有方向感,不知道该从哪里入手去提升,对此我整理了一些资料,希望能够去帮助到小伙伴们,可以加Python学习交流裙:821189983

好啦,今天的小游戏就给大家安利到这里啦,有啥不懂的大家可以在下方评论,需要源码的可以找小编领取哟,记得关注小编的公众号哈~

很多小伙伴找我说要一个Python制作的消灭星星小游戏,必须给你们安排好!!相关推荐

  1. Python安利一个会化学方程式的消灭泡泡小游戏~

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...

  2. Python制作的足球双人小游戏,你确定你不过来看看?

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...

  3. python制作类似八音符小游戏

    准备工作:开发工具 Python版本:3.6.4 相关模块: cocos2d模块: pyaudio模块: 以及一些Python自带的模块. 私信回复"八音符"获取相关文件 环境搭建 ...

  4. 如何使用Python制作一款国际象棋小游戏

    如果你想使用 Python 制作国际象棋游戏,可以使用如下步骤: 设计棋盘:可以使用一个二维数组来存储棋盘上每一个位置的棋子. 实现棋子移动:可以使用一个函数来处理棋子的移动,并在棋子移动过程中进行限 ...

  5. 利用Python制作第一人称射击小游戏 含源代码

    大家好 我是毕加锁 (锁!) 今天教大家利用Python制作第一人称小游戏 涉及知识点 1.sprites 2.pygame混音器 3.图章    4.python基础语法 .代码 1发射声 from ...

  6. Python制作简单的滑雪小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 关注公众号:Python学习指南,回复"滑雪"获取相关文件 环境搭建 安装 ...

  7. 基于Python制作的热血足球小游戏

    开发工具 Python 版本:3.7.8 相关模块: pygame 模块: 以及一些 python 自带的模块. 环境搭建 安装 Python 并添加到环境变量,pip 安装需要的相关模块即可. 游戏 ...

  8. python循环10次_开发一个循环 5 次计算的小游戏, 设置随机种子为10,每次随机产生两个 1~10的数字以及随机选择...

    开发一个循环 5 次计算的小游戏, 设置随机种子为10,每次随机产生两个 1~10的数字以及随机选择 "+.-.*"运算符,构成一个表达式, 让用户计算式子结果并输入结果,如果计算 ...

  9. 分享一个python采集中国福利彩票的小代码

    分享一个python采集中国福利彩票的小代码 分享一个python采集中国福利彩票的小代码 能采集双色球,七乐彩,3D彩票任意一段时间的开奖号码,根据需求取消请求头注释,就能采集数据.(初学者请勿评价 ...

最新文章

  1. 查看git是否安装_Java程序员的必备Linux运维技能-安装git
  2. JavaScript单线程 setTimeout定时器
  3. c语言测试1到3章,2013计算机等级考试二级《C语言》复习:第三章第1节
  4. 微信H5支付(基于Java实现微信H5支付)
  5. Java中HashMap和TreeMap的区别深入理解
  6. 时间字符串转时间戳_Python3日期与时间戳转换的几种方法
  7. 对于.net开发的程序谷歌输入法输入优于搜狗
  8. AI 脑补宋明清皇帝长相,四大模型构想真实五官
  9. CPU_Z计算机主板性能表,只为高端玩家 七款Z97高规主板推荐
  10. 如何使用雅虎相册在陶宝网增加宝贝描述图片(转)
  11. 如何防止你的网站被攻击?
  12. 目前计算机已经发展到哪个阶段,目前电子计算机处于哪个阶段?计算机发展的四个阶段...
  13. 如何给孩子的作文下评语
  14. 这位程序员桌面很干净
  15. c语言编程植物信息查询系统,C:\WINDOWS\Desktop\导航库\植物\xzjs\hzc.htm
  16. warpAffine函数解析
  17. ECharts 区域缩放组件使用详解
  18. java中工具插件列表
  19. 下载模拟器提示关闭hyper,重启电脑不生效
  20. 使用cmd命令修改IP地址

热门文章

  1. 20220715 断路器与接触器 知识点
  2. 有没有比较好的3Dmax灯光教程
  3. 极客专属浪漫!用涂鸦智能压力传感器DIY一款智能杯垫!
  4. 蓝桥杯单片机之DS1302时钟模块的使用
  5. “安装完成,某些产品无法安装”,完美干净的清楚CAD残留文件。顺利安装CAD。
  6. 大沥计算机学院,2021年南海区大沥水星学校电脑随机摇号录取名单
  7. Chevereto-Free(图床)搭建
  8. 数据结构个人笔记 第三课 顺序表和单链表
  9. vs2017 资源试图加载失败
  10. PGD 中 min-max 问题