贪吃蛇小游戏基本简单布局

代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>Layui贪吃蛇小游戏</title>

<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.css">

</head>

<body>

<div class="layui-container">

<h1 class="layui-header">Layui贪吃蛇小游戏</h1>

<div class="layui-row">

<div class="layui-col-md8">

<canvas id="gameCanvas" width="400" height="400"></canvas>

</div>

<div class="layui-col-md4">

<div class="layui-card">

<div class="layui-card-header">游戏控制</div>

<div class="layui-card-body">

<button id="startBtn" class="layui-btn">开始游戏</button>

<button id="pauseBtn" class="layui-btn">暂停游戏</button>

<button id="resetBtn" class="layui-btn">重置游戏</button>

</div>

</div>

</div>

</div>

</div>

<script src="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/layui.js"></script>

<script>

layui.use('layer', 'form', function(){

var layer = layui.layer;

var form = layui.form;

// 游戏逻辑

var canvas = document.getElementById('gameCanvas');

var ctx = canvas.getContext('2d');

var snakeSize = 10;

var snake = [

{x: 200, y: 200},

{x: 190, y: 200},

{x: 180, y: 200},

{x: 170, y: 200},

{x: 160, y: 200}

];

var food = {x: 0, y: 0};

var dx = 10;

var dy = 0;

function drawSnakePart(snakePart) {

ctx.fillStyle = 'lightgreen';

ctx.strokeStyle = 'darkgreen';

ctx.fillRect(snakePart.x, snakePart.y, snakeSize, snakeSize);

ctx.strokeRect(snakePart.x, snakePart.y, snakeSize, snakeSize);

}

function drawSnake() {

snake.forEach(drawSnakePart);

}

function advanceSnake() {

const head = {x: snake0.x + dx, y: snake0.y + dy};

snake.unshift(head);

const didEatFood = snake0.x === food.x && snake0.y === food.y;

if (didEatFood) {

createFood();

} else {

snake.pop();

}

}

function clearCanvas() {

ctx.fillStyle = 'white';

ctx.strokeStyle = 'black';

ctx.fillRect(0, 0, canvas.width, canvas.height);

ctx.strokeRect(0, 0, canvas.width, canvas.height);

}

function createFood() {

food.x = Math.floor(Math.random() * canvas.width / 10) * 10;

food.y = Math.floor(Math.random() * canvas.height / 10) * 10;

snake.forEach(function isFoodOnSnake(part) {

const foodIsOnSnake = part.x === food.x && part.y === food.y;

if (foodIsOnSnake) {

createFood();

}

});

}

function drawFood() {

ctx.fillStyle = 'red';

ctx.strokeStyle = 'darkred';

ctx.fillRect(food.x, food.y, snakeSize, snakeSize);

ctx.strokeRect(food.x, food.y, snakeSize, snakeSize);

}

function main() {

if (didGameEnd()) return;

setTimeout(function onTick() {

changingDirection = false;

clearCanvas();

drawFood();

advanceSnake();

drawSnake();

main();

}, 100)

}

function didGameEnd() {

for (let i = 4; i < snake.length; i++) {

if (snakei.x === snake0.x && snakei.y === snake0.y) return true;

}

const hitLeftWall = snake0.x < 0;

const hitRightWall = snake0.x > canvas.width - 10;

const hitTopWall = snake0.y < 0;

const hitBottomWall = snake0.y > canvas.height - 10;

return hitLeftWall || hitRightWall || hitTopWall || hitBottomWall;

}

function resetGame() {

snake = [

{x: 200, y: 200},

{x: 190, y: 200},

{x: 180, y: 200},

{x: 170, y: 200},

{x: 160, y: 200}

];

dx = 10;

dy = 0;

createFood();

}

createFood();

main();

document.addEventListener('keydown', changeDirection);

function changeDirection(event) {

const LEFT_KEY = 37;

const RIGHT_KEY = 39;

const UP_KEY = 38;

const DOWN_KEY = 40;

if (changingDirection) return;

changingDirection = true;

const keyPressed = event.keyCode;

const goingUp = dy === -10;

const goingDown = dy === 10;

const goingRight = dx === 10;

const goingLeft = dx === -10;

if (keyPressed === LEFT_KEY && !goingRight) {

dx = -10;

dy = 0;

}

if (keyPressed === UP_KEY && !goingDown) {

dx = 0;

dy = -10;

}

if (keyPressed === RIGHT_KEY && !goingLeft) {

dx = 10;

dy = 0;

}

if (keyPressed === DOWN_KEY && !goingUp) {

dx = 0;

dy = 10;

}

}

// 游戏控制

var startBtn = document.getElementById('startBtn');

var pauseBtn = document.getElementById('pauseBtn');

var resetBtn = document.getElementById('resetBtn');

startBtn.onclick = function() {

main();

}

pauseBtn.onclick = function() {

clearTimeout(main);

}

resetBtn.onclick = function() {

resetGame();

}

});

</script>

</body>

</html>

结果图:

相关推荐
字节跳动开源1 分钟前
VisActor全新图可视化开源项目:VGraph
前端·设计模式·开源
打呵欠的猫3 分钟前
前端接口超时从 15s 改到动态值后,用户投诉降了 60%——AI 帮我分析出的方案
前端·ai编程
岁月宁静3 分钟前
二、《从零手撸 Agent》 — 聊聊 LLM 的失忆真相
前端·python·agent
郭邯11 分钟前
用纯前端实现一个代码压缩美化工具,我踩了这三个坑
前端
用户2832096793713 分钟前
从进程线程到 async/await:JS Event-loop事件循环机制底层解析
前端·javascript
岁月宁静22 分钟前
一、《从零手撸 Agent》 我用 10 行代码跑通了第一次大模型调用(顺便踩了 4 个坑)
前端·python·agent
guanguan0_025 分钟前
用 AI 做技术方案评审:输入 3 个方案,输出对比矩阵 + 推荐理由
javascript·人工智能·矩阵·ai编程
计算机魔术师41 分钟前
Fable 5.1 来了,智能体任务成本降 45%——Anthropic 这次为何降价这么狠
前端
Csvn42 分钟前
现代 CSS 新特性深度:container query、:has()、@scope 与 subgrid
前端
计算机魔术师1 小时前
Anthropic 自己承认:模型越来越难管住了
前端