使用Python+pygame实现贪吃蛇小游戏

news2025/1/11 17:10:17

使用Python+pygame贪吃蛇小游戏

使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520

给出两种实现。

第一种

运行效果如下:

游戏源码如下:

import pygame
import sys
import random

# 初始化pygame
pygame.init()

# 设置屏幕大小
screen_size = (640, 480)
screen = pygame.display.set_mode(screen_size)

# 设置游戏标题
pygame.display.set_caption("贪吃蛇:按p键暂停/继续")

# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# 蛇的初始位置
snake_pos = [[100, 100], [80, 100], [60, 100]]

# 食物的初始位置
food_pos = [300, 300]

# 蛇的初始速度
snake_speed = [20, 0]

# 初始化分数
score = 0

# 创建字体对象
font = pygame.font.Font(None, 36)

# 游戏暂停标志
paused = False

# 主循环
while True:
    # 处理游戏事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:  # 按 P 键暂停或继续
                paused = not paused
            if not paused:
                if event.key == pygame.K_UP and snake_speed != [0, 20]:
                    snake_speed = [0, -20]
                elif event.key == pygame.K_DOWN and snake_speed != [0, -20]:
                    snake_speed = [0, 20]
                elif event.key == pygame.K_LEFT and snake_speed != [20, 0]:
                    snake_speed = [-20, 0]
                elif event.key == pygame.K_RIGHT and snake_speed != [-20, 0]:
                    snake_speed = [20, 0]

    if not paused:
        # 更新蛇的位置
        snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

        # 检查蛇头是否碰到墙壁,如果是则“经过墙壁”
        if snake_pos[0][0] < 0:
            snake_pos[0][0] = screen_size[0]-20
        elif snake_pos[0][0] >= screen_size[0]:
            snake_pos[0][0] = 0
        elif snake_pos[0][1] < 0:
            snake_pos[0][1] = screen_size[1]-20
        elif snake_pos[0][1] >= screen_size[1]:
            snake_pos[0][1] = 0

        # 检查蛇头是否碰到食物
        if snake_pos[0] == food_pos:
            food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]
            score += 1  # 计分
        else:
            snake_pos.pop()

    # 绘制游戏界面
    screen.fill(WHITE)

    for pos in snake_pos:
        pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

    pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))

    # 显示得分
    score_text = font.render("Score: " + str(score), True, (0, 0, 0))
    screen.blit(score_text, (10, 10))

    # 如果游戏暂停,则显示暂停提示
    if paused:
        pause_text = font.render("Paused. Press P to continue.", True, (0, 0, 0))
        screen.blit(pause_text, (screen_size[0] // 2 - pause_text.get_width() // 2, screen_size[1] // 2 - pause_text.get_height() // 2))

    pygame.display.flip()  # 更新屏幕显示

    # 控制游戏速度
    pygame.time.Clock().tick(6)

第二种

就不给出运行效果图了,你可以运行看看。

下面给出另一种实现源码:

import pygame
import time
import random

# 设置蛇的速度
snake_speed = 15

# 窗口颜色
white = pygame.Color(255, 255, 255)

# 蛇的颜色
green = pygame.Color(0, 255, 0)

# 食物的颜色
red = pygame.Color(255, 0, 0)

# 初始化pygame
pygame.init()

# 初始化游戏窗口
window = pygame.display.set_mode((720, 480))

# FPS(帧率)控制器
fps = pygame.time.Clock()

# 定义蛇的默认位置
snake_position = [100, 50]

# 定义蛇身体的前四个块
snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]

# 食物位置
food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]

# 蛇吃到食物时
food_spawn = True

# 设置默认的蛇的方向为向右
direction = 'RIGHT'

# 初始分数
score = 0

def game_over():
    # 设置字体以显示分数
    #font = pygame.font.SysFont(None, 26)                
    font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 26) #显示中文文字
    score_text = font.render('得分: ' + str(score), True, green)
    window.blit(score_text, [320, 240])

    # 显示信息
    again_text = font.render('游戏结束!按任意键重新开始', True, red)  # 修改颜色变量为white
    window.blit(again_text, [160, 280])

    pygame.display.flip()  # 使用 flip() 来更新整个屏幕

    # 等待用户按键然后重新开始游戏
    waiting_for_input = True
    while waiting_for_input:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                waiting_for_input = False
            elif event.type == pygame.QUIT:
                pygame.quit()
                quit()
    # 游戏重新开始
    main()

