不晓得有多少同学跟我一样,最后接触编程的动机就是为了本人做个游戏玩?

Python 尽管并不是一个“为游戏而生”的语言,但也有着本人的游戏引擎。最罕用的就是 pygame 。另外还有一个出名游戏引擎 cocos2d ,它的最后版本就是基于 python 的 cocos2d-python。这两个引擎咱们都有过案例,其中 pygame 更是做过一个较为详尽的入门教程 --《打飞机》小游戏,链接见文末。

明天要给大家分享的是一个 pygame 写的“ 贪吃蛇 ”小游戏:

“贪吃蛇”这个小游戏在编程学习中的常客,因为:

1. 简略 ,最根本的游戏元素只须要蛇和食物两个就能够进行了。(打飞机还须要三个元素呢,想想别离是什么?)方向的话只有上下左右4个固定方向就能够了。

2. 有根本的 数据结构面向对象 的思维在其中。游戏开发自身就会用到很多面向对象的概念,而蛇的身材又是一个人造的“ 链表 ”构造,太适宜用来练习数据结构了。

另外比拟乏味的一点是,Python 这个单词在英语里就是 蟒蛇 的意思,贪吃蛇能够算是“同名游戏”了。

很多学校里程序开发课程的作业都会有贪吃蛇的选题,也常常会有同学问到咱们相干的代码。(诺基亚手机对这款游戏也是情有独钟。)之前我做过一个《 贪吃蛇大作战 》的 Python 版本,基于 cocos2d-python 开发。但那个对于初学者来说有些简单了。这次是由咱们的助教 @清风小筑 开发的一个更加适宜初学者学习的繁难版本。

对于整个开发过程及代码的具体阐明,咱们都写在了文档里,一并上传了 github。须要的同学可自行下载练习,可尝试更改蛇的速度、色彩,增加多个食物等。(获取地址请在公众号 Crossin的编程教室 里回复关键字 贪吃蛇

这里咱们做个简要介绍:

此代码基于 pygame 开发,所以运行前请确保你的 Python 里已胜利装置 pygame。而后间接运行代码中的 mySnake.py 即可开始游戏。

除了最终的代码外,咱们还特意合成了几个过程中的 py 文件,供想要本人开发的同学参考。

开发思路

游戏开发通常都会采纳 面向对象 的设计。这里咱们有三个类: 食物 ,另外还有 背景 (用来绘制格子)。

游戏的主循环里次要顺次做这么几件事:

  1. 获取键盘事件
  2. 绘制背景
  3. 更新蛇的地位
  4. 画蛇、食物
  5. 碰撞检测
  6. 屏幕刷新

蛇和食物的绘制都是通过 pygame 里的 Surface 对象实现,绘制不同色彩的格子。

蛇的身材应用 Rect 对象,通过 list 保留。

蛇的 挪动 是这个游戏的外围操作。咱们没有抉择批改蛇的地位,而是每次挪动时,依据蛇的前进方向减少一个头部节点,其余地位都向前挪动一个节点,并删除尾端节点,这样就等于实现了蛇的挪动。如果是吃到了食物,就在尾部再加上节点,就实现了增长。

游戏中要做 碰撞检测 ,这个用 pygame 的 colliderect 就行。咱们要判断:1.撞墙了没?2.撞本人了没?3.撞到食物了没?而后别离做不同的解决

游戏主循环的外围代码:

while going:    lastt = clock.tick(60) # 帧率 60    dt += lastt # 累计工夫    c += 1    # 0 键盘按压等事件响应    for event in pygame.event.get():        if event.type == pygame.QUIT: sys.exit()        elif event.type == KEYDOWN:            if event.key == K_UP and validDirect != 0: direct = 1 # 按了向上 1 并且以后方向不是向下 0 ,则向上            elif event.key == K_DOWN and validDirect != 1: direct = 0 # 向上 1 ,向下 0            elif event.key == K_LEFT and validDirect != 2: direct = 3 # 向左 3, 向右 2            elif event.key == K_RIGHT and validDirect != 3: direct = 2     # 0.1 画全屏的彩色背景    screen.fill(black)    # 1 判断是否挪动    if dt > interval: # 挪动的工夫距离        validDirect = direct        dt = 0 # 初始化工夫        endPop = s.move(snake,direct)    # 1.1 画蛇    for i in snake:        screen.blit(s.ball, i)    # 2 画线条    b.drawGrid(screen)    # 3.1 分数更新    scoret=b.scoref.render(str(score), True, (255, 255, 255)) # 实时得分    screen.blit(scoret, (0, 0)) # 实时分数    scoret2=b.scoref.render('best:'+str(best), True, (255, 255, 255)) # 最佳得分    screen.blit(scoret2, (width-6*edge, 0)) # 最佳分数    # 3.2 食物    screen.blit(f.food, foodr) # 依据 fr(Rect 对象) 更新 food(Surface 对象) 地位 ,绘图    # 4 判断撞击    clli = s.strike(snake,foodr)    if clli == 0: # 撞墙 撞本人        going = False    elif clli == 1: # 吃果实        snake.append(endPop) # 长尾巴        score += 1        if not f.get_foodpos(foodr,snake): going = False # 生成 food 新地位, 如果占满全屏,则退出    # 5 屏幕刷新    pygame.display.flip() # 显示图形

残缺代码和具体阐明比拟长,就不都贴在这里了,大家能够下载我的项目到本地后查看及运行。获取我的项目地址请在公众号 Crossin的编程教室 里回复关键字 贪吃蛇

文中代码由 清风小筑 实现,码上口头的学员如有问题可间接在答疑群中找他探讨。

还有之前的两篇相干文章供参考:

Crossin:爆款游戏《贪吃蛇大作战》的 Python 实现

Crossin的编程教室 - PyGame

------

一起学,走得远!

欢送搜寻:Crossin的编程教室