python——一步步教你用pyganme完成贪吃蛇小游戏(简易初版)

引言

大部分人学会python的基础语法之后,都想着写爬虫,画画,当这两个都完成之后呢?那当然是写一个自己开发的小游戏了,而在所有的小游戏当中,又以贪吃蛇最经典,元素也最少,那么今天,我就给大家讲一下一个初级的贪吃蛇程序该怎么写。

步骤

第一步:确定画布

首先,我们需要生成我们的游戏画布,确定大小颜色和标题等,因为今天介绍的是简版,所以只要设定画布大小和标题就行,背景颜色看个人喜好添加与否。


screen = pg.display.set_mode((500, 500))

pg.display.set_caption('贪吃蛇大作战')

fps = pg.time.Clock()

在这里,我将要生成的是一个500的正方形画布,标题就叫贪吃蛇大作战

python——一步步教你用pyganme完成贪吃蛇小游戏(简易初版)
第二步:梳理方法

在编写程序之前,我们需要先理清楚贪吃蛇需要哪些方法(即过程),以及各自的目的:

方法目的def foods建立生成新食物位置方法,需要食物不在蛇头处def draw建立绘制蛇与食物的方法def snake_die判断蛇是否死了(蛇头出界或者触碰到身体)def move_snake移动蛇,使蛇在画布上做出视觉上的移动def is_eat判断是否吃到食物def keyboard响应玩家操作things在画布上生成蛇与食物def game_run游戏运行程序

在过程梳理完之后,我们需要了解pygame库要用到什么函数,以及各自的作用:

函数作用display.set_mode创建显示窗口,可以设置窗口大小display.set_caption设置标题time.Clock()设置屏幕刷新率,也就是fps,配合.tick(n)设置速度为n,n越大刷新越快,蛇的速度也就越快draw.rect在画布上绘制图案,传参为创建的窗口,颜色,位置,大小event.get()获得事件,例如QUIT退出,KEYDOWN键盘等display.set_mode.fill设置背景,可以是颜色也可以是图像display.flip()刷新屏幕,整体全部刷新display.update()刷新屏幕,可以传参,传参即刷新传入的内容,不传参与 flip一致

第三步:编写方法

方法梳理完毕,函数也了解清楚后,就开始编写我们的几个过程内容吧:


def foods(head):
    while True:
        x = random.randint(1, 49) * 10
        y = random.randint(1, 49) * 10
        new_food = [x, y]
        if head[0] == x and head[1] == y:
            continue
        else:
            break
    return new_food

当旧食物被吃掉后,我们需要生成新的食物,新食物的位置利用random随机生成,就需要判断新食物不与蛇头重合,如果重合,则重新生成。


def draw(color, pos):
    pg.draw.rect(screen, color, pg.Rect(pos[0], pos[1], 10, 10))

这个方法是对draw.rect的加工,方便后面绘制蛇与食物的时候代码简便


def snake_die(head, body):

    die_flag = False

    for bd in body:
        if head[0] == bd[0] and head[1] == bd[1]:
            die_flag = True

    if head[0] > 500 or head[0] < 0 or head[1] > 500 or head[1] < 0 or die_flag:
        sys.exit()

玩过贪吃蛇的都知道,蛇头不能超过屏幕,超过的话就gameover,蛇头触碰到身体也是如此,所以这里就判断蛇头位置,给一个默认False的flag,如果蛇头超限或者与身体重合,flag变为True,游戏结束,退出游戏


def keyboard(run_snake):
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        elif i.type == pg.KEYDOWN:
            if i.key == pg.K_UP and run_snake != '↓':
                run_snake = '↑'
            if i.key == pg.K_DOWN and run_snake != '↑':
                run_snake = '↓'
            if i.key == pg.K_LEFT and run_snake != '→':
                run_snake = '←'
            if i.key == pg.K_RIGHT and run_snake != '←':
                run_snake = '→'
    return run_snake

玩家按键之后,系统做出响应,读取按键并给出移动方向。


def move_snake(run_snake, head, body):
    body.insert(0, [head[0], head[1]])

    if run_snake == '↑':
        head[1] -= 10
    elif run_snake == '↓':
        head[1] += 10
    elif run_snake == '←':
        head[0] -= 10
    elif run_snake == '→':
        head[0] += 10

贪吃蛇,最重要的就是蛇的移动,不能动或者乱动,那游戏就不成立,
这里每次移动前将旧蛇头位置插入身体数据里,然后判断按键,根据不同方向键蛇头做出不同反应。


