贪吃蛇的奥秘:食物诱惑力如何在代码中体现

今天我将向大家介绍如何使用 Python 编写一个贪吃蛇游戏。在这个游戏中,你将控制食物的位置,而蛇会自动追逐食物。这将让你更好地理解 Python 编程以及贪吃蛇游戏的实现过程。

首先,我们需要导入一些必要的库,如 random、collections 和 blessed。然后,我们创建一个 Terminal 对象来控制终端,并定义一些常量,如方向、移动方式、边界、身体、头部和食物等。

接下来,我们定义了蛇的初始位置,并使用双向队列(deque)来存储蛇的身体部分。我们还定义了食物的初始位置,并设置了窗口大小、分数和速度等参数。

在这个游戏中,我们通过控制食物的位置来影响蛇的行动。我们使用列表来存储空位置,以便在需要时放置食物。然后,我们使用 with 语句创建一个循环,用于更新游戏状态并重新绘制窗口。

在游戏过程中,蛇的速度和体长会随着时间的推移而变化。我们通过定义循环轮数(turn)来实现这一点,并通过取余的方式增加速度。同时,我们还定义了一个变量(M),用于表示蛇体长的最大值。

最后,我们使用一个 with 语句来绘制游戏界面。我们首先清理屏幕,然后创建一个二维的“world”列表,表示游戏的世界。我们还绘制了竖线和横线,以便更好地显示游戏界面。

接下来,让我们一起来看看这段贪吃蛇代码的实现过程,探索食物对蛇的诱惑力如何在代码中体现。如下图所示

贪吃蛇

篇幅有限,部分代码展示

完整代码参考原文链接

贪吃蛇的奥秘:食物诱惑力如何在代码中体现

"""
控制食物
1.我们控制的是食物,而不是蛇
2.让蛇可以自动的加速
3.让蛇的身体可以自动的变长
4.蛇的大体移动方向是食物所在的方向
"""import random
import copy
from collections import dequefrom blessed import Terminal# 创建terminal对象 控制终端
term = Terminal()
# 定义获取键盘
UP = term.KEY_UP
RIGHT = term.KEY_RIGHT
LEFT = term.KEY_LEFT
DOWN = term.DOWN
direction = RIGHT  #定义初始方向
# 定义变量,字典类型 存储数据
MOVEMENT_MAP = {LEFT: [0, -1], UP: [-1, 0], RIGHT: [0, 1], DOWN: [1, 0]}
# 添加状态,活着
dead = False
# 定于框内元素
BORDER = '-'
BODY = '*'
HEAD = '#'
APPLE = 'x'
SPACE = ' '# 定义蛇,初始化蛇的初始位置,双向队列,使用 deque(双向队列)来实现蛇的移动,其中每个元素表示蛇的一个身体部分,
# 例如 [6, 5] 表示蛇的一个身体部分位于第 6 行第 5 列。
snake = deque([[6, 5], [6, 4], [6, 3]])
# 定义食物的位置
food = [5, 10]# 定义窗口大小
h, w = 10, 15
# 定义分数
score = 0
# 定义速度
speed = 3
MAX_SPEED = 6# 自动》变量》循环轮数实现蛇的速度和体长变化
# turn 表示循环的轮数,循环越多,通过取余的方式增加速度,turn -> turn %N2 < N1 -> speed = speed * 1.07N1 = 1
N2 = 2
# turn % M==0 增长蛇的体长
M = 9# 定义方法 获取空位置放食物
# 收集 world 二维
# 组中为空的元系到 list 中
def list_empty_spaces(world, space):res = []for i in range(len(world)):for j in range(len(world[i])):if world[i][j] == space:res.append([i,j])return  res# 绘制窗口,使用 with 语句创建一个循环,用于更新游戏状态并重新绘制窗口
# """
# "term.cbreak()" 是设置终端的 "cursor invisible" 属性,使终端的光标不可见。
# "term.hidden_cursor()" 是设置终端的 "cursor hidden" 属性,使终端的光标隐藏。
# """
with term.cbreak(), term.hidden_cursor():print(term.home + term.clear)  #清理屏幕world = [[SPACE] * w for _ in range(h)]# 绘制竖线,创建一个二维的 "world" 列表,表示游戏的世界。它有 h 行 w 列for i in range(h):world[i][0] = BORDERworld[i][-1] = BORDER# 绘制横线for i in range(w):world[0][i] = BORDERworld[-1][i] = BORDER"""首先遍历蛇(snake)的每一个位置,遍历蛇的所有位置。s 是蛇的一个位置,例如 (1, 2)。并将蛇身的每个单元格设置为 "body""""for s in snake:world[s[0]][s[1]] = BODYhead = snake[0]world[head[0]][head[1]] = HEADworld[food[0]][food[1]] = APPLEfor row in world:print(''.join(str(x) for x in row))# 控制键盘移动逻辑val = ''   # 定义一个空字符串moving = False  # 判断是否移动turn = 0  #当前游戏轮数 循环次数while val.lower() != 'q':  # quit# 阻塞val = term.inkey(timeout= 1 / speed)  #if val.code in [UP,DOWN,RIGHT,LEFT]:moving = Trueif not moving:continue# 控制蛇想移动方向,计算蛇头和食物的距离判断方向head = snake[0]y_diff = food[0] - head[0]x_diff = food[1] - head[1]# 蛇希望移动的方向want_move = Noneif abs(y_diff)>abs(x_diff):   # 获取差的绝对值  向上或向下移动if y_diff <= 0:    # 向上移动want_move = UPelse:want_move = DOWNelse:if x_diff <= 0:want_move = LEFTelse:want_move = RIGHT#         计算出的可移动选择want_moves = [want_move] + [UP,DOWN,LEFT,RIGHT]#   定义具体要移动的位置next_move = Nonefor move in want_moves:  # 循环movement = MOVEMENT_MAP.get(move)
#             浅拷贝获得头head_copy = copy.copy(head)# 对头部运算,移动蛇头head_copy[0] += movement[0]head_copy[1] += movement[1]# 获得移动位置之后的原本内容heading = world[head_copy[0]][head_copy[1]]if heading == BORDER:  # 如果移到墙那里就会死掉continueelif heading == BODY:  # 如果移到身体那里就会死掉if head_copy == snake[-1] and turn % M != 0:next_move = head_copybreakelse:continueelse:next_move = head_copybreak

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

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

相关文章

MySQL的概述、版本、安装过程

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、MySQL的概述 二、MySQL的版本 三、MySQL的下载与安装 前言 本文将来谈谈MySQL的概述&#xff0c;MySQL的版本&#xff0c;以及它…

4.3.3.1 【MySQL】CHAR(M)列的存储格式

我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦&#xff0c;分变长字符集和定长字符集的情况&#xff0c;而在 Redundant 行格式中十分干脆&#xff0c;不管该列使用的字符集是啥&#xff0c;只要是使用 CHAR(M) 类型&#xff0c;占用的真实数据空间就是…

论文简读 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

论文地址&#xff1a;https://arxiv.org/pdf/2106.09685.pdf 项目地址&#xff1a;https://github.com/microsoft/LoRA 全文翻译地址&#xff1a;https://zhuanlan.zhihu.com/p/611557340 本来想自行翻译的&#xff0c;但最近没有空 1、关键凝练 1.1 LORA是什么&#xff1f; …

python中的时间处理函数

一、datetime模块 1、日期和时间 datetime模块提供了datetime、date和time等类来表示和操作日期和时间。下面是一个创建datetime对象的示例: from datetime import datetimecurrent_datetime datetime.now() print("Current DateTime:", current_datetime) 2、日…

sentinel熔断报java.lang.reflect.UndeclaredThrowableException

背景&#xff1a;内部要进行应用jdk&springboot升级&#xff0c;因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。 依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</a…

异步编程 - 12 异步、基于事件驱动的网络编程框架 Netty

文章目录 Netty概述Netty中的一些概念Netty的线程模型Netty Server端Netty Netty 端 TCP半包与粘包问题基于Netty与CompletableFuture实现RPC异步调用 Netty概述 Netty是一个异步、基于事件驱动的网络应用程序框架&#xff0c;其对Java NIO进行了封装&#xff0c;大大简化了TC…

阿里云云主机免费试用三个月

试用链接如下&#xff1a; 阿里云云产品免费试用 云主机 费用试用三个月&#xff0c;每月750小时 实例规格 1核(vCPU) 2 GiB S6 系列机型 适用搭建网站等场景 网络带宽 1M 公网固定网络带宽 云盘40 GiB 真香&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

促科技创新:高德数据优化篇之OceanBase最佳实践

本文作者&#xff1a; 振飞&#xff08;高德地图总裁&#xff09; 炳蔚&#xff08;高德技术服务平台负责人&#xff09; 福辰&#xff08;高德服务端架构师&#xff09; 背景 高德成立于2002年&#xff0c;是中国领先的移动数字地图、导航及实时交通信息服务提供商&#xff0c…

数据库去重(MYSQL和ORACLE)

一、数据库中的去重操作&#xff08;删除数据库中重复记录的SQL语句&#xff09;主要有三种方法 &#xff08;1&#xff09;、rowid方法 &#xff08;2&#xff09;、group by 方法 &#xff08;3&#xff09;、distinct方法 1、用rowid方法 根据Oracle带的rowid属性&#…

React中的类组件和函数组件(详解)

React的核心思想就是组件化&#xff0c;相对于Vue来说&#xff0c;React的组件化更加灵活和多样。主要可以分为两大类&#xff1a;函数组件&#xff0c;类组件&#xff0c;这两大类组件的名称必须是大写字母开头 一、函数组件 函数组件通常是function进行定义的函数&#xff0…

04、javascript 修改对象中原有的属性值、修改对象中原有属性的名字(两种方式)、添加对象中新属性等的操作

1、修改对象中原有的属性值 其一、代码为&#xff1a; // 想将 obj 中的 flag 值&#xff0c;根据不同的值来变化(即&#xff1a;修改对象中原有的属性值)&#xff1b; let obj {"port": "port_0","desc": "desc_0","flag&quo…

java字符串String类的常用方法

java字符串String类的常用方法 字符串的创建&#xff1a; (1)定义字符串直接赋值&#xff0c;在字符串池中开辟空间() String str1“Hello”;//在字符串池中写入字符串"hello" String str2“Hello”;//直接引用字符串池中的"Hello" System.out.printl…

qt作业day2

//widget.cpp#include "widget.h" #include "ui_widget.h"void Widget::usr_login() {if("admin" this->edit_acc->text()){if("123456" this->edit_psd->text()){speech->say("登录成功");emit jump_sig1…

Scientific discovery in the age of artificial intelligence

人工智能时代的科学发现 摘要 人工智能(AI)正越来越多地融入科学发现&#xff0c;以增强和加速研究&#xff0c;帮助科学家产生假设&#xff0c;设计实验&#xff0c;收集和解释大型数据集&#xff0c;并获得仅使用传统科学方法可能无法获得的见解。在这里&#xff0c;我们研究…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

Win11搭建 Elasticsearch 7 集群(一)

一&#xff1a; ES与JDK版本匹配一览表 elasticsearch从7.0开始默认安装了java运行环境&#xff0c;以便在没有安装java运行环境的机器上运行。如果配置了环境变量JAVA_HOME&#xff0c;则elasticsearh启动时会使用JAVA_HOME作为java路径&#xff0c;否则使用elasticsearch根目…

【录用案例】CCF-C类,1/2区SCIEI,3个月14天录用,30天见刊,11天检索

计算机科学类SCI&EI 【期刊简介】IF&#xff1a;5.5-6.0&#xff0c;JCR1/2区&#xff0c;中科院2区 【检索情况】SCI&EI 双检&#xff08;CCF-C类&#xff09; 【征稿领域】边缘计算、算法与机器学习的结合研究 录用案例&#xff1a;3个月14天录用&#xff0c;录用…

Android lint配置及使用

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、将 lint 配置为不显示警告3.1 在 A…

【TSN】(一)中英译文

【Two Stream Net】 一&#xff0c;双语翻译 文章目录 【Two Stream Net】Abstract1 Introduction1.1 Related work 2 Two-stream architecture for video recognition3 Optical flow ConvNets3.1 ConvNet input configurations3.2 Relation of the temporal ConvNet archite…

论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)

文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目&#xff1a;简单黑盒对抗攻…