pygame第6课——贪吃蛇小游戏

news2024/12/28 20:12:50

今天我们开始Pygame的第六课,前几节课的内容在这里【点我】,欢迎大家前去考古:

在这里插入图片描述

今天我们一起来学习制作一个小游戏【贪吃蛇】,这是一个非常经典的小游戏,那么我们一起开始吧

请添加图片描述

1、游戏准备工作

import pygame, random,os  # 导入pygame模块和random、os模块

os.environ["SDL_VIDEO_WINDOW_POS"]="100,100"  # 设置环境变量,设置窗口的位置在屏幕左上角(100,100)的位置

pygame.init()  # 初始化pygame

time_clock = pygame.time.Clock()  # 创建一个Clock对象用于控制游戏的速度

sc = pygame.display.set_mode((640, 480))  # 创建一个窗口,大小为640x480像素
pygame.display.set_caption("贪吃蛇")  # 设置窗口标题为“贪吃蛇”

font = pygame.font.SysFont("宋体", 48 , True)  # 创建一个字体对象,字体为宋体,大小为48像素,加粗显示

pink = (255, 182, 193)  # 定义颜色pink为RGB值(255, 182, 193)
violet = (238,130,238)  # 定义颜色violet为RGB值(238,130,238)
white = (255, 255, 255)  # 定义颜色white为RGB值(255, 255, 255)
green = (0,255,0)  # 定义颜色green为RGB值(0,255,0)
red = (255,0,0)  # 定义颜色red为RGB值(255,0,0)

这里的代码每一行都加了注释

os.environ["SDL_VIDEO_WINDOW_POS"]="100,100":这一行是指运行代码时,Pygame以左上角 的初始位置

time_clock = pygame.time.Clock() : 创建一个Clock对象用于控制游戏的速度

2、接下来我们创建一个 【贪吃蛇】类

class Snake():
    def __init__(self):
        self.direction = "right"
        # 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体
        self.body = [[100, 100], [80, 100]]
        self.head = list(self.body[0])  # 蛇头位置
    def draw_me(self):
        # 绘制身体
        for b in self.body:
            pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))

    def move_head(self):
        # 根据方向移动蛇头
        if self.direction == "right":
            self.head[0] += 20
        elif self.direction == "left":
            self.head[0] -= 20
        elif self.direction == "up":
            self.head[1] -= 20
        elif self.direction == "down":
            self.head[1] += 20

    def add_body(self):
        self.body.insert(0, list(self.head))
    def cut_tail(self):
        self.body.pop()
    def move_snake(self):
        self.add_body()
        self.cut_tail()

代码注释:

self.direction = "right":指【贪吃蛇】出生时的初始方向

self.body = [[100, 100], [80, 100]]:初始的小方格坐标(以左上角为原点)

self.head = list(self.body[0]) # 蛇头位置,蛇头的坐标

函数【draw_me】,利用*pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))*,这个在第三节课中有讲过:点我复习第三节课

函数【move_head】,移动函数,左右移动和X轴有关系,所以代码里取头的*head[0],上下移动和Y轴有关系,所以代码里取头的head[1]*

函数【add_body】:增加身体的小方格,这个是吃到食物调用的函数

函数【cut_tail】:这个是删除尾巴的小方格

函数【move_snake】,这个函数中调用了【add_bodycut_tail】,头加一个,尾巴减一个,头加一个,尾巴减一个,头加一个,尾巴减一个…,这就是移动

3、接下来我们创建一个 【贪吃蛇】类

# 食物类的设计
class Food():
    def __init__(self):
        self.color=white
        #知识进阶-双倍奖励
        #self.color=random.choice([white,pink])
        x = random.randrange(0, 640,20)
        y = random.randrange(0, 480,20)
        self.postion = [x,y]
    def draw_me(self):
        pygame.draw.rect(sc, self.color, (self.postion[0], self.postion[1], 20, 20))
    def reset(self):
        x = random.randrange(0, 640,20)
        y = random.randrange(0, 480,20)
        self.postion = [x,y]
        #知识进阶-双倍奖励
        #self.color=random.choice([white,pink])

代码注释

self.color=white,食物初始颜色是白色

x = random.randrange(0, 640,20)y = random.randrange(0, 480,20),这是指食物不可超过游戏的界面大小,X轴在0到640步长为20,Y轴上为0到480步长为20,都是随机的

