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

使用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! 

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

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

相关文章

排序算法之八:计数排序

1.计数排序思想 计数排序&#xff0c;顾名思义就是计算数据的个数 计数排序又称非比较排序 思想&#xff1a;计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 计数…

freetos day1

作业&#xff1a;使用计数型信号量设计&#xff1a;生产者和消费者模型 总结今天学习的API函数&#xff0c;写出函数参数和返回值的意思&#xff0c;并且说明函数功能 1 2 3

【数据结构】C语言实现共享栈

共享栈的C语言实现 导言一、共享栈1.1 共享栈的初始化1.2 共享栈的判空1.3 共享栈的入栈1.3.1 空指针1.3.2 满栈1.3.3 入栈空间错误1.3.4 正常入栈1.3.5 小结 1.4 共享栈的查找1.5 共享栈的出栈1.6 共享栈的销毁 二、共享栈的实现演示结语 导言 大家好&#xff0c;很高兴又和大…

文件上传进阶绕过(二)4个技巧和靶场实战

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、环境准备 请移步《文件上传靶场实战&#xff1a;upl…

「会议推荐」食品饮料行业数字化、智能化转型升级高质量发展论坛

“2024第十二届国际生物发酵产品与技术装备展览会&#xff08;济南&#xff09;”将于2024年3月5-7日在山东国际会展中心&#xff08;济南市日照路1号&#xff09;举办。同期中国生物发酵产业协会、山东省轻工机械协会、山东省食品工业协会联合举办“2024食品饮料行业数字化、智…

Win10提示找不到mfc71ud.dll文件,程序无法运行,的解决办法,亲测有效

mfc71ud.dll是Windows操作系统中的一个动态链接库文件&#xff0c;由Microsoft公司开发&#xff0c;属于Microsoft Foundation Class (MFC)库的一部分。"ud"后缀表示这是一个Unicode Debug版本&#xff0c;主要用于支持程序开发和测试。 这个文件主要被用于运行各种…

C++--引用

一.引用的定义&#x1f357; 引用是已定义的变量的别名。 例如将data作为value的引用(别名),则可以随意使用data或value来表示该变量。 引用有何作用呢? 其主要作用是作为函数的形参(和函数的返回值)。这样 函数的形参就是实参本身,而不是其副本。这样除指针外,引用也为函数处…

命名空间 “Eigen“ 没有成员 “SelfAdjointEigenSolver“

代码中用到SelfAdjointEigenSolver 结果报错&#xff1a;报错实在windows10条件下发生的。 查找资料&#xff0c;最后还是要定位到官方文档。 计算自伴随矩阵的特征值和特征向量。 这是在特征值模块中定义的。 添加如下引用即可解决&#xff0c;请点赞关注。 #include <…

ssm+vue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项项目。

演示视频&#xff1a; ssmvue的物流配送人员车辆调度管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

一文搞懂系列——Linux C线程池技术

背景 最近在走读诊断项目代码时&#xff0c;发现其用到了线程池技术&#xff0c;感觉耳目一新。以前基本只是听过线程池&#xff0c;但是并没有实际应用。对它有一丝的好奇&#xff0c;于是趁这个机会深入了解一下线程池的实现原理。 线程池的优点 线程池出现的背景&#xf…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

2024年学鸿蒙开发就业前景怎么样?

随着科技的不断进步&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;逐渐引起了人们的关注。 2024年&#xff0c;鸿蒙开发就业前景如何&#xff1f; 对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说&#xff0c;这是一个非常重要的问题。 首先&a…

buuctf-Misc 题目解答分解118-120

118.[INSHack2017]sanity 打开压缩包就是一个md 文件 typora 打开 发现flag INSA{Youre_sane_Good_for_you} 119.粽子的来历 解压压缩包 &#xff0c;得到文件夹如下 用010 editor 打开 我是A.doc 这个有些可以 都改成FF 保存 然后再次打开 docx 文件就发现了屈原的诗 其他b…

PattPatel-“Introduction to Computing Systems“(4)期末样卷题目解析:C语言递归

C语言的递归我觉得最主要的还是要把Patt&Patel的部分好好理解下&#xff08;因为有和硬件结合的部分&#xff09;&#xff0c;但因为今天就考试&#xff08;来不及做这样的事情&#xff09;&#xff0c;先把之前模拟卷的题目给尝试弄明白&#xff0c;然后考完试之后继续学习…

《新课程教学》(电子版)是正规期刊吗?能评职称吗?

《新课程教学》&#xff08;电子版&#xff09;主要出版内容为学科教学理论、学科教学实践经验和成果&#xff0c;主要读者对象为中小学教师&#xff0c;期刊设卷首语、名家讲堂、课程与教学、教学实践、考试评价、教育信息化、教学琐谈、教育管理、教师心语、一线课堂、重温经…

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年&#xff0c;StarRocks 继续全方位大步向前迈进&#xff0c;在 300 贡献者的辛勤建设下&#xff0c;社区先后发布了 50 版本&#xff0c;并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道&#xff0c;推动着 StarRocks 社…

c语言学习总结———编译和链接

再次来做一下学习总结&#xff0c;今天我们总结一下关于编译和链接的学习吧&#xff01; 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&…

Matter - 体验,灯泡(1)

一、前言 Matter&#xff08;当时称为 Project Connected Home over IP 或 Project CHIP&#xff09;于2019年12月11日首次宣布。当时&#xff0c;它是由苹果、谷歌、亚马逊和联发科技等公司共同发起的一个项目&#xff0c;目的是创建一个开放标准&#xff0c;提高智能家居设备…

模拟日光AR汽车HUD的光学特性太阳光模拟器

AR HUD 的光学特性 几何光学可描述物体、透镜和成像之间的关系。将物体放在透镜及其焦点之间将会形成放大且离实际物体有一定距离的虚像[4]。这便是 HUD 生成虚像的方法。源物体&#xff08;在这里是散射屏或 TFT 面板&#xff09;在 HUD 反光镜光学系统的焦距内。这使相应虚像…