【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇

实现穿墙效果

# 检测游戏是否结束
def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x == snake_head.x and body[n].y == snake_head.y):finished = True     
# 状态检测
def check_status():# 如果蛇头的位置超出窗口,则修改其对应坐标为另一边if snake_head.x - SIZE < 0 :snake_head.x = WIDTH - SIZEelif snake_head.x + SIZE > WIDTH:snake_head.x = SIZEelif snake_head.y - SIZE < 0:snake_head.y = HEIGHTelif snake_head.y + SIZE > HEIGHT:snake_head.y = SIZE

运行游戏,当蛇头经过墙壁时,会从另一端出现

在这里插入图片描述

游戏胜利判定

failed = False                                      # 游戏胜利标识
def draw():screen.fill((255,255,255))                      snake_head.draw()                              food.draw()                                     for b in body:b.draw()if finished:screen.draw.text("Game Over!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")# 绘制胜利提示图像if failed:screen.draw.text("Failed!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")
# 检测游戏是否结束
def check_gameover():global finishedglobal failed# 如果蛇身长度大于等于10,则游戏胜利if len(body) >= 10:failed = Truefor n in range(len(body) - 1):if(body[n].x == snake_head.x and body[n].y == snake_head.y):finished = True  
def update():# 如果游戏已结束,则不再更新游戏,即暂停游戏 if finished or failed:returncheck_gameover()check_keys()eat_food()update_snake()check_status()

点击间隔

运行游戏时,如果蛇头方向向左移动(←),正常情况下按“→”键是无效的,但如果玩家在很短的时间内按“↑”再按“→”键,就会出现蛇头来不及向上移动,就改变为向右移动的情况,导致蛇头直接与蛇身相撞;

为避免该类问题,我们可以设置最小点击间隔,避免快速点击按键的情况出现

start_time = 0                                      # 初始点击时间
# 不用check_keys函数,改为使用内置的on_key_down函数
def on_key_down(key):global direction# 在间隔时间内,则return不执行键盘事件if not check_click_interval(time.time()):return# ←键被按下,且当前方向不为向右if key == keys.LEFT and direction != "R":direction = "L"snake_head.angle = 180# →键被按下,且当前方向不为向左elif key == keys.RIGHT and direction != "L":direction = "R"snake_head.angle = 0# ↑键被按下,且当前方向不为向下elif key == keys.UP and direction != "D":direction = "U"snake_head.angle = 90# ↓键被按下,且当前方向不为向上elif key == keys.DOWN and direction != "U":direction = "D"snake_head.angle = -90
# 点击间隔判定        
def check_click_interval(click_time,interval_time = 0.2):global start_timeisAccord = False# 如果上一次点击间隔与记录的上次点击时间相差大于间隔限制时间,则修改标识为True,并更新start_timeif click_time - start_time >= interval_time:start_time = click_timeisAccord = Truereturn isAccord
def update():if finished or failed:returncheck_gameover()# 移除check_keys# check_keys()eat_food()update_snake()check_status()

完整代码

import random
import time
SIZE = 15                                           # 每个格子的大小
WIDTH = SIZE * 30                                   # 游戏场景总宽度
HEIGHT = SIZE * 30                                  # 游戏场景总高度
direction = "R"                                     # 蛇头初始移动方向
counter = 0                                         # 循环标识
snake_head = Actor("snake_head",(30, 30))           # 绘制蛇头图标,初始坐标为(30,30)
length = 1                                          # 贪吃蛇当前的初始长度
MAX_LENGTH = 20                                     # 贪吃蛇最长长度(胜利条件)
body = []                                           # 贪吃蛇蛇身各部位位置,不含蛇头
finished = False                                    # 游戏结束标识
failed = False                                      # 游戏胜利标识
start_time = 0                                      # 初始点击时间
INTERVAL_TIME = 0.1                                 # 点击间隔           food = Actor("snake_food")
# 在窗口内生成随机坐标,作为食物出现的位置
food.x = random.randint(2,WIDTH // SIZE - 2) * SIZE
food.y = random.randint(2,HEIGHT // SIZE - 2) * SIZEdef draw():screen.fill((255,255,255))                      # 设置背景色为白色snake_head.draw()                               # 绘制蛇头food.draw()                                     # 绘制食物# 通过循环列表绘制出所有蛇身for b in body:b.draw()# 绘制失败提示图像if finished:screen.draw.text("Game Over!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")# 绘制胜利提示图像if failed:screen.draw.text("Failed!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")# 不用check_keys函数,改为使用内置的on_key_down函数
def on_key_down(key):global direction# 在间隔时间内,直接returnif not check_click_interval(time.time()):return# ←键被按下,且当前方向不为向右if key == keys.LEFT and direction != "R":direction = "L"snake_head.angle = 180# →键被按下,且当前方向不为向左elif key == keys.RIGHT and direction != "L":direction = "R"snake_head.angle = 0# ↑键被按下,且当前方向不为向下elif key == keys.UP and direction != "D":direction = "U"snake_head.angle = 90# ↓键被按下,且当前方向不为向上elif key == keys.DOWN and direction != "U":direction = "D"snake_head.angle = -90# 贪吃蛇移动位置各部位变化逻辑
def update_snake():global countercounter += 1# 每执行10次update函数,才执行一次下方代码,减缓蛇头位置变更速度if counter < 10:returnelse:counter = 0# 如果蛇身数量等于蛇的总长度,则移除列表记录的第一个蛇身,实际是移除蛇尾if len(body) == length:body.remove(body[0])# 在列表后追加当前蛇头的坐标,用于绘制新的蛇身;配合上面删除实现蛇身位置变更效果body.append(Actor("snake_body",(snake_head.x, snake_head.y)))# 蛇头移动逻辑,改变蛇头位置实现移动效果if direction == "L":snake_head.x -= SIZEelif direction == "R":snake_head.x += SIZEelif direction == "U":snake_head.y -= SIZEelif direction == "D":snake_head.y += SIZE# 吃食物
def eat_food():global length# 如果当前食物坐标与蛇头坐标位置重叠if food.x == snake_head.x and food.y == snake_head.y:# 在窗口内随机坐标位置重新生成食物food.x = random.randint(2,WIDTH // SIZE - 2) * SIZEfood.y = random.randint(2,HEIGHT // SIZE - 2) * SIZElength += 1                                 # 每吃一个食物,贪吃蛇长度+1# 检测游戏是否结束
def check_gameover():global finishedglobal failed# 如果蛇身长度大于等于10,则游戏胜利if len(body) >= MAX_LENGTH:failed = True# 遍历蛇身,判断是否存在与蛇头重叠的蛇身,有,则判定失败for n in range(len(body) - 1):if(body[n].x == snake_head.x and body[n].y == snake_head.y):finished = True     def check_status():# 如果蛇头的位置超出窗口,则修改其对应坐标为另一边if snake_head.x - SIZE < 0 :snake_head.x = WIDTH - SIZEelif snake_head.x + SIZE > WIDTH:snake_head.x = SIZEelif snake_head.y - SIZE < 0:snake_head.y = HEIGHT - SIZEelif snake_head.y + SIZE > HEIGHT:snake_head.y = SIZE# 点击间隔判定        
def check_click_interval(click_time):global start_timeisAccord = Falseif click_time - start_time >= INTERVAL_TIME:start_time = click_timeisAccord = Truereturn isAccorddef update():# 如果游戏已结束,则不再更新游戏,即暂停游戏 if finished or failed:returncheck_gameover()eat_food()update_snake()check_status()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4 常见字体系列&#xff08;了解&#xff09;1.5 字体系列拓展-层叠性font复合属性文本…

oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库,可用于头像剪裁等常见场景。

&#x1f4da; 简介 oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库&#xff0c;可用于头像剪裁等常见场景。 代码仓库&#xff1a;oh-crop &#x1f4da; 下载安装 ohpm i xinyansoft/oh-cropOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考: 下载安装三方库…

一个值得关注的3D生成新算法:速度和图像生成平齐,能生成合理的展开贴图和高质量mesh

今天跟大家介绍的GIMDiffusion是一种新的Text-to-3D模型&#xff0c;利用几何图像&#xff08;Geometry Images&#xff09;来高效地表示3D形状&#xff0c;避免了复杂的3D架构。通过结合现有的Text-to-Image模型如Stable Diffusion的2D先验知识&#xff0c;GIMDiffusion能够在…

【数据结构】【链表代码】相交链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//先求出两个链表的长度ListNode…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时&#xff0c;Unity Editor会在项目目录建立一个Temp目录&#xff0c;同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理&#xff1a; Cannot add merged region …

ISO IEC 18004 2015 PDF 文字版下载

ISO_IEC_18004_2015_en-US - 道客巴巴 (doc88.com)https://www.doc88.com/p-67816330893254.html

Kafka和RabbitMQ区别

RabbitMQ的消息延迟是微秒级&#xff0c;Kafka是毫秒级&#xff08;1毫秒1000微秒&#xff09; 延迟消息是指生产者发送消息发送消息后&#xff0c;不能立刻被消费者消费&#xff0c;需要等待指定的时间后才可以被消费。 Kafka的单机呑吐量是十万级&#xff0c;RabbitMQ是万级…

vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI

目录 vSAN容错条带化存储策略1. 创建新策略2. 应用存储策略 vSAN文件服务文件服务快照与备份 vSAN iSCSI目标服务 vSAN容错 FTT&#xff1a;Fault to Tolerance 允许故障数 故障域&#xff1a;每一台vSAN主机是一个故障域 - 假设3台超融合&#xff08;3计算1存储&#xff09;&…

【Kubernetes】常见面试题汇总(五十四)

目录 120.创建 init C 容器后&#xff0c;其状态不正常&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域&#xff0c;Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸&#xff0c;为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程&#xff0c;让开发者能够专注于业务逻辑的实现。无论是构建小型的…

Windows搭建RTMP服务器

这里写自定义目录标题 1 Nginx-RTMP服务器搭建1.1 下载Nginx1.2 下载Nginx的RTMP扩展包1.3 配置Nginx1.4 启动Nginx1.5 查看Nginx状态 2 FFmpeg推流2.1 下载FFmpeg2.2 配置FFmpeg环境变量2.3 验证FFmpeg配置 3 视频推流3.1 OBS推流3.2 FFmpeg推流 4 VLC拉流4.1 VLC4.2 打开网络…

4款专业电脑数据恢复软件,帮你保障数据安全。

电脑里面会出现的数据丢失场景有很多&#xff0c;像硬盘故障、回收站清空、电脑格式化、系统崩溃、病毒入侵等等&#xff1b;如果发现数据丢失后&#xff0c;建议应停止使用电脑&#xff0c;避免新的数据写入覆盖丢失的数据。然后再尝试进行数据找回&#xff0c;如果想自己进行…

合肥企业参访:走进联想合肥智能制造基地参观学习

跟随华研标杆游学高丽华高老师去到联想参观游学 联想合肥智能制造基地成立于2011年&#xff0c;是联想集团全球蕞大的PC研发和制造基地&#xff0c;也是智能制造示范基地。基地占地约500亩&#xff0c;拥有全球PC制造业蕞大的单体厂房以及业界主板、整机生产线。在这里&#xf…

RTSP作为客户端 推流 拉流的过程分析

之前写过一个 rtsp server 作为服务端的简单demo 这次分析下 rtsp作为客户端 推流和拉流时候的过 A.作为客户端拉流 TCP方式 1.Client发送OPTIONS方法 Server回应告诉支持的方法 2.Client发送DESCRIPE方法 这里是从海康摄像机拉流并且设置了用户名密码 Server回复未认证 3.客…

数据结构-3.5.队列的顺序实现

一.队列的顺序实现&#xff0c;初始化操作以及判断队列是否为空&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 ​ typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…

使用Buildpacks构建Docker镜像

## 使用Buildpacks构建Docker镜像 ![](../assets/运维手册-Buildpacks-Buildpacks.io.png) ### Buildpacks简介 与Dockerfile相比&#xff0c;Buildpacks为构建应用程序提供了更高层次的抽象。具体来说&#xff0c;Buildpacks&#xff1a; * 提供一个平衡的控制&#xff0c;…

emp.dll丢失损坏怎么办,总结6个解决emp.dll丢失的方法

我们在用电脑的时候&#xff0c;经常会碰到各种各样的问题&#xff0c;其中一个就是emp.dll丢失或缺失。这个东东可是Windows操作系统中非常重要的一个动态链接库文件哦&#xff0c;它是负责管理一些重要系统功能的。假如这个文件丢了&#xff0c;很可能会导致程序无法正常运行…

小程序图片资源等使用阿里服务链接更新问题

同名更换图片&#xff0c;小程序无需发版本更新&#xff0c;存在图片缓存问题解决方法 修改Cache-Control参数即可

深度解析:Python蓝桥杯青少组精英赛道与高端题型概览

目录 一、蓝桥杯青少组简介二、赛项组别与年龄范围三、比赛内容与题型1. 基础知识范围2. 题型设置2.1 选择题2.2 编程题 3. 考试时长 四、奖项设置与激励措施五、总结 一、蓝桥杯青少组简介 蓝桥杯全国软件和信息技术专业人才大赛&#xff08;简称“蓝桥杯”&#xff09;是由工…