知识进阶-双倍奖励 self.color=random.choice([white,pink]),颜色可随机挑选

4、收尾

food = Food()
snake = Snake()
while True:
    len_text = font.render("Length:  "+str(len(snake.body)),True,red)
    # 从队列中获取事件
    for event in pygame.event.get():
        # 判断是否为退出事件
        if event.type == pygame.QUIT:
            pygame.quit()
        # 按键事件
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                if  snake.direction != "left":
                    snake.direction = "right"
            if event.key == pygame.K_LEFT:
                if snake.direction != "right":
                    snake.direction = "left"
            if event.key == pygame.K_UP:
                if  snake.direction != "down":
                    snake.direction = "up"
            if event.key == pygame.K_DOWN:
                if snake.direction != "up":
                    snake.direction = "down"
    # 判断是否吃到食物
    if snake.head == food.postion:
        food.reset()
        snake.add_body()
        '''
        #知识进阶-双倍奖励
        if food.color==white:
            food.reset()
            snake.add_body()
        else:
            food.reset()
            snake.add_body()
            snake.add_body()
        '''
    # 判断是否碰到边缘
    if snake.head[0] > 620 or snake.head[0] < 0:
        break
    if snake.head[1] > 460 or snake.head[1] < 0:
        break
    # 移动头部和身体
    snake.move_head()
    snake.move_snake()
    # 绘制游戏界面
    sc.fill(violet)
    snake.draw_me()
    food.draw_me()
    sc.blit(len_text ,(50,20))
    pygame.display.update()

    # 控制游戏速度
    time_clock.tick(3)
# 动手实践-GAME OVER
len_text = font.render("GAME OVER",True,red)
sc.blit(len_text ,(200,200))
pygame.display.update()
input()

代码注释

# 判断是否碰到边缘,这是判断小蛇是否移动出窗口的外面,否则就停止游戏

if snake.head[0] > 620 or snake.head[0] < 0:
    break
if snake.head[1] > 460 or snake.head[1] < 0:
    break

sc.fill(violet):游戏背景颜色,可以自己更换

time_clock.tick(3): 控制游戏速度 控制游戏速度,越大越快

5、完整版代码:

import pygame, random,os
os.environ["SDL_VIDEO_WINDOW_POS"]="100,100"
# 初始化
pygame.init()
# 定义一个变量来控制速度
time_clock = pygame.time.Clock()

# 创建窗口,定义标题
sc = pygame.display.set_mode((640, 480))
pygame.display.set_caption("贪吃蛇")
# 实例化字体对象
font = pygame.font.SysFont("宋体", 48 , True)
# 定义颜色
pink = (255, 182, 193)
violet = (238,130,238)
white = (255, 255, 255)
green = (0,255,0)
red = (255,0,0)
class Snake():
    def __init__(self):
        self.direction = "right"
        # 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体
        self.body = [[100, 100], [80, 100]]
        self.head = list(self.body[0])  # 蛇头位置
    def draw_me(self):
        # 绘制身体
        for b in self.body:
            pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))

    def move_head(self):
        # 根据方向移动蛇头
        if self.direction == "right":
            self.head[0] += 20
        elif self.direction == "left":
            self.head[0] -= 20
        elif self.direction == "up":
            self.head[1] -= 20
        elif self.direction == "down":
            self.head[1] += 20

    def add_body(self):
        self.body.insert(0, list(self.head))
    def cut_tail(self):
        self.body.pop()
    def move_snake(self):
        self.add_body()
        self.cut_tail()
 
# 食物类的设计
class Food():
    def __init__(self):
        self.color=white
        #知识进阶-双倍奖励
        #self.color=random.choice([white,pink])
        x = random.randrange(0, 640,20)
        y = random.randrange(0, 480,20)
        self.postion = [x,y]
    def draw_me(self):
        pygame.draw.rect(sc, self.color, (self.postion[0], self.postion[1], 20, 20))
    def reset(self):
        x = random.randrange(0, 640,20)
        y = random.randrange(0, 480,20)
        self.postion = [x,y]
        #知识进阶-双倍奖励
        #self.color=random.choice([white,pink])
 