def is_eat(head, food, body):

    if head[0] == food[0] and head[1] == food[1]:
        new_food = foods(head)

    else:
        body.pop()
        new_food = food
    return new_food

蛇移动结束,判断是否吃到食物,吃到则获取新食物坐标,没吃到则将身体最后一节的数据删除


def things(food, head, body):

    draw(red, food)

    draw(green, head)

    for pos in body:
        draw(white, pos)

前置数据准备完毕,在画布上生成游戏元素


def game_run():

    run_snake = '→'

    head = [250, 250]
    body = [[head[0] - 10, head[1]], [head[0] - 20, head[1]], [head[0] - 30, head[1]]]

    food = [300, 300]

    while True:
        run_snake = keyboard(run_snake)
        move_snake(run_snake, head, body)
        snake_die(head, body)
        food = is_eat(head, food, body)

        screen.fill(black)

        things(food, head, body)

        pg.display.update()

        fps.tick(6)

设定初始蛇头,蛇身,食物位置以及初始运动方向,调用前面的方法运行,因为游戏不是一次性渲染静图,而是一直在改变的,所以需要死循环维持游戏运行。

第四步:整合运行

过程方法编写完成,最后,我们就需要将代码组合,形成我们最终的程序,然后运行,我们的贪吃蛇简易小游戏就完成了。

import sys

import pygame as pg
import random

pg.init()

white = 255, 255, 255
red = 255, 0, 0
green = 0, 255, 0
black = 0, 0, 0

screen = pg.display.set_mode((500, 500))

pg.display.set_caption('贪吃蛇大作战')

fps = pg.time.Clock()

def foods(head):
    while True:
        x = random.randint(1, 49) * 10
        y = random.randint(1, 49) * 10
        new_food = [x, y]
        if head[0] == x and head[1] == y:
            continue
        else:
            break
    return new_food

def draw(color, pos):
    pg.draw.rect(screen, color, pg.Rect(pos[0], pos[1], 10, 10))

def snake_die(head, body):

    die_flag = False

    for bd in body:
        if head[0] == bd[0] and head[1] == bd[1]:
            die_flag = True

    if head[0] > 500 or head[0] < 0 or head[1] > 500 or head[1] < 0 or die_flag:
        sys.exit()

def keyboard(run_snake):
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        elif i.type == pg.KEYDOWN:
            if i.key == pg.K_UP and run_snake != '↓':
                run_snake = '↑'
            if i.key == pg.K_DOWN and run_snake != '↑':
                run_snake = '↓'
            if i.key == pg.K_LEFT and run_snake != '→':
                run_snake = '←'
            if i.key == pg.K_RIGHT and run_snake != '←':
                run_snake = '→'
    return run_snake

def move_snake(run_snake, head, body):
    body.insert(0, [head[0], head[1]])

    if run_snake == '↑':
        head[1] -= 10
    elif run_snake == '↓':
        head[1] += 10
    elif run_snake == '←':
        head[0] -= 10
    elif run_snake == '→':
        head[0] += 10

def is_eat(head, food, body):

    if head[0] == food[0] and head[1] == food[1]:
        new_food = foods(head)

    else:
        body.pop()
        new_food = food
    return new_food

def things(food, head, body):

    draw(red, food)

    draw(green, head)

    for pos in body:
        draw(white, pos)

def game_run():

    run_snake = '→'

    head = [250, 250]
    body = [[head[0] - 10, head[1]], [head[0] - 20, head[1]], [head[0] - 30, head[1]]]

    food = [300, 300]

    while True:
        run_snake = keyboard(run_snake)
        move_snake(run_snake, head, body)
        snake_die(head, body)
        food = is_eat(head, food, body)

        screen.fill(black)

        things(food, head, body)

        pg.display.update()

        fps.tick(6)

game_run()

python——一步步教你用pyganme完成贪吃蛇小游戏(简易初版)
第五步:总结

好了,本次贪吃蛇教程到这就结束了,因为是简易版,就没管分数,动态速度,背景,游戏素材方面了,后面我会慢慢在这个基础上完善,喜欢的话记得点赞收藏关注哦,后续完成后我还会分享到博客上的,拜拜。

小伙伴如果在阅读或实现过程中遇到问题的,可以评论区问我,我上线看到后会给你解答的。

