学生学python编程---实现贪吃蛇小游戏+源码

    • 前言
  • 主要设计
    • 1、蛇的表示
    • 2、蛇怎么移动?
    • 3、玩家控制小蛇移动功能的实现
    • 4、如何判定游戏结束?
  • 应用知识点
    • 1、python知识点
      • 1.1 列表
      • append()在列表未尾增加一个元素
      • del 删除最后一个元素
      • 在指定位置增加元素用insert()
      • 1.2 time 时间模块
      • 1.3 random模块
    • 2、pygamezero知识点
      • 2.1 游戏角色Acto
      • 2.2 输出中文字体
      • 2.3键盘控制
  • 功能截图
  • 代码实现
      • 1、蛇的表示
    • 2、蛇的前进移动
    • 3、控制移动方向
    • 4、游戏失败
    • 5、食物的随机出现
    • 6、游戏得分
  • 总结
  • 源码获取

前言

这几年人工智能技术大发展,Python因此几乎成了第一位的语言。实际上,多年来,它不仅在软件工程师中得到广泛使用,也是各行业通用的专家语言,就是说,不管孩子以后做什么,都可能用得着。准备针对我自己上小学的孩子,每周抽出些时间,通过学习他们感兴趣的小游戏,逐步把python知识点带进游戏的制作过程中,用到哪些知识简单的解绍一下哪些,以学,以用为主。
本次我们将编写一个贪吃蛇的游戏。通过键盘上、下、左、右控制小蛇上、下、左、右移动,吃到食物后长度加1;蛇头碰到自身或窗口边缘,游戏失败。我们首先构造小蛇,实现小蛇向4个方向移动;然后实现游戏失败的判断、吃食物增加长度、得分功能;每段游戏,增加一个功能,另存一下,容易让孩子理解学习,同时也可以让其在每个阶段增加他想增加的功能,一举多得。最后学习函数的定义与使用,并通过进行时间控制变更游戏难度。

主要设计

1、蛇的表示

游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
蛇怎么表示?我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,蛇头用个蛇头(圆带两个眼睛)表示,蛇身用个圆表示。我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了。

2、蛇怎么移动?

第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。(由于蛇头与蛇身是不同的图片,还需要把第二张也即原先的蛇并没有照片换成蛇身照片,要不跑几步就成一串蛇头了,你可以试试,把蛇身换蛇头的那行代码注释掉就可看到了。)

3、玩家控制小蛇移动功能的实现

玩家控制小蛇移动功能的实现
玩家控制小蛇移动,在update()函数中实现用户按上、下、左、右方向键,设定direction变量取不同的值,即可实现玩家键盘控制小蛇向4个方向移动。即通过一个公共变量direction来实现,当键盘按不同的上下左右键时修改公共变量direction就达到了玩家控制小蛇方向的问题。

4、如何判定游戏结束?

“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?
如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?
理清了这些问题,我们就可以开始编码了。

应用知识点

1、python知识点

1.1 列表

游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
列表,数据类型list,list是python内置的一种高级数据类型。list是一种有序的集合,基于链表实现 在python中应用很广泛,可以随时添加和删除其中的元素。在此游戏中用于表是蛇身,由蛇头,蛇身组成,吃个食物,蛇身增加一段,即应用列表添加一个蛇身图片。蛇身的移动,用到了列表的添加与删除功能。len()可以获得列表长度。用索引来访问list中每一个位置的元素,记得索引是从0开始的,也可以用负数,表示从-1表示列表最后一个。

append()在列表未尾增加一个元素

如:Snake.append(snakebody) # 把蛇身加入列表中

del 删除最后一个元素

del Snake[len(Snake)-1] # 删除旧蛇尾
也可用 del Snake[-1]

在指定位置增加元素用insert()

如:Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面

1.2 time 时间模块