food = Food()
snake = Snake()
while True:
    len_text = font.render("Length:  "+str(len(snake.body)),True,red)
    # 从队列中获取事件
    for event in pygame.event.get():
        # 判断是否为退出事件
        if event.type == pygame.QUIT:
            pygame.quit()
        # 按键事件
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                if  snake.direction != "left":
                    snake.direction = "right"
            if event.key == pygame.K_LEFT:
                if snake.direction != "right":
                    snake.direction = "left"
            if event.key == pygame.K_UP:
                if  snake.direction != "down":
                    snake.direction = "up"
            if event.key == pygame.K_DOWN:
                if snake.direction != "up":
                    snake.direction = "down"
    # 判断是否吃到食物
    if snake.head == food.postion:
        food.reset()
        snake.add_body()
        '''
        #知识进阶-双倍奖励
        if food.color==white:
            food.reset()
            snake.add_body()
        else:
            food.reset()
            snake.add_body()
            snake.add_body()
        '''
    # 判断是否碰到边缘
    if snake.head[0] > 620 or snake.head[0] < 0:
        break
    if snake.head[1] > 460 or snake.head[1] < 0:
        break
    # 移动头部和身体
    snake.move_head()
    snake.move_snake()
    # 绘制游戏界面
    sc.fill(violet)
    snake.draw_me()
    food.draw_me()
    sc.blit(len_text ,(50,20))
    pygame.display.update()

    # 控制游戏速度
    time_clock.tick(3)
# 动手实践-GAME OVER
len_text = font.render("GAME OVER",True,red)
sc.blit(len_text ,(200,200))
pygame.display.update()
input()

希望对大家有帮助

致力于办公自动化的小小程序员一枚#

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常用激活函数及其优缺点的总结与比较

文章目录 1、sigmoid2、Tanh3、ReLU4、Leaky ReLU5、Softmax 1、sigmoid 优点&#xff1a;将很大范围内的输入特征值压缩到0~1之间&#xff0c;适用于将预测概率作为输出的模型&#xff1b; 缺点&#xff1a; 1&#xff09;当输入非常大或非常小的时候&#xff0c;容易导致梯度…

Hadoop的DataNode无法启动的解决方案

Hadoop重启一次&#xff0c;里面的数据需要重新导入&#xff0c;发现无法导入数据&#xff0c;查看jps发现是DataNode没有启动&#xff0c;重新启动发现也无法启动&#xff0c;原因是前面重新启动NameNode&#xff0c;里面的文件格式化一次&#xff0c;DataNode的文件不一致&am…

jmeter监听器大家都会用,但我这个妙招能让你提早一小时下班!

使用过 jmeter 的同学&#xff0c;应该都会使用监听器&#xff0c;在每个监听器中&#xff0c;都会有一个“所有数据写入一个文件”的功能&#xff0c;那这个功能应该怎么用呢&#xff1f;今天&#xff0c;我们就来讲讲这个功能的使用。 几乎所有的监听器都有这样一个功能。 那…

LTD239次升级 | 可答题获取优惠券 • 官微中心菜单可折叠• 分享页表单客户可显示分享来源

1、新增答题获取优惠券应用 2、官微中心支持左侧菜单折叠、批量上传可设置排序值 3、分享页表单客户可显示分享来源 4、iOS App支持设置名片卡片图片 5、新增一款产品列表展示模块 01 网站应用 新增答题获取优惠券应用 本次升级中&#xff0c;新增了一款答题获取优惠券的小程序…

MAC钓鱼并Root权限上线CS并权限维持,以及所有的坑如何解决

本文转载于&#xff1a;https://www.freebuf.com/articles/web/350592.html 作者&#xff1a;文鸯涂鸦智能安全实验室 制作MAC 一、下载工具 首先从github上下载CrossC2。链接&#xff1a;https://github.com/gloxec/CrossC2/releases/tag/v3.1.0。 根据你CS客户端的操作系统选…

基于 BEM 规范实现简单的 全局 scss

前言 BEM 是 css 常用的命名规范BEM &#xff1a;block(块)、 element(元素)、 modify(修饰符)以 namespace-block__element、namespace-block---modify 格式为例&#xff08;namespace 一般是 ui 库的前缀&#xff0c;如 element-ui 的 el 前缀&#xff09;scss 的使用请参考…

计算机竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

驱动 day4