# 游戏的主逻辑
def main():
    global direction, food_position, food_spawn, score
    # 重置游戏
    score = 0
    snake_position = [100, 50]
    snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]
    direction = 'RIGHT'
    food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]
    food_spawn = True
    while True:
        # 处理按键事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and direction != 'DOWN':
                    direction = 'UP'
                if event.key == pygame.K_DOWN and direction != 'UP':
                    direction = 'DOWN'
                if event.key == pygame.K_LEFT and direction != 'RIGHT':
                    direction = 'LEFT'
                if event.key == pygame.K_RIGHT and direction != 'LEFT':
                    direction = 'RIGHT'

        # 移动蛇
        if direction == 'UP':
            snake_position[1] -= 10
        if direction == 'DOWN':
            snake_position[1] += 10
        if direction == 'LEFT':
            snake_position[0] -= 10
        if direction == 'RIGHT':
            snake_position[0] += 10

        # 蛇身体增长机制
        snake_body.insert(0, list(snake_position))
        if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
            score += 1
            food_spawn = False
        else:
            snake_body.pop()

        if not food_spawn:
            food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]
        food_spawn = True

        # 图形界面
        window.fill(white)

        for pos in snake_body:
            pygame.draw.rect(window, green, pygame.Rect(pos[0], pos[1], 10, 10))

        pygame.draw.rect(window, red, pygame.Rect(food_position[0], food_position[1], 10, 10))

        # 游戏结束条件
        if snake_position[0] < 0 or snake_position[0] > 710 or snake_position[1] < 0 or snake_position[1] > 470:
            game_over()
            break  # 结束游戏后跳出循环
        for block in snake_body[1:]:
            if snake_position[0] == block[0] and snake_position[1] == block[1]:
                game_over()
                break  # 结束游戏后跳出循环

        # 更新显示
        pygame.display.update()

        # 每秒帧数/刷新率
        fps.tick(snake_speed)

# 运行主函数
if __name__ == "__main__":
    main()

OK! 

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

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

相关文章

中国互联网的早期形态

1 大约是从 1991 年开始&#xff0c;国内开始了第一个 BBS 站——北京长城站&#xff0c;经过长时间发展&#xff0c;直到 1995 年&#xff0c;随着计算机及其外设的大幅降价&#xff0c;BBS 才逐渐被部分人们所认识。少数玩 BBS 站的“极客”站长&#xff0c; 基于个人关系&am…

Linux搭建和使用redis

官网地址&#xff1a;http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下&#xff0c;找到Makefile所在目录&#xff0c;执行make命令 make执行之后&#xff0c;会产生src等目录&#xff0c;进入执行make install命令…

23111 网络编程 day2

思维导图 重打代码 #include<myhead.h> #define SER_IP "192.168.122.150" //服务器ip #define SER_PORT 8888 //服务器端口int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("…

【图形学】探秘图形学奥秘:区域填充的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《图形学 | 图像解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1. 初识模式识别 …

Python - 深夜数据结构与算法之 位运算

目录 一.引言 二.位运算简介 1.二进制与十进制 2.左/右移 3.位运算 4.异或 XOR 5.指定位置的位运算 6.实战要点 三.经典算法实战 1.Number-1-of-bits [191] 2.Power-Of-Two [231] 3.Reverse-2-Bits [190] 4.N-Queens [51] 四.总结 一.引言 通常情况下我们计数采…

Java SE入门及基础(14)