Original: https://blog.csdn.net/weixin_43849193/article/details/120459583
Author: 轮回摆渡者
Title: python——一步步教你用pyganme完成贪吃蛇小游戏(简易初版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/781038/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 用python的pandas读取excel文件中的数据

    一、读取Excel文件 使用pandas的 read_excel()方法,可通过文件路径直接读取。注意到,在一个excel文件中有多个sheet,因此,对excel文件的读取实际上…

    Python 2023年8月1日
    054
  • 1.1 Qt Creater使用Python开发桌面软件的操作流程

    Qt Creater及Python的下载与安装过程不再赘述,读者可自行在网上搜索相应的下载与安装方法。首先我们打开Qt Creater,单击”Create Projec…

    Python 2023年11月3日
    047
  • 单例设计模式

    目标: 单例设计模式 __new__方法 Python中的单例 1.单例设计模式 设计模式: 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式,都是针对 某一特定…

    Python 2023年5月25日
    075
  • SKnet论文解读

    本文讲述sknet的核心部分:自适应性的注意力编码机制 SKNet 对不同输入使用的卷积核感受野不同,参数权重也不同,可以自适应的对输出进行处理 注:本人才疏学浅,文章难免有疏漏之…

    Python 2023年10月10日
    040
  • Python批量修改、删除、替换xml文件内容(labelimg标注)

    使用模型训练自定义数据集之前,在用在网上搜索得到的图片制作数据集时,即使批量修改图片名称后,在使用labelimg标注得到的xml文件中,图片名称还是网络上图片原本的名称,这时需要…

    Python 2023年8月2日
    033
  • Flask项目的云服务器选择和部署

    本来是自己搭一些东西,没想到一波三折,云服务器买了好几家,索性写一篇云服务器对比和使用体验。 文章重点是通过Python的Flask框架,来在云服务器部署一个web服务。 Flas…

    Python 2023年8月12日
    048
  • drf – Django Rest Framework Permissions权限验证详解

    官方解释: 权限检查总是在视图的最开始运行,然后才允许其他代码继续。权限检查通常使用请求中的身份验证信息。用户和请求。验证属性,以确定传入请求是否应被允许。 权限用于授予或拒绝不同…

    Python 2023年8月4日
    041
  • 【模型部署】运行Flask应用

    项目场景: 项目需要部署模型,因此简单了解了一下Flask。我的情况是本地机器不行,一切操作都在服务器端,本地只是打开网页。 问题描述: 在尝试写了一个简单的Flask应用,测试运…

    Python 2023年8月13日
    045
  • OpenCV第四章

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 第四章 像素的操作 一、像素 * 修改BGR的值 二、使用NumPy模块操作像素 * 复制数组的方法 索…

    Python 2023年8月26日
    036
  • conda创建环境、安装包到环境迁移

    0x01. conda的基本操作 Anaconda是包管理器和环境管理器,作为优秀的环境处理工具,一定要把它发挥出效果,游戏开始! 0x01_1 创建虚拟环境 用conda创建一个…

    Python 2023年9月8日
    065
  • 【论文笔记】 Popularity Bias in Dynamic Recommendation

    Authors: Ziwei Zhu, Yun He, Xing Zhao, James Caverlee KDD’21 Texas A&M Universit…

    Python 2023年10月26日
    039
  • Vue-cli介绍

    vue基本语法非常容易理解,如果在接触vue之前,接触过微信小程序,基本可以说轻车熟路.反过来也是如此. vue 之所以强大切易用离不开vue-cli\vue-router\vue…

    Python 2023年6月12日
    054
  • pygame实现贪吃蛇——1.界面搭建

    前言 之前尝试了自己用pygame写井字棋,这次玩的是贪吃蛇系列。个人感觉模块可能会比较大,所以选择将函数和主要逻辑代码分在了两个文件中。fuc为函数模块,存储了事件感应和刷新界面…

    Python 2023年9月25日
    037
  • Pandas使用笔记-Dataframe的基本操作

    Pandas的dataframe是类似java中数据库的一种结构。因为之前的代码使用了python,所以后台使用dataframe 作为数据库写了一个页面。下面是dataframe…

    Python 2023年8月21日
    043
  • python 第三方库大全

    一、测试和调试 python_koans:Python Koans 算 “Ruby Koans” 的一部分,作为交互式教程,可以学习 TDD 技巧。sure…

    Python 2023年5月24日
    078
  • 「 Python数据可视化系列」5. 使用NumPy和Matplotlib进行数据可视化

    来源 | 「Practical Python Data Visualization A Fast Track Approach To Learning Data Visualiza…

    Python 2023年9月4日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球