通过字符设备驱动分步注册方式编写LED灯的驱动&#xff0c;应用程序使用ioctl函数编写硬件控制 mycdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #inc…

【中文竞技场】大模型深度体验与测评

简介&#xff1a;本次&#xff0c;我深入体验了中文竞技场中的大语言模型&#xff0c;尝试了写作创作、代码编写和中文游戏三个领域&#xff0c;以下是我详细的评测报告。 一、开篇 在科技日新月异的今天&#xff0c;中文竞技场提供了一系列大模型供我们体验。涉及的领域包括写…

HLS实现FIR低通滤波器+System Generator仿真

硬件&#xff1a;ZYNQ7010 软件&#xff1a;MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4 1、MATLAB设计低通滤波器 FPGA系统时钟 50MHz&#xff0c;也是采样频率。用 MATLAB 生成 1MHz 和 10MHz 的正弦波叠加的信号&#xff0c;并量化为 14bit 整数。把…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面日期格式化 后端收藏ControllerServicemapper 评论ControllerServiceMapper 商品Controller 阅读Service 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除 【商品详情】 【评论】 界面实现 工具js 该工…

即拼七人拼团模式怎么玩?如何留存消费者?

如今&#xff0c;流量稀缺&#xff0c;任何流量都需要付出一定的成本&#xff0c;商家做私域亦是如此。我们能做的就是降低预算&#xff0c;探索属于自己的方法。如何进行私域引流&#xff1f; 现阶段&#xff0c;新消费品牌提升品牌力的关键就在于构建品牌与消费者之间的信任关…

大家gobigger连接后不能调亮度(亮度不能保存)解决办法

关于gobigger连接后不能调亮度&#xff0c;会不会感觉是gobigger很爽的一点&#xff1f;其实不是&#xff0c;可以通过以下方法解决。如果解决你的问题给记得点赞&#xff0c;感谢支持。 现象&#xff1a; 数据线连接后&#xff0c;用滚轮调节亮度到最高点&#xff0c;当时是很…

JavaWeb+JSP+SQL server学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

需求分析 本系统主要是针对各个高校的学生学籍进行管理&#xff0c;系统满足以下几点要求&#xff1a; 系统安全性。由于此系统中的操作都是由用户操作的&#xff0c;所以对于用户的权限设置比较严格。对于数据库&#xff0c;设置了不同用户的权限&#xff0c;不同权限进入不…

前端下载文件的几种方式使用Blob下载文件

前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求&#xff0c;一般后端会提供下载的方式有两种&#xff1a; 1.直接返回文件的网络地址&#xff08;一般用在静态文件上&#xff0c;比如图片以及各种音视频资源等&#xff09; 2.返回文件流&#xff08;…

UE5.2 LyraDemo源码阅读笔记(五)输入系统

Lyra里使用了增强输入系统&#xff0c;首先知道增强输入系统里的三个类型配置。 一、Input Actions (IA)&#xff1a; 输入操作带来的变量&#xff0c;与玩家的输入组件绑定&#xff0c;回调里驱动玩家行为。 二、InputMappingContext&#xff08;IMC&#xff09;&#xff1a…

批量删除文件名中特定文字的方法

怎么批量删除文件名中特定文字&#xff1f;作为一个上班族&#xff0c;在电脑上进行批量文件名称的修改是一个非常常见的事情。如果你有大量的图片、视频、音乐和其他文件&#xff0c;希望批量删除文件名中的特定文字&#xff0c;那么不妨看看下面的介绍&#xff0c;并尝试使用…

制定设备维护管理计划时需要考虑的不同维护策略

在现代企业运营中&#xff0c;保障关键资产的稳定运行对于实现高效生产和客户满意度至关重要。然而&#xff0c;如何制定适合企业的设备维护管理计划却是一个需要深入思考和策划的重要问题。不同类型的维护策略可以满足不同的运营需求和预算限制。在本文中&#xff0c;我们将探…

142亿亿次/秒?长安汽车与百度达成战略合作,推动智能低碳出行

8月17日&#xff0c;重庆长安汽车股份有限公司与百度正式达成战略合作协议&#xff0c;双方将在多个领域展开深度合作&#xff0c;包括云计算、人工智能、大数据和物联网。这一合作旨在推动长安汽车向智能低碳的出行科技公司转型。 据悉&#xff0c;双方还共同建立了长安汽车智…