属于Python的时间模块。基本上,这会增加执行延迟,并且只会暂停当前线程,而不会暂停整个程序。
Python的time模块中提供了Python time.sleep()函数。在使用此Python函数之前,您需要使用以下命令导入此模块:import time
导入此模块后,即可使用time.sleep()函数。语法如下:
句法:睡眠(秒),如您所见,它需要一个参数,即秒。在执行过程中,这基本上会引起这么多秒的延迟,此游戏中应用到sleep(0.2),让游戏更新时暂缓0.2秒,通过此参数可以调试蛇的移动速度。

1.3 random模块

random() 方法返回随机生成的一个实数,它在[0,1)范围内
import random
random.random()
#randint函数,返回指定范围的一个随机整数,包含上下限
random.randint(0,99)#返回0~99之间的整数

2、pygamezero知识点

Pygame Zero这个神器,它对PyGame做了很多封装,避免写很多枯燥的框架代码,让初学者可以更专注于游戏核心逻辑,容易上手。

2.1 游戏角色Acto

游戏角色Actor pgzero中所有以图片显示的元素都是Actor类来定义,如snakebody = Actor(‘snake2’) # 导入蛇身方块图片。也可以理解为Actor是用来代表一个你绘制到屏幕的图形。
通过把字符串 ‘snake2’ 作为参数传递给 Actor 类,Pygame Zero自动加载了外星人精灵,并且图片具有位置和大小属性。snake2是指images文件夹下snake2.png图片。也可以apple = Actor(‘apple’,(200,300)) # 设置图片apple的位置。连图片带位置一起指定。
一个免费的png图片下载网站:https://kenney.nl/assets/page:3?q=2d

2.2 输出中文字体

显示中文 准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttf
if isclose: # 显示游戏失败信息
screen.draw.text(“游戏失败!”, (120, HEIGHT/2-100),
fontsize=100, fontname=‘simhei’, color=‘yellow’)

2.3键盘控制

from pgzero.keyboard import keys, Keyboard
可以查询下原码,通过keys.w,keyboard.left等进行控制

功能截图

代码实现

1、蛇的表示

import pgzrun # 导入游戏库
TILE_SIZE = 30 # 小蛇方块的大小,20×20
WIDTH = 20*TILE_SIZE # 设置窗口的宽度为800
HEIGHT = 20*TILE_SIZE # 设置窗口的高度为600snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入列表中
for i in range(4): # 再为蛇添加4段蛇身print(i)snakebody = Actor('snake2') # 导入蛇身方块图片snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标snakebody.y = Snake[i].y # 蛇身方块图片的y坐标Snake.append(snakebody) # 把蛇身加入列表中def draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()pgzrun.go() # 开始执行游戏

2、蛇的前进移动

蛇一直向右移动,直至完全走出屏幕

direction = 'right'
def update(): # 更新模块,每帧重复操作newSnakeHead = Actor('snake1') # 创建新蛇头的图片    # 根据direction变量设定新蛇头的坐标    # 如小蛇向下移动,就在旧蛇头的下边if direction == 'right': # 小蛇向右移动newSnakeHead.x = Snake[0].x + TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'left': # 小蛇向左移动newSnakeHead.x = Snake[0].x - TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'up': # 小蛇向上移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y - TILE_SIZEif direction == 'down': # 小蛇向下移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y + TILE_SIZESnake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面Snake[1].image='snake2'del Snake[len(Snake)-1] # 删除旧蛇尾

3、控制移动方向

def update(): # 更新模块,每帧重复操作global direction,iscloseif keyboard.left: # 如果按下键盘向左方向键direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下键盘向右方向键direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下键盘向上方向键direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下键盘向下方向键direction = 'down' # 小蛇要向下移

4、游戏失败

    # 当小蛇(新蛇头)超出边框时,游戏失败if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isclose = Truedef draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()# 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttfif isclose: # 显示游戏失败信息screen.draw.text("游戏失败!", (120, HEIGHT/2-100),fontsize=100, fontname='simhei', color='yellow')

5、食物的随机出现

