用Python和Pygame实现简单贪吃蛇游戏

1.pip安装pygame

  • pygam插件安装

pip install 插件名字    # 安装
pip uninstall 插件名字    # 卸载
pip install 插件名字 -i 指定下载的镜像网址
pip show 插件名字        # 查看插件名字

pip  install  pygame  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip  show  pygame

 2.pygame入门

       详细看教程

  • 官方示例项目:https://www.pygame.org/tags/all

  • 官方开发文档:Pygame Front Page — pygame v2.6.0 documentation

3.代码

"""
# 0, 90, 180, 270
#下, 右 , 上 , 左
Snake类:
    __init__(): # 指定默认方向向右
    move(): # 让蛇根据当前方法进行移动(移动一格)
        # 当前蛇头前进的方向复制一份
        # 获取移动坐标,移动坐标更新
        # 把新的头放在最前面通过insert()
        # 把蛇尾移除掉
    draw(): # 根据移动方向,旋转舌头图片角度

Game类:
    # 合适位置移动,适当延时
"""
import random
import sys
import time

import pygame

# 全局变量
SCREEN_WIDTH = 640  # 屏幕宽度
SCREEN_HEIGHT = 480  # 屏幕高度

BLOCK_SIZE = 20  # 方格的宽、高长度

COLOR_GRAY = (150, 150, 150)  # 灰色
COLOR_GREEN = (0, 150, 0)  # 绿色
COLOR_WHITE = (255, 255, 255)  # 白色
COLOR_RED = (255, 0, 0)  # 红色

DIRECTION_MOVE = {
    pygame.K_DOWN: (0, 1),  # down
    pygame.K_RIGHT: (1, 0),  #right
    pygame.K_UP: (0, -1),  # up
    pygame.K_LEFT: (-1, 0)  # left
}
DIRECTION_HEAD_ANGLE = {
    pygame.K_DOWN: 0,
    pygame.K_RIGHT: 90,
    pygame.K_UP: 180,
    pygame.K_LEFT: 270
}


# 蛇类
class Snake:
    def __init__(self):
        # 设置初始方向为下
        self.direction = pygame.K_DOWN
        # 定义蛇身
        self.snake_body = [
            # x y 宽高
            pygame.Rect(3 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE),
            pygame.Rect(2 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE),
            pygame.Rect(1 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)
        ]
        # 加载头图片
        head_img = pygame.image.load("res/head-red.png")
        # head_img = pygame.transform.rotate(head_img, 90)
        # 设置 头img的图片 和大小
        self.head_img = pygame.transform.scale(head_img, (BLOCK_SIZE, BLOCK_SIZE))

    # 回之蛇
    def draw(self, screen):
        for node in self.snake_body[1:]:
            # 绘制矩形  pygame.draw.rect(画布,颜色,node:位置和大小 边框)
            pygame.draw.rect(screen, COLOR_WHITE, node, border_radius=3)
        # 设置头 旋转
        head_img = pygame.transform.rotate(self.head_img, DIRECTION_HEAD_ANGLE[self.direction])
        # 设置头
        snake_head = self.snake_body[0]
        screen.blit(head_img, (snake_head.x, snake_head.y))

    def move(self):
        # 复制头
        new_node = self.snake_body[0].copy()
        # 确定移动方向
        pos = DIRECTION_MOVE[self.direction]
        # 更新坐标
        new_node.x += (pos[0] * BLOCK_SIZE)
        new_node.y += (pos[1] * BLOCK_SIZE)
        # 变换头部节点
        self.snake_body.insert(0, new_node)
        self.snake_body.pop()

    def check_collision(self):
        # 检查蛇头是否碰到墙壁
        # 判断蛇头是否 超出边界
        if self.snake_body[0].x < 0 or self.snake_body[0].x >= SCREEN_WIDTH or \
                self.snake_body[0].y < 0 or self.snake_body[0].y >= SCREEN_HEIGHT:
            print("死亡")
            print(f"分数为{len(self.snake_body)-3}")
            return True
        # 检查蛇头是否碰到自己的身体
        for node in self.snake_body[1:]:
            if self.snake_body[0].colliderect(node):
                print("死亡")
                print(f"分数为{len(self.snake_body)-3}")
                return True
        return False

    def is_direction_enable(self, event_key):
        # 按键方向是否合法
        # 按键不是上下左右按键,返回False
        if event_key not in DIRECTION_MOVE:
            return False
        # 如果方向为左右,同时,蛇能左右掉头,返回False
        LR = (pygame.K_RIGHT, pygame.K_LEFT)
        if event_key in LR and self.direction in LR:
            return False
        # 如果方向为上下,同时,蛇能上下掉头,返回False
        UD = (pygame.K_DOWN, pygame.K_UP)
        if event_key in UD and self.direction in UD:
            return False
        return True
        # 上面条件都进不去,返回True

    def update_direction(self, event_key):
        self.direction = event_key
        # 更新移动的方向

    def grow(self):
        node = self.snake_body[-1].copy()
        self.snake_body.append(node)


