前序:前一段时间在都以上看到国内利用ChatGpt 3 做了一个手机软件,今天休息没事就用了一下,看看有没有什么有意思的事情,于是就利用他做了一个贪吃蛇的网页小游戏
有想了解ChatMe的朋友可以通过链接看一下他的抖音账号:ChatMe抖音账号
好的,下面是一份可用的贪吃蛇游戏代码,注释以及简单的关卡和速度设置。
```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
```
注意,这个代码只是一个非常简单的贪吃
当然可以,以下是一个简单的样式,你可以将其放入 `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
贪吃蛇
```
修改后的样式包含了一个拥有气泡效果的蓝色渐变色按钮,同时也添加了贪吃蛇游戏的相关样式。
暂停生效
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` 变量,以便下一次判断时使用。
贪吃蛇
如果喜欢这篇文章的话记得点赞收藏哦