bat贪吃蛇游戏代码_使用pygame制作小游戏用来交作业

      事情是这样的。

      毛概实践作业有个专业实践,要结合专业,做点和毛概相关的东西出来。大家都以为是五月底截止,没想到前几天忽然说这个月17号就截止了,都被吓到了。于是连续刚了好几晚上,总算及时做出来了。

      这次没有用之前常用的Unity3D,这东西不适合做2D游戏,用起来虽然简单,但想定制化需要做一些操作,就有点麻烦。之前关注了一个公众号,叫Charles的皮卡丘。作者用python的pygame模块做了许多2D小游戏,而且全部在我当时有跟着看,但都是走马观花,趁着这个机会,正好仔细学一学,给自己个挑战。

      下面先来看个通关视频,看完就知道这个项目做了点啥了。

      可以看到这个游戏一共三关,一共有三种怪物。人物的武器只有一种,但可以捡拾随机刷新的回旋镖来秒杀怪物。

      下面来说说这游戏是怎么做出来的。

      首先,我不会pygame。为了快速入门,我选择直接看现成的项目代码,也就是之前提到的Charles的皮卡丘的游戏代码。在他的公众号获得github地址后(https://github.com/CharlesPikachu/Games),我查看了其中两个,一个是贪吃蛇,一个是打地鼠。

      贪吃蛇逻辑比较简单,先看的这个。从这个项目里,我学会了pygame的基本流程:

f575ea45-2b1a-eb11-8da9-e4434bdf6706.png

      首先是一个死循环,然后里面是捕捉各种事件的for-each循环,在这个循环前后都可以做图形的绘制和逻辑操作,而后是update,将上述的代码更新显示。这个死循环每次循环都会播放一帧,如果不加以控制事件,就会按照程序运行的速度播放,这是不太好的,有时会导致播放速度的波动。在贪吃蛇里用的方法是

f675ea45-2b1a-eb11-8da9-e4434bdf6706.png

      第一行写在死循环外,第二行在update之后执行。tick函数里的参数是设置好的帧数,例如填写60,则会强制按照一秒60帧来运行游戏,解决了直接While循环的问题。

     然后,我发现这个项目里的游戏物体都是用一个类来封装的,且无一例外,全都继承了父类Sprite(精灵类)。不太懂什么意思,但我一边看这个代码,一边写demo,的确能体会到封装成类的好处,大大方便了游戏的交互,使游戏主逻辑清晰明了。Sprite类究竟有什么好处,现在我还不得而知。在第二个项目里,Sprite类可以用来做碰撞检测,非常方便。我的游戏里也只是用到了这一个功能而已。

f775ea45-2b1a-eb11-8da9-e4434bdf6706.png

(碰撞检测的例子。判断主角和刷新出的回旋镖是否碰撞,即是否吃到。)

      此外,还有一些游戏必备要素的代码写法。

      音乐、音效的播放:

f875ea45-2b1a-eb11-8da9-e4434bdf6706.png

(音效)

f975ea45-2b1a-eb11-8da9-e4434bdf6706.png

(音乐)

      文字:

fa75ea45-2b1a-eb11-8da9-e4434bdf6706.png

(读取字体,设置大小。设置文本。通过rect设置位置。在循环中绘制。)

      各种事件,如鼠标事件、键盘事件、自定义间隔事件等等。

      上面的这些,每次新学到后我都记录了下来。因为比较零碎,就没有仔细分类,统统记在onenote里的一页中。

fb75ea45-2b1a-eb11-8da9-e4434bdf6706.png

      这样做,学习代码速度还是很快的,只需要记住学了什么,不用去记实现的细节,写的时候随时参考就行了。这一页纸就像我大脑的U盘,需要用的时候,再提取到内存里。

      然后我发现,差不多可以开始写了。

      写的时候还是有不少困难的,刚学,东西记不住,总需要查查查,但我写完整个项目后,发现经过不断地重复,我已经不再依赖之前的记录,基本可以想到什么写什么了。感觉这种学习方法还是挺有效的。

      因为游戏比贪吃蛇什么的还是复杂一点的,一定要设计好类的结构,设计好每个文件要做什么。我以前写这个就是想到哪写到哪,经常写到一半才发现设计有问题,要重新结构......于是这次采取的方式是,先建立好各个文件,在每个文件里注明要做什么事,要写哪些类哪些方法,都各自要实现什么功能。

      大概用了一个多小时的完成所有的注释。而后,我们有了整个项目框架的大体概念,跟着注释写就快得多了。

      差不多是每一个画面写一个函数,里面是死循环,然后加一些变量来控制跳转,一个游戏就这么写完了。这种写代码方式还是值得推荐的,在自己一个人写代码,不想画类图写文档的时候,可以起到替代的作用。

      此外,还借鉴那两个项目,使用了配置文件cfg.py来记录常量,发现非常爽,写出来干净整洁,还便于修改。

      总体来说游戏挺简单,但整个制作的过程我觉得还是让我有不少收获的。

      具体代码细节就不赘述了,有兴趣可以下载了看一看,里面也有打包好了的exe文件,直接就能玩。

      项目地址:https://gitee.com/worldTester/Game

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pygame是一个流行的Python库,用于创建2D游戏,其中包括著名的贪吃蛇游戏。编写一个基本的贪吃蛇游戏的源代码可能会包含以下几个主要部分: 1. **导入模块**: ```python import pygame import sys ``` 2. **初始化pygame**: ```python pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("贪吃蛇") clock = pygame.time.Clock() ``` 3. **定义贪吃蛇类 (Snake)**: ```python class Snake: def __init__(self): self.body = [[100, 100], [90, 100], [80, 100]] # 初始位置和长度 self.direction = [0, 1] # 默认向右移动 def move(self): new_head = [self.body + self.direction, self.body + self.direction] self.body.insert(0, new_head) # 在头部添加新位置 if new_head in self.body[1:]: game_over = True # 如果头撞到身体,则游戏结束 else: self.body.pop() # 移除蛇尾 return not game_over ``` 4. **绘制贪吃蛇和食物(Food)**: ```python def draw_snake(screen, snake): for pos in snake.body: pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(pos, pos, 10, 10)) def place_food(snake): while True: food_pos = [random.randint(0, screen.get_width() // 10) * 10, random.randint(0, screen.get_height() // 10) * 10] if food_pos not in snake.body: break return food_pos ``` 5. **主游戏循环**: ```python snake = Snake() food_pos = place_food(snake) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() keys_pressed = pygame.key.get_pressed() if keys_pressed[pygame.K_UP] and snake.direction != [0, -1]: snake.direction = [-1, 0] elif keys_pressed[pygame.K_DOWN] and snake.direction != [0, 1]: snake.direction = [1, 0] elif keys_pressed[pygame.K_LEFT] and snake.direction != [1, 0]: snake.direction = [0, 1] elif keys_pressed[pygame.K_RIGHT] and snake.direction != [-1, 0]: snake.direction = [0, -1] snake.move() screen.fill((0, 0, 0)) # 清屏 draw_snake(screen, snake) draw_rect(screen, food_pos, (255, 0, 0)) # 绘制食物 pygame.display.flip() clock.tick(10) # 控制帧率 ``` 完整代码会包括更多的细节,如碰撞检测、得分计算等。如果你想深入了解整个源代码,请查阅相关的pygame教程或搜索在线示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值