class Food():
    def __init__(self):
        # 食物的随机x, y坐标,不要超出范围
        x = random.randint(0, SCREEN_WIDTH // BLOCK_SIZE - 1)
        y = random.randint(0, SCREEN_HEIGHT // BLOCK_SIZE - 1)
        self.f_rect = pygame.Rect((x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))

    def draw(self, screen):
        pygame.draw.rect(screen, COLOR_RED, self.f_rect, border_radius=3)


class Game():
    def __init__(self, title):
        self.title = title
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pygame.display.set_caption(self.title)

        self.img = pygame.image.load("res/snake_logo.png")
        pygame.display.set_icon(self.img)
        bg_image = pygame.image.load("res/bg.png")
        self.bg_img = pygame.transform.scale(bg_image, (SCREEN_WIDTH, SCREEN_HEIGHT))

    def start(self):
        s = Snake()
        f = Food()
        while True:
            events = pygame.event.get()
            for event in events:
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:

                    # s.direction = event.key
                    if s.is_direction_enable(event.key):
                        s.update_direction(event.key)

            self.screen.blit(self.bg_img, (0, 0))

            # ---------------绘制网格
            # 绘制所有横线 y = 640 // 20 = 24  [0, 20, 40, 60, ... 640)
            for y in range(0, SCREEN_HEIGHT, BLOCK_SIZE):
                pygame.draw.line(self.screen, COLOR_GRAY, (0, y), (SCREEN_WIDTH, y))
            # 绘制所有竖线 x = 480 // 20 = 24  [0, 20, 40, 60, ... 480)
            for x in range(0, SCREEN_WIDTH, BLOCK_SIZE):
                pygame.draw.line(self.screen, COLOR_GRAY, (x, 0), (x, SCREEN_HEIGHT))
            # 画蛇
            s.draw(self.screen)
            # 画食物
            f.draw(self.screen)

            pygame.display.update()
            if s.check_collision():
                pygame.quit()
                sys.exit()
            # 蛇移动
            s.move()
            # 判断是否吃到食物
            if s.snake_body[0] == f.f_rect:
                f = Food()
                # 身体加长
                s.grow()
            #             游戏节奏
            time.sleep(0.1)


game = Game("林安生贪吃蛇")
game.start()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器&#xff08;echo server&#xff09; 网络编程 一、什么是网络编程 通过网络&#xff0c;让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…

MacOS 下gif 文件的几种压缩方法

categories: Tips tags: Tips GIF 写在前面 最近想转换几个 tg 的 tgs 文件到 gif, 然后上传到微信, 所以又涉及到了 gif 的操作了. 工具介绍 安装 brew install imagemagick gifsicleimagemagick 是专业的图像处理工具, gifsicle 是专门处理 gif 的小工具 ,都是开源的. …

C++之AVL树的使用以及原理详解

1.AVL树 1.1AVL树的概念 1.2AVL树的定义 1.3AVL树的插入 1.4AVL树的旋转 1. 右单旋 2. 左单旋 3. 左右双旋 4. 右左双旋 1.5AVL树的验证 1.6AVL的实现 在之前对map/multimap/set/multiset进行了简单的介绍&#xff08;C之map_set的使用-CSDN博客&#xff09;&#xff0c;…

说说2024年暑期三下乡社会实践工作新闻投稿经验

作为一名在校大学生,我有幸自去年起参与学院组织的暑期大学生三下乡社会实践团活动。这项活动不仅是我们深入基层、服务社会的重要平台,也是展现当代大学生风采、传递青春正能量的有效途径。然而,如何将这些生动鲜活的实践故事、感人至深的瞬间传播出去,让更多人了解并受到启发…

火绒安全的应用介绍

火绒安全软件是一款集成了杀毒、防御和管控功能的安全软件&#xff0c;旨在为用户提供全面的计算机安全保障。以下是火绒安全软件的一些详细介绍&#xff1a; 系统兼容性强&#xff1a;该软件支持多种操作系统&#xff0c;包括Windows 11、Windows 10、Windows 8、Windows 7、…

xgp加速器免费 微软商店xgp用什么加速器

2001年11月14日深夜&#xff0c;比尔盖茨亲自来到时代广场&#xff0c;在午夜时分将第一台Xbox交给了来自新泽西的20岁年轻人爱德华格拉克曼&#xff0c;后者在回忆中说&#xff1a;“比尔盖茨就是上帝。”性能超越顶级PC的Xbox让他们趋之若鹜。2000年3月10日&#xff0c;微软宣…

25-代码随想录第454题.四数相加II

25-代码随想录第454题.四数相加II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整数的范…

python 笔记ast.literal_eval

1 介绍 ast.literal_eval 是 Python 标准库 ast 模块中的一个函数&#xff0c;用于安全地评估表示 Python 字面量或容器&#xff08;如列表、字典、元组、集合&#xff09;的字符串 import ast # 解析并执行一个数字表达式 num ast.literal_eval("3.14") prin…

OpenFeign微服务调用组件!!!

1.Feign是什么 GitHub - OpenFeign/feign: Feign makes writing java http clients easierFeign makes writing java http clients easier. Contribute to OpenFeign/feign development by creating an account on GitHub.https://github.com/OpenFeign/feignFeign是Netflix开…

项目十一:爬取热搜榜(小白实战级)

首先&#xff0c;恭喜各位也恭喜自已学习爬虫基础到达圆满级&#xff0c;今后的自已python爬虫之旅会随着网络发展而不断进步。回想起来&#xff0c;我学过请求库requests模块、解析库re模块、lmxl模块到数据保存的基本应用方法&#xff0c;这一次的学习python爬虫之旅收获很多…

Vu3+QuaggaJs实现web页面识别条形码

一、什么是QuaggaJs QuaggaJS是一个基于JavaScript的开源图像识别库&#xff0c;可用于识别条形码。 QuaggaJs的作用主要体现在以下几个方面&#xff1a; 实时图像处理与识别&#xff1a;QuaggaJs是一款基于JavaScript的开源库&#xff0c;它允许在Web浏览器中实现实时的图像…

ASP.NET Core 3 高级编程(第8版) 学习笔记 03

本篇介绍原书的第 18 章&#xff0c;为 19 章 Restful Service 编写基础代码。本章实现了如下内容&#xff1a; 1&#xff09;使用 Entity Framework Core 操作 Sql Server 数据库 2&#xff09;Entity Framework Core 数据库迁移和使用种子数据的方法 3&#xff09;使用中间件…

Qt Quick centerIn和fill 的用法

1&#xff09;Qt Quick centerIn和fill 的用法&#xff1a; import QtQuick 2.5 Rectangle { width:300; height:200; Rectangle { color: "blue"; anchors.fill: parent; border.width: 6; border.co…

详解工业网关在线探测功能及用途

工业网关专为工业物联网应用设计&#xff0c;可实现包括不同通讯协议之间的兼容和转换&#xff0c;提供软硬件加密保障工业数据安全传输&#xff0c;发挥强大算力实现数据边缘预处理&#xff0c;联动联调工业网络设备实现高效协同等。在线探测功能是佰马工业网关的一项重要功能…

unity学习(89)——unity塞满c盘!--删除editor下的log文件

卸了一个视频后强制续命打开详细信息&#xff1a; 这个再往下找也是没用的&#xff01; 显示隐藏文件夹后&#xff01;执行如下操作&#xff01; 30个g&#xff01; 其中unity占23g editer占了21g 删除C:\Users\王栋林\AppData\Local\Unity\Editor下的log文件 恢复到之前的水…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…

美区视频带货“一哥”,一周销量狂干三十万美金!

“超店有数显示&#xff0c;Tybuggy上周带货狂揽34.3万美金&#xff0c;超出第二名近30倍。” TikTok风波再起&#xff0c;4月17日&#xff0c;美众议院推出援乌援以军事议案&#xff0c;值得注意的是&#xff0c;TikTok剥离法案被“打包”夹带其中&#xff0c;以此加大再参议…

LLM应用实战:当KBQA集成LLM(二)

1. 背景 又两周过去了&#xff0c;本qiang~依然奋斗在上周提到的项目KBQA集成LLM&#xff0c;感兴趣的可通过传送门查阅先前的文章《LLM应用实战&#xff1a;当KBQA集成LLM》。 本次又有什么更新呢&#xff1f;主要是针对上次提到的缺点进行优化改进。主要包含如下方面&#…

【Linux笔记】基本指令(一)

一道残阳铺水中 半江瑟瑟半江红 目录 Linux基本指令 罗列目录内容&#xff1a;ls 指令 显示当前目录位置信息&#xff1a;pwd 指令 切换工作目录&#xff1a;cd 指令 创建文件修改时间戳&#xff1a;touch指令 创建空目录&#xff1a;mkdir指令 删除空目录&#xff1a;rmdir指…
最新文章