二重循环 1. 什么是二重循环 二重循环就是一个循环结构中又包含另外一个循环结构 while ( 外层循环条件 ){ //外层循环操作 while ( 内层循环条件 ){ //内层循环操作 } //外层循环操作 } while ( 外层循环条件 ){ //外层循环操作 for ( 循环变量初始化 ; 内层循环条…

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (二)

论文阅读笔记AI篇 —— Transformer模型理论实战&#xff08;二&#xff09; 第二遍阅读&#xff08;通读&#xff09;2.1 Background2.2 Model Architecture2.2.1 Encoder and Decoder Stacks2.2.2 Scaled Dot-Product Attention2.2.3 Multi-Head Attention 2.3 Why Self-Atte…

python 元组的详细用法

当前版本&#xff1a; Python 3.8.4 文章目录如下 1. 介绍元组 2. 定义元组 3. 访问元组 4. 查询元组 1. 介绍元组 元组&#xff08;Tuple&#xff09;是一个有序的、不可变的数据序列。它可以包含各种类型的数据&#xff0c;例如数字、字符串、列表等。元组使用圆括号()来…

机器人制作开源方案 | 红外热成像巡检小车

作者&#xff1a;马跃宁、赵婷婷、牟金晶、邢艳慧、隋鹏飞 单位&#xff1a;哈尔滨剑桥学院 指导老师&#xff1a;韩轶男、齐丹丹 1. 项目简介 1.1 项目背景 21世纪以来&#xff0c;随着我国先进水平不断提高&#xff0c;家家户户用电也是我们必不可少的一部分&#xff0c;…

Tuxera2024版本正式上线!(免费mac读写磁盘工具)

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 是一款易于使用的软件&#xff0c;可以在 Mac 上打开、编辑、复制、移动或删…

centos7 arm服务器编译安装python 3.8

前言 CentOS (Community Enterprise Operating System) 是一种基于 Red Hat Enterprise Linux (RHEL) 进行源代码再编译并免费提供给用户的 Linux 操作系统。 CentOS 7 采用了最新的技术和软件包&#xff0c;并提供了强大的功能和稳定性。它适用于各种服务器和工作站应用场景&a…

golang文件相对路径问题

目录结构 2.具体代码&#xff1a; const dataFile "../data/data.json"_, fileName, _, _ : runtime.Caller(1)dataPath : path.Join(path.Dir(fileName), dataFile)fmt.Println(dataPath)// open filefile, err : os.Open(dataPath)if err ! nil {log.Fatalln(err…

【GitHub】如何删除GitHub仓库里的文件夹(区分 rm/git rm)

删除GitHub仓库里的一个文件夹 1、复制仓库地址2、在本地新建一个空文件夹3、在空文件夹内&#xff0c;右键选择Git Bash Here4、弹出GIT Bash框5、克隆远程仓库6、拉取远程仓库7、查看仓库里的文件8、选择想要删除的文件夹进行删除9、提交删除说明10、更新GitHub远程仓库 在gi…

高校教务系统登录页面JS分析——河北地质大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

【小笔记】时序数据分类算法最新小结

2024.1.15 最近基于时序数据训练分类算法&#xff0c;对其进行了一番了解&#xff0c;主要围绕以下几点&#xff1a; 时序数据算法有哪些细分类&#xff1f;时序数据分类算法经典模型&#xff1f;当下时序分类算法模型强baseline&#xff1f;有没有现成的工具&#xff1f; 1…

unity面试题

一&#xff1a;什么是协同程序&#xff1f; 在主线程运行的同时开启另一段逻辑处理&#xff0c;来协助当前程序的执行&#xff0c;协程很像多线程&#xff0c;但是不是多线程&#xff0c;Unity的协程实在每帧结束之后去检测yield的条件是否满足。 二&#xff1a;Unity3d中的碰…

快速更改flutter已有项目的项目名称和id等

如果你使用了别人已有的仓库模板或者想更改现有项目的名称&#xff0c;是一件非常繁琐的工作&#xff0c;需要修改全平台的文件还是相当麻烦的&#xff0c;所以这里推荐一个小工具&#xff0c;可以帮助大家快速实现更改项目名称的目的&#xff0c;这个工具地址&#xff1a;rena…

2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计和迭代匹配的未知语言文本片段提取模型 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但每段文本只是由字母…

SpringBoot从数据库读取数据数据源配置信息,动态切换数据源

准备多个数据库 首先准备多个数据库&#xff0c;主库smiling-datasource&#xff0c;其它库test1、test2、test3 接下来&#xff0c;我们在主库smiling-datasource中&#xff0c;创建表databasesource&#xff0c;用于存储多数据源相关信息。表结构设计如下 创建好表之后&#…