当小蛇头碰到食物时,不处理,也就是长度+1;青蛙重新在随机位置出现;

 if newSnakeHead.x == food.x and newSnakeHead.y == food.y:food.x = random.randint(5, 20) * TILE_SIZEfood.y = random.randint(5, 20) * TILE_SIZEscore = score + 1  # 得分加1

6、游戏得分

设置公共变量score,当小蛇吃到食物时,score值加1,更新时屏幕显示出得分,用如下语句。

    screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,fontname='simhei', color='white')

总结

这次我们主要制作了贪吃蛇游戏,了解了time模块的sleep函数、clock模块的schedule等功能,学习了列表的插入函数、break与continue语句、函数的定义与调用等知识点。读者可以尝试在本章代码的基础上继续改进:1.实现得分越来越高,游戏速度越来越快的效果;2.实现蛇头、蛇身不同颜色的显示效果;

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 29 /50个。
可以关注我,点赞我、评论我、收藏我啦。

学生学python编程---实现贪吃蛇小游戏+源码相关推荐

  1. 【180928】美女贪吃蛇小游戏源码

    本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...

  2. 贪吃蛇小游戏源码分享

    创建2个文件夹,一个是放源码还有一个文件夹是发图片的. 然后创建三个实体类. package com.Bubbles.snake; import javax.swing.*; import java. ...

  3. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  4. 贪吃蛇小游戏源码再回顾

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  5. 带看板娘玩法指导的贪吃蛇小游戏源码

    介绍: 左下角带看板娘插件,给玩家实时提示和介绍游戏玩法. 上下左右控制方向,数字0暂停,E加速,Q 减速,回车自动/手动切换. 网盘下载地址: http://kekewl.org/bJSm3CqBo ...

  6. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  7. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

  8. python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目

    另外要注意:光理论是不够的.这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交 ...

  9. 10分钟用Python编写一个贪吃蛇小游戏

    贪吃蛇,大家应该都玩过.当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最主要 ...

最新文章

  1. flask + celery
  2. YOLO训练Pedestrain
  3. pwn学习总结(三) —— 栈溢出经典题型整理
  4. Memcached 缓存个体,对象,泛型,表
  5. HDU - 4738 Caocao's Bridges(边双缩点)
  6. 对于大家族Sring这些你究竟了解吗
  7. java中程序跳转_java程序中先后台交互的两种实现方式以及页面之间的跳转
  8. 对Linux的cp命令的思考
  9. tf.concat, np.concatenate
  10. 21. RequireJS
  11. 昨天我遇到一个令我敬佩的人
  12. 计算机打印服务总是自动关闭,XP系统Print spooler总是自动关闭的解决方法
  13. 专利学习笔记7:说明书附图尺寸
  14. 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
  15. Win7系统网络共享中心打不开,网络连接标识一直转圈
  16. Windows 10免费影音制作下载(Windows Movie Maker 2012)
  17. 百科系统php,HDwiki与PHPCMS联合推出开源中文Wiki系统
  18. 【论文笔记】Question Answering with Subgraph Embeddings
  19. 推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别
  20. 精短高效的XML解析器,纯C单一程序,应用于银行的国税库行横向联网接口系统中,稳定可靠,运行速度飞快

热门文章

  1. adc0809工作过程C语言,ADC0809的工作原理
  2. 变桨滑环的功能与作用
  3. Review of Feature Selection, Dimensionality Reduction and Classification for Chronic Disease Diagnos
  4. 计算机六级准考证,2016英语四六级准考证查询系统
  5. 朱兰的质量三部曲——《可以量化的管…
  6. 火车头采集案例 - js源码获取真实地址
  7. 相机稳定性测试软件,用于天文观测的科学级相机成像和测试软件的研究
  8. FAQ翻译 第一章 C++蓝图
  9. 华为OD机试 - 最优资源分配(Python) | 机试题算法思路 【2023】
  10. 三维空间点的直线方程拟合(最小二乘法)