基于Python实现贪吃蛇小游戏(附源码)

目录
  • 前言
  • 主要设计
  • 应用知识点
    • 1、python知识点
    • 2、pygamezero知识点
  • 功能截图
  • 代码实现
    • 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 # 设置窗口的高度为600

snkaeHead = 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_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left': # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up': # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down': # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面
    Snake[1].image='snake2'
    del Snake[len(Snake)-1] # 删除旧蛇尾

3、控制移动方向

def update(): # 更新模块,每帧重复操作
    global direction,isclose
    if 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 = True
    def draw(): # 绘制模块,每帧重复执行
    screen.clear() # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake: # 绘制蛇
        snkaebody.draw()
    # 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttf
    if 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_SIZE
        food.y = random.randint(5, 20) * TILE_SIZE
        score = score + 1  # 得分加1

6、游戏得分

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

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

源码

由于网友建意,把源码增加在此,为方便大家查询,特修改添之

# _*_ coding: UTF-8 _*_
# 开发团队: 信息化未来
# 开发人员: Administrator
# 开发时间:2022/9/4 18:02
# 文件名称: 贪吃蛇.py
# 开发工具: PyCharm

import pgzrun # 导入游戏库
from pgzero.actor import Actor
from pgzero.keyboard import Keyboard
from pgzero.screen import Screen
keyboard: Keyboard  # 类型标注
screen: Screen  # 类型标注

import time
import random # 导入随机库

TILE_SIZE = 30 # 小蛇方块的大小,20×20
WIDTH = 20*TILE_SIZE # 设置窗口的宽度为800
HEIGHT = 20*TILE_SIZE # 设置窗口的高度为600

snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标

food = Actor('food') # 导入食物方块图片
food.x = random.randint(10, 20)*TILE_SIZE # 食物方块图片的x坐标
food.y = random.randint(10, 20)*TILE_SIZE # 食物方块图片的y坐标

score = 0 # 游戏得分
direction = 'right'
isclose = False
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()
    food.draw()
    # 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件.ttf
    if isclose: # 显示游戏失败信息
        screen.draw.text("游戏失败!", (120, HEIGHT/2-100),
                         fontsize=100, fontname='simhei', color='yellow')  # fontname='宋体',
    screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,
                    fontname='simhei', color='white')

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

    newSnakeHead = Actor('snake1') # 创建新蛇头的图片    # 根据direction变量设定新蛇头的坐标    # 如小蛇向下移动,就在旧蛇头的下边
    if direction == 'right': # 小蛇向右移动
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left': # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up': # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down': # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    # 当小蛇(新蛇头)超出边框时,游戏失败
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isclose = True
        # 当小蛇蛇头碰到自身时,游戏失败
        for snakebody in Snake:
            # 对所有蛇身循环,判断是否和蛇头坐标一致
            if newSnakeHead.x == snakebody.x and  newSnakeHead.y == snakebody.y:
                isLoose = True
                break

    # 当小蛇头碰到食物时,不处理,也就是长度+1;青蛙重新在随机位置出现;
    if newSnakeHead.x == food.x and newSnakeHead.y == food.y:
        food.x = random.randint(5, 20) * TILE_SIZE
        food.y = random.randint(5, 20) * TILE_SIZE
        score = score + 1  # 得分加1
    else:  # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变
        del Snake[len(Snake) - 1]

    Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面
    Snake[1].image='snake2'
    # del Snake[len(Snake)-1] # 删除旧蛇尾
    time.sleep(0.2) # 暂停0.2s

pgzrun.go() # 开始执行游戏

总结

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

以上就是基于Python实现贪吃蛇小游戏(附源码)的详细内容,更多关于Python贪吃蛇游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现一个简单的贪吃蛇游戏附代码

    前言: 不知道有多少同学跟我一样,最初接触编程的动机就是为了自己做个游戏玩? 今天要给大家分享的是一个 pygame 写的“贪吃蛇”小游戏: “贪吃蛇”这个小游戏在编程学习中的常客,因为: 简单,最基本的游戏元素只需要蛇和食物两个就可以进行了.(打飞机还需要三个元素呢,想想分别是什么?)方向的话只要上下左右4个固定方向就可以了.有基本的数据结构和面向对象的思想在其中.游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了.另外比较有趣的一点是,Py

  • Python实现贪吃蛇小游戏(双人模式)

    简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简单,适合初学者练手.本上每行重要的语句都有注释,做了什么事一目了然 这里介绍双人模式 单人模式戳这里:Python简易贪吃蛇小游戏(单人模式) 一.游戏设计要点 1.游戏主体窗口(尺寸).画布(尺寸.位置).按钮(尺寸.位置).文字(大小.颜色.位置).图像.背景音乐及相关响应函数(主要是鼠标移动及点击的响应)的设计与合理排布 2.蛇与食物的类的属性设计 3.蛇位置的更新(根据键盘输入).吃到食物加分的判定.食物的更新 4.蛇死亡的判定条件设

  • python实现简单贪吃蛇小游戏

    本文实例为大家分享了python实现简单贪吃蛇的具体代码,供大家参考,具体内容如下 1. 导入游戏库 import pgzrun import random 2.游戏初始化 # 窗口大小 WIDTH = 600 HEIGHT = 480 # 贪吃蛇 bodys = [ [100,100],[80,100], [60,100], [40,100], [20,100]] head = [100,100] d = 'right' # 食物 food = [290,290] # 得分 score=0 3

  • Python实现贪吃蛇小游戏(单人模式)

    简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简单,适合初学者练手.基本上每行重要的语句都有注释,做了什么事一目了然 这里先介绍单人模式 一.游戏设计要点 1.游戏主体窗口(尺寸).画布(尺寸.位置).按钮(尺寸.位置).文字(大小.颜色.位置).图像.背景音乐及相关响应函数(主要是鼠标移动及点击的响应)的设计与合理排布 2.蛇与食物的类的属性设计 3.蛇位置的更新(根据键盘输入).吃到食物加分的判定.食物的更新 4.蛇死亡的判定条件设计 二.主要模块 1.pygame 2.sys 3.r

  • Python使用海龟绘图实现贪吃蛇游戏

    在实现贪吃蛇游戏时,首先需要使用python内置的turtle模块来实现创建游戏窗体与键盘按键的监听工作,然后使用freegames模块进行贪吃蛇的绘制工作. 1.turtle模块 turtle模块是python的内置模块,所以在使用前需要使用import导入该模块.代码如下: import turtle (1) 创建游戏窗体可以使用turtle模块中的setup()方法来实现.语法格式如下: turtle.setup(width=_CFG["width"],height=_CFG[&

  • Java实战之贪吃蛇小游戏(源码+注释)

    一.工程文件 二.Main.java package com.company; import javax.swing.*; public class Main { public static void main(String[] args) { //创建窗体对象 JFrame frame = new JFrame(); //创建窗体参数() frame.setBounds(10,10,900,720); //设置不允许更改大小 //frame.setResizable(false); //设置关

  • 基于pygame实现贪吃蛇小游戏示例

    目录 游戏截图 引入库 初始化模型 获取键盘事件 移动贪吃蛇 吃食物逻辑 碰撞到自身逻辑 结束游戏 显示文字函数 完整代码 游戏截图 引入库 import copy import random import sys import pygame 初始化模型 # 蛇模型 snake_list = [[10, 10]] # 食物的模型 x = random.randint(10, 490) y = random.randint(10, 490) food_point = [x, y] food_r,

  • Java实现贪吃蛇大作战小游戏(附源码)

    目录 1.开发环境及游戏展示 1.1 游戏主界面 1.2 移动界面 1.3 奖励界面 1.4 F加速功能界面 1.5 死亡界面 2.需求分析 3.系统设计 3.1 系统总体功能设计 3.2 系统总体流程设计 4.功能设计 4.1 贪吃蛇移动及加速功能设计 4.2 贪吃蛇吃食物加速及死亡判定功能的设计 4.3 贪吃蛇主动加速功能的设计 4.4 贪吃蛇奖励机制功能的设计 5.项目结构与项目实现 5.1 项目结构及类间关系 5.2 项目完整源码 1.开发环境及游戏展示 贪吃蛇大作战在设计与实验的过程中

  • 基于MFC实现贪吃蛇小游戏

    本文实例为大家分享了MFC实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.功能描述 (1)通过"START"."PAUSE"."EXIT"三个控件,控制游戏的开始.暂停和终止. (2)通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子. (3)吃到豆子蛇身会变长,同时得分增加:碰到壁或者自身则该轮游戏结束. (4)游戏开始.暂停.结束时进行提示. 二.概要设计 1.系统框架 2.游戏流程 三.主要功能实现 1.主要函数 (1)Test

  • python实现贪吃蛇小游戏

    关于编写游戏,是博主非常向往的东西(博主喜爱游戏),编写游戏得一步一步的走!今天我简单的编写一下非常经典的游戏贪吃蛇!!!! 效果图: 首先引入pygame模块 pip install pygame 关于编写贪吃蛇有如下几个步骤!依次思考 1.设置背景大小,即游戏框大小,---像素(px) 2.设置颜色,蛇的颜色,背景颜色,豆子的颜色 #pygame游戏库,sys操控python运行的环境 import pygame,sys,random #这个模块包含所有pygame所使用的常亮 from p

  • 基于javascript实现贪吃蛇小游戏

    本文实例为大家分享了js贪吃蛇游戏的具体代码,供大家参考,具体内容如下 先不多说先上图 下面是代码部分(这里你可以根据需要改变蛇头和身体还有食物的图片,然后默认的样式是使用纯颜色的如果没有更改我的背景图片的话------改这些图开始是想搞笑一下朋友哈哈哈,请不要在意哈),还有操作键是使用 ↑ ↓ ← → ) <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo

  • Python实现贪吃蛇小游戏(单人模式)

    简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简单,适合初学者练手.基本上每行重要的语句都有注释,做了什么事一目了然 这里先介绍单人模式 一.游戏设计要点 1.游戏主体窗口(尺寸).画布(尺寸.位置).按钮(尺寸.位置).文字(大小.颜色.位置).图像.背景音乐及相关响应函数(主要是鼠标移动及点击的响应)的设计与合理排布 2.蛇与食物的类的属性设计 3.蛇位置的更新(根据键盘输入).吃到食物加分的判定.食物的更新 4.蛇死亡的判定条件设计 二.主要模块 1.pygame 2.sys 3.r

  • Python贪吃蛇小游戏实例分享

    本文实例为大家分享了Python实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 使用的库 pygame .random .pyautogui 流程简述 1.设置初始参数 设置每个网格大小为 20 px ,size可以随意修改但最好为20的倍数,设置初始方向向右,初始蛇长为 3 . # 初始化参数 size = 320 screen = pygame.display.set_mode([size,size],0 , 32) pygame.display.set_caption("贪吃蛇&qu

随机推荐

其他