利用ChatMe写一个简易的贪吃蛇小游戏 (有效可用)

前序:前一段时间在都以上看到国内利用ChatGpt 3 做了一个手机软件,今天休息没事就用了一下,看看有没有什么有意思的事情,于是就利用他做了一个贪吃蛇的网页小游戏

有想了解ChatMe的朋友可以通过链接看一下他的抖音账号ChatMe抖音账号

聊天截图:

当然过程之中忘记截图了,没法让大家直观地感受到他的生成速度,主观来讲的话还是不慢的,怎么形容呢,跟大家平时用小黑窗口运行代码时的输出速度差不多,这里他不仅生成了js代码,也把html页面中的标签在最近下面告诉我们,基本就是无脑cv了,方便大家观看我把他回复的部分一代码形式呈现给大家,也方便大家复制

好的,下面是一份可用的贪吃蛇游戏代码,注释以及简单的关卡和速度设置。
```javascript
// 获取 canvas 元素
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');// 设置 canvas 大小
canvas.width = 400;
canvas.height = 400;// 定义变量和常量
const blockSize = 10; // 块大小
let snake = [{x: 20, y: 20}]; // 蛇的初始位置
let direction = 'right'; // 蛇的初始方向
let food = null; // 食物初始位置
let score = 0; // 初始得分
let interval = null; // 计时器// 画出蛇和食物
function draw() {// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 画蛇snake.forEach((block) => {ctx.fillStyle = 'green';ctx.fillRect(block.x, block.y, blockSize, blockSize);});// 画食物if (food) {ctx.fillStyle = 'red';ctx.fillRect(food.x, food.y, blockSize, blockSize);}
}// 生成随机食物
function generateFood() {const x = Math.floor(Math.random() * (canvas.width / blockSize)) * blockSize;const y = Math.floor(Math.random() * (canvas.height / blockSize)) * blockSize;// 如果食物与蛇重合,重新生成if (snake.some((block) => block.x === x && block.y === y)) {generateFood();} else {food = {x, y};}
}// 移动蛇
function move() {// 添加一个新的蛇头let x = snake[0].x;let y = snake[0].y;switch (direction) {case 'up':y -= blockSize;break;case 'down':y += blockSize;break;case 'left':x -= blockSize;break;case 'right':x += blockSize;break;}// 如果蛇吃到了食物,长度加一,重新生成食物if (x === food.x && y === food.y) {snake.unshift({x, y});score++;generateFood();} else {// 否则移除最后一个块,添加一个新的块snake.pop();snake.unshift({x, y});}// 如果蛇头撞到了边界或者自己的身体,游戏结束if (x < 0 || x >= canvas.width || y < 0 || y >= canvas.height || snake.some((block, index) => index > 0 && block.x === x && block.y === y)) {clearInterval(interval);alert(`游戏结束!得分:${score}`);}draw();
}// 开始游戏
function start() {// 初始化蛇和食物snake = [{x: 20, y: 20}];direction = 'right';generateFood();score = 0;// 设置速度const speed = document.getElementById('speed').value;interval = setInterval(move, speed);
}// 监听键盘事件
document.addEventListener('keydown', (event) => {switch (event.keyCode) {case 37:if (direction !== 'right') {direction = 'left';}break;case 38:if (direction !== 'down') {direction = 'up';}break;case 39:if (direction !== 'left') {direction = 'right';}break;case 40:if (direction !== 'up') {direction = 'down';}break;}
});// 开始按钮点击事件
document.getElementById('start').addEventListener('click', start);
```在 HTML 中,需要添加一个 canvas 元素和一个开始按钮,并设置速度选择器:
```html
<canvas id="canvas"></canvas>
<button id="start">开始</button>
<label for="speed">速度:</label>
<input type="range" id="speed" min="10" max="100" value="50">
```注意,这个代码只是一个非常简单的贪吃

可能由于软件字数限制的原因这里最下面的部分没有说完就结束了

为了测试他的上下文联系功能这里让他加上css样式,看看是否能够生效

当然可以,以下是一个简单的样式,你可以将其放入 `style` 标签中:
```css
#canvas {border: 2px solid black;background-color: #eee;
}button {font-size: 20px;padding: 10px 20px;margin-top: 20px;background-color: #4CAF50;color: white;border: none;border-radius: 5px;cursor: pointer;transition: all 0.3s;
}button:hover {background-color: #3e8e41;
}label {font-size: 18px;margin-left: 10px;
}input[type="range"] {width: 200px;margin-left: 10px;
}
```这个样式包括了一个有边框和背景色的 canvas,一个带有过渡效果的开始按钮,以及标签和速度选择器的样式。你可以根据自己的需求修改样式。

以上来看的话,他的生成模板应该是md的格式

这个时候代码其实就已经生效了,并且可以跑起来,而且速度也是可以控制的

但同时,这个代码也有问题,无法暂停,而且多次敲击回车会导致贪吃蛇不断加速,直到撞墙后,警示框会不断弹出,并且关不掉,当然代价已经想出了问题,所以这时我提出了优化代码的要求

好的,以下是优化后的代码,其中包含暂停游戏的功能:```javascript
// 获取 canvas 元素
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');// 设置 canvas 大小
canvas.width = 400;
canvas.height = 400;// 定义变量和常量
const blockSize = 10; // 块大小
let snake = [{x: 20, y: 20}]; // 蛇的初始位置
let direction = 'right'; // 蛇的初始方向
let food = null; // 食物初始位置
let score = 0; // 初始得分
let interval = null; // 计时器
let pause = false; // 游戏是否暂停// 画出蛇和食物
function draw() {// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 画蛇snake.forEach((block) => {ctx.fillStyle = 'green';ctx.fillRect(block.x, block.y, blockSize, blockSize);});// 画食物if (food) {ctx.fillStyle = 'red';ctx.fillRect(food.x, food.y, blockSize, blockSize);}
}// 生成随机食物
function generateFood() {const x = Math.floor(Math.random() * (canvas.width / blockSize)) * blockSize;const y = Math.floor(Math.random() * (canvas.height / blockSize)) * blockSize;// 如果食物与蛇重合,重新生成if (snake.some((block) => block.x === x && block.y === y)) {generateFood();} else {food = {x, y};}
}// 移动蛇
function move() {if (pause) { // 如果游戏暂停,不执行移动操作return;}// 添加一个新的蛇头let x = snake[0].x;let y = snake[0].y;switch (direction) {case 'up':y -= blockSize;break;case 'down':y += blockSize;break;case 'left':x -= blockSize;break;case 'right':x += blockSize;break;}// 如果蛇吃到了食物,长度加一,重新生成食物if (x === food.x && y === food.y) {snake.unshift({x, y});score++;generateFood();} else {// 否则移除最后一个块,添加一个新的块snake.pop();snake.unshift({x, y});}// 如果蛇头撞到了边界或者自己的身体,游戏结束if (x < 0 || x >= canvas.width || y < 0 || y >= canvas.height || snake.some((block, index) => index > 0 && block.x === x && block.y === y)) {clearInterval(interval);alert(`游戏结束!得分:${score}`);}draw();
}// 开始游戏
function start() {// 初始化蛇和食物snake = [{x: 20, y: 20}];direction = 'right';generateFood();score = 0;// 设置速度const speed = document.getElementById('speed').value;interval = setInterval(move, speed);
}// 监听键盘事件
document.addEventListener('keydown', (event) => {switch (event.keyCode) {case 37:if (direction !== 'right') {direction = 'left';}break;case 38:if (direction !== 'down') {direction = 'up';}break;case 39:if (direction !== 'left') {direction = 'right';}break;case 40:if (direction !== 'up') {direction = 'down';}break;case 32: // 空格键pause = !pause;break;}
});// 开始按钮点击事件
document.getElementById('start').addEventListener('click', start);// 暂停按钮点击事件
document.getElementById('pause').addEventListener('click', () => {pause = !pause;
});
```在 HTML 中,需要添加一个暂停按钮:```html
<

但这个时候或许又是因为字符长度限制,信息没有全部加载出来,所以根据程序员的尿性,我又让他重新生成了一遍

好的,以下是完整的 HTML 代码,包括样式和按钮的代码:```html
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>贪吃蛇</title><style>#canvas {border: 1px solid black;}button {background-color: #0077CC;color: white;border: none;border-radius: 3px;padding: 10px 20px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 10px;transition-duration: 0.4s;cursor: pointer;box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);}button:hover {background-color: #0051A9;}.wrapper {display: flex;justify-content: center;align-items: center;flex-direction: column;margin-top: 50px;}label {font-size: 20px;margin-right: 10px;}input[type="number"] {width: 50px;}</style>
</head>
<body><div class="wrapper"><canvas id="canvas"></canvas><div><label for="speed">速度:</label><input type="number" id="speed" min="50" max="1000" value="200"><button id="start">开始</button><button id="pause">暂停</button></div></div><script src="snake.js"></script>
</body>
</html>
```修改后的样式包含了一个拥有气泡效果的蓝色渐变色按钮,同时也添加了贪吃蛇游戏的相关样式。

修改之后虽然添加了暂停功能,但是加速问题依旧没有解决


暂停生效


bug依旧存在


所以继续询问

是的,为了解决这个问题,我们可以在每次按下回车键时,检查时间间隔是否足够长,如果足够长,才执行加速操作。我们可以使用一个变量来记录上次按下回车键的时间戳,然后在监听回车键事件时,计算当前时间戳与上一次时间戳的差值,如果时间差值小于某个特定值,就放弃执行加速操作。下面是一个示例代码,实现了在每次按下回车键时加速,但是避免了连续多次按回车键造成的重复加速问题:```javascript
let lastEnterTime = 0; // 用来记录上次按下回车键的时间戳document.addEventListener('keydown', event => {if (event.code === 'Enter') {const now = Date.now();const timeDiff = now - lastEnterTime; // 计算时间间隔if (timeDiff > 500) { // 如果时间间隔足够长(500 毫秒)lastEnterTime = now;// 执行加速操作}}
});
```在上面的代码中,我们使用了 `Date.now()` 方法来获取当前时间戳,然后计算与上一次时间戳的差值来判断时间间隔是否足够长。如果时间间隔足够长,就将当前时间戳赋值给 `lastEnterTime` 变量,以便下一次判断时使用。

但按照正常体验来说,开始按钮只具备开始功能,不会对游戏速度进行加速,回车也是一样,但碍于每日提问次数也就不了了之了

总的来说它具备一定的代码生成能力,并且有良好的编码规范,基本上改由注释的地方都添加注释了,但对于逻辑性的问题来说还是需要进一步加强

如果大家有什么好的想法可以分享在评论区,大家一起讨论一下

当然整体页面看下来也会有很多人还是觉得需要一点点看文章去修改,这里我把正常的格式放在下面,复制就可以Alt+B 啦

<!DOCTYPE HTML>
<html><head><title>贪吃蛇</title><style>#canvas {border: 1px solid black;}button {background-color: #0077CC;color: white;border: none;border-radius: 3px;padding: 10px 20px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 10px;transition-duration: 0.4s;cursor: pointer;box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);}button:hover {background-color: #0051A9;}.wrapper {display: flex;justify-content: center;align-items: center;flex-direction: column;margin-top: 50px;}label {font-size: 20px;margin-right: 10px;}input[type="number"] {width: 50px;}</style>
</head><body><body><div class="wrapper"><canvas id="canvas"></canvas><div><label for="speed">速度:</label><input type="number" id="speed" min="50" max="1000" value="200"><button id="start">开始</button><button id="pause">暂停</button></div></div><script src="snake.js"></script></body><script>// 获取 canvas 元素const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');// 设置 canvas 大小canvas.width = 400;canvas.height = 400;// 定义变量和常量const blockSize = 10; // 块大小let snake = [{x: 20,y: 20}]; // 蛇的初始位置let direction = 'right'; // 蛇的初始方向let food = null; // 食物初始位置let score = 0; // 初始得分let interval = null; // 计时器let pause = false; // 游戏是否暂停// 画出蛇和食物function draw() {// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 画蛇snake.forEach((block) => {ctx.fillStyle = 'green';ctx.fillRect(block.x, block.y, blockSize, blockSize);});// 画食物if (food) {ctx.fillStyle = 'red';ctx.fillRect(food.x, food.y, blockSize, blockSize);}}// 生成随机食物function generateFood() {const x = Math.floor(Math.random() * (canvas.width / blockSize)) * blockSize;const y = Math.floor(Math.random() * (canvas.height / blockSize)) * blockSize;// 如果食物与蛇重合,重新生成if (snake.some((block) => block.x === x && block.y === y)) {generateFood();} else {food = {x,y};}}// 移动蛇function move() {if (pause) { // 如果游戏暂停,不执行移动操作return;}// 添加一个新的蛇头let x = snake[0].x;let y = snake[0].y;switch (direction) {case 'up':y -= blockSize;break;case 'down':y += blockSize;break;case 'left':x -= blockSize;break;case 'right':x += blockSize;break;}// 如果蛇吃到了食物,长度加一,重新生成食物if (x === food.x && y === food.y) {snake.unshift({x,y});score++;generateFood();} else {// 否则移除最后一个块,添加一个新的块snake.pop();snake.unshift({x,y});}// 如果蛇头撞到了边界或者自己的身体,游戏结束if (x < 0 || x >= canvas.width || y < 0 || y >= canvas.height || snake.some((block, index) => index > 0 && block.x === x && block.y === y)) {clearInterval(interval);alert(`游戏结束!得分:${score}`);}draw();}// 开始游戏function start() {// 初始化蛇和食物snake = [{x: 20,y: 20}];direction = 'right';generateFood();score = 0;// 设置速度const speed = document.getElementById('speed').value;interval = setInterval(move, speed);}// 监听键盘事件document.addEventListener('keydown', (event) => {switch (event.keyCode) {case 37:if (direction !== 'right') {direction = 'left';}break;case 38:if (direction !== 'down') {direction = 'up';}break;case 39:if (direction !== 'left') {direction = 'right';}break;case 40:if (direction !== 'up') {direction = 'down';}break;case 32: // 空格键pause = !pause;break;}});// 开始按钮点击事件document.getElementById('start').addEventListener('click', start);// 暂停按钮点击事件document.getElementById('pause').addEventListener('click', () => {pause = !pause;});</script></body></html>

如果喜欢这篇文章的话记得点赞收藏哦👀

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

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

相关文章

最新ChatGPT商业网站源码+支持ChatGPT4.0+新增GPT联网功能+支持ai绘画+实时语音识别输入+用户会员套餐

最新ChatGPT商业网站源码支持ChatGPT4.0新增GPT联网功能支持ai绘画实时语音识别输入用户会员套餐 一、AI创作系统二、系统程序下载三、系统介绍四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口、支持新建会话&#…

如何有效的向 AI 提问 ?

文章目录 〇、导言一、Base LLM 与 Instruction Tuned LLM二、如何提出有效的问题 &#xff1f;1. 明确问题&#xff1a;2. 简明扼要&#xff1a;3. 避免二义性&#xff1a;4. 避免绝对化的问题&#xff1a;5. 利用引导词&#xff1a;6. 检查语法和拼写&#xff1a;7. 追问细节…

邮政绿卡系统中的SAN存储系统建设

邮政绿卡系统中的SAN存储系统建设

美国绿卡

美国的绿卡正式称谓是“Permanent Resident Card&#xff08;永久居留卡&#xff09;”&#xff0c;也叫I-551&#xff0c;上面记录了持卡人的照片、指纹、姓名等资料&#xff0c;可以通过申请获得&#xff0c;申请人通常需要在美国有固定工作或配偶子女在美国定居。申请成功将…

刚刚和ChatGPT聊了聊隐私计算

开放隐私计算 ChatGPT最近太火了&#xff0c;作为一个背后有庞大数据支撑&#xff0c;而且还在不断进化的人工智能&#xff0c;每个人都想和它聊一聊。 我们也不例外&#xff0c;于是刚刚和它聊了聊隐私计算那些事儿。 先来几个行业问题&#xff0c;毕竟它背后有所有行业新闻、…

chatgpt赋能python:用Python实现数据本地存储

用Python实现数据本地存储 Python是一种非常强大的动态编程语言&#xff0c;其运行速度快&#xff0c;灵活性强&#xff0c;能够快速编写出简洁的代码&#xff0c;而且非常适合数据处理方面的应用。 在现实世界中&#xff0c;数据经常被采集和处理&#xff0c;我们需要把数据…

GhostWriter:Windows桌面端笔记、文档离线管理应用【已开源】

GhostWriter 说明 Ghost Writer 是一款参照 觅道(MrDoc) 开发的个人笔记、文档离线管理应用。 是一个纯前端项目&#xff0c;使用了sqlite本地数据库&#xff0c;除自行编辑使用到的外部图片、外部视频、外部链接等资源、以及OCR识别接口外&#xff0c;注册、登录、编辑等功…

LLM - ChatGLM-6B (General Language Model) 的工程配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper&#xff1a;GLM: General Language Model Pretraining with Autoregressive Blank Infilling ChatGLM是通用的预训练语…

Cisco packet tracer 思科账号登录不上?

Cisco packet tracer 思科账号登录不上&#xff1f;&#xff0c;提示“无法找到NetAcad账户…”的问题&#xff0c;找到解决方案了 你有没有出现过提示“很抱歉,无法找到与此思科账户关联的 NetAcad 账户。请从下面选择您想要执行的操作…” 你是否有这样的困惑&#xff0c;之…

【回答问题】ChatGPT上线了!比较流行的无监督学习模型

无监督学习是机器学习的一种方法,其中算法没有被给予任何人为的目标或标签。相反,它使用数据本身来发现数据之间的关系,并尝试将数据分成不同的组。这种方法通常用于发现数据中隐藏的结构或模式。与监督学习不同,非监督学习不需要人为标记的正确答案来训练模型,因此它通常…

一些常用的数学符号,助你网聊数学准确一点

下面是一些常用数学符号&#xff0c;可以用于不支持LaTeX的使用环境&#xff0c;比如微信、QQ的聊天&#xff0c;微博发文等。大家可以存起来后&#xff0c;有需要的时候回来复制。 注意一些平台可能显示不正常&#xff0c;微信测试都正常显示的。 常量 ∅ ∞ ⦰ א ℶ ⅓ …

【指点江山】ChatGPT超精细指令,会提问题的你才能得到更好的回答

【指点江山】ChatGPT超精细指令&#xff0c;会提问题的你才能得到更好的回答 1&#xff0c;提问题的技巧1.1 确定要搜索的关键字1.2 使用正确的语法1.3 练习询问技巧 2&#xff0c;通用指令2.1 写作指令2.1.1 提问思路 2.2 资料整理2.2.1 提问思路2.2.2 指令举例 2.3 创意领域2…

数学上的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 问题合集一、问题&#xff1a;为什么stats.norm.pdf计算出的概率分布值会大于11.代码2.分析 问题合集 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学…

最便捷的港股/A股/美股实时行情API【免费-免费-免费滴,已应用到策略中】

免费、申请就能用&#xff0c;在这个动辄就要掏钱购买接口使用权限的年头&#xff0c;居然有这种神仙行情接口&#xff1f; 博主申请使用过才推荐给大家d ! 总所周知&#xff0c;去年年底开始港股爆发式的南向资金流入后&#xff0c;大家都开始关注港股&#xff0c;才发现港股…

ChatGPT 最可能取代的 10 种工作

ChatGPT的横空出世&#xff0c;在业界掀起了惊涛骇浪。专家表示&#xff0c;ChatGPT和相关人工智能技术可能会威胁到一些工作岗位&#xff0c;尤其是白领工作。 自去年11月发布以来&#xff0c;新型聊天机器人模型ChatGPT已经被用于各种各样的工作&#xff1a;撰写求职信、编写…

《AI革命:聊天机器人的崛起与劳动力市场的未来》

最近看到很多人都在搞chatgpt, 各种什么chatgpt星球什么的, 有个比较有意思的是提问是&#xff1a;chatgpt不是你研究出来的, 凭啥收费比人家贵, 当时我看到这个说法确实有点那啥, 人家openai收费20美元&#xff08;140左右RMB&#xff09;, 你一个星球就收费499, 影响这个的因…

什么是那 10% 不能被 AI 轻易取代的技能?

90% 和 10% 以 ChatGPT&#xff0c; CoPolit 为代表的大语言模型技术&#xff0c;正在颠覆很多领域&#xff0c;大家都在想 – 我的技能还有用么&#xff1f;我的行业还能保住么&#xff1f; 前两周&#xff0c;软件工程界的领军人物 Kent Beck 发了一个关于 ChatGPT 的感想&…

ChatGPT/GPT-4 或将从根本上改变软件工程

文章目录 一、前言二、主要内容 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 编程也可能是最容易被 AI 技术取代的工作之一&#xff0c;软件的构建方式将产生根本性的转变。 今年以来&#xff0c;相信大家都听说过 ChatGPT、New Bing 和…

程序员危!传OpenAI全球招外包大军,手把手训练ChatGPT取代码农

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 码农真的危了&#xff01; 最近有消息称&#xff0c;OpenAI已经在悄悄地训练ChatGPT&#xff0c;让它学习人类的思考过程&#xff0c;从而真正掌握软件工程&#xff0c;彻底代替「初级码农」。 OpenAI招外包大军…

ChatGPT重量级对手产品:Claude对外发布

什么是Claude Claude是下一代人工智能助手&#xff0c;基于 Anthropic 对训练有用、诚实和无害的人工智能系统的研究。Claude 可通过我们的开发人员控制台中的聊天界面和 API 进行访问&#xff0c;能够执行各种对话和文本处理任务&#xff0c;同时保持高度的可靠性和可预测性。…