网页版贪吃蛇

我们可以使用HTML、CSS和JavaScript来编写一个网页版的贪吃蛇游戏。下面是一个基本的项目结构层级以及相应的代码文件:

项目文件结构:

  • index.html
  • css/
    • style.css
  • js/
    • snake.js

各个文件的示例代码如下:

  1. index.html
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    <canvas id="game-board" width="600" height="600"></canvas>
    <script src="js/snake.js"></script>
</body>
</html>
  1. style.css
body {
    background-color: #000;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    overflow: hidden;
}

#game-board {
    background-color: #fff;
}
  1. snake.js

这是一个简化版的贪吃蛇游戏逻辑,为了简化,我们没有包括碰撞检测或者游戏结束条件:

let canvas = document.getElementById('game-board');
let context = canvas.getContext('2d');

let box = 20;
let snake = [];
snake[0] = {
    x: 10 * box,
    y: 10 * box
}

let direction = "right";

function createBackground() {
    context.fillStyle = "lightgreen";
    context.fillRect(0, 0, 30*box, 30*box);
}

function createSnake() {
    for(i = 0; i < snake.length; i++) {
        context.fillStyle = "green";
        context.fillRect(snake[i].x, snake[i].y, box, box);
    }
}

function updateSnake() {
    let snakeX = snake[0].x;
    let snakeY = snake[0].y;

    if(direction == "right") snakeX += box;
    if(direction == "left") snakeX -= box;
    if(direction == "up") snakeY -= box;
    if(direction == "down") snakeY += box;

    snake.pop();
    let newHead = {
        x: snakeX,
        y: snakeY
    }

    snake.unshift(newHead);
}

function drawGame() {
    createBackground();
    createSnake();
    updateSnake();
}

let game = setInterval(drawGame, 100);

这个游戏的工作原理是通过JavaScript来控制一个canvas元素,用来绘制贪吃蛇和游戏背景。游戏的主循环是drawGame函数,它每100毫秒执行一次,用来更新屏幕上的贪吃蛇的位置。根据方向,蛇的头部位置将更新,尾部的位置将被移除,头部的新位置将被加入到蛇的数组。

请注意,这只是一个基本的贪吃蛇游戏,你可能还需要添加更多的功能,例如检测碰撞、添加食物、增加游戏结束的条件等等。

对,这个简单的贪吃蛇游戏示例没有包含方向控制的代码。为了能够使用键盘控制蛇的方向,我们需要添加一个键盘事件监听器来改变direction变量的值。

snake.js 文件的代码中,你可以添加如下的代码:

document.addEventListener('keydown', updateDirection);

function updateDirection(event) {
    if(event.keyCode == 37 && direction != "right") direction = "left";
    if(event.keyCode == 38 && direction != "down") direction = "up";
    if(event.keyCode == 39 && direction != "left") direction = "right";
    if(event.keyCode == 40 && direction != "up") direction = "down";
}

这段代码监听键盘的按键事件,当按下左(37)、上(38)、右(39)或下(40)箭头键时,它会更新 direction 变量的值。我们还要检查当前的方向,以防止蛇直接反向运动。例如,如果蛇正在向右移动,我们不希望用户能直接让蛇向左移动,因为这将导致蛇立即碰到自己的身体。

添加了这段代码之后,你应该能够使用箭头键来控制贪吃蛇的方向了。

确实,我们还没有在游戏中添加食物。让我们来添加一些食物,这样蛇就有东西可以吃了。

snake.js 文件的代码中,我们可以添加一个食物的对象,并且在游戏的主循环中绘制食物。同时,我们还需要在 updateSnake 函数中检查蛇是否吃到了食物。如果吃到了,就增加蛇的长度,并在随机位置生成新的食物。

以下是更新后的 snake.js 文件:

let canvas = document.getElementById('game-board');
let context = canvas.getContext('2d');

let box = 20;
let snake = [];
snake[0] = {
    x: 10 * box,
    y: 10 * box
}

let food = {
    x: Math.floor(Math.random() * 30) * box,
    y: Math.floor(Math.random() * 30) * box
}

let direction = "right";

function createBackground() {
    context.fillStyle = "lightgreen";
    context.fillRect(0, 0, 30*box, 30*box);
}

function createSnake() {
    for(i = 0; i < snake.length; i++) {
        context.fillStyle = "green";
        context.fillRect(snake[i].x, snake[i].y, box, box);
    }
}

function drawFood() {
    context.fillStyle = "red";
    context.fillRect(food.x, food.y, box, box);
}

document.addEventListener('keydown', updateDirection);

function updateDirection(event) {
    if(event.keyCode == 37 && direction != "right") direction = "left";
    if(event.keyCode == 38 && direction != "down") direction = "up";
    if(event.keyCode == 39 && direction != "left") direction = "right";
    if(event.keyCode == 40 && direction != "up") direction = "down";
}

function updateSnake() {
    let snakeX = snake[0].x;
    let snakeY = snake[0].y;

    if(direction == "right") snakeX += box;
    if(direction == "left") snakeX -= box;
    if(direction == "up") snakeY -= box;
    if(direction == "down") snakeY += box;

    if(snakeX != food.x || snakeY != food.y) {
        snake.pop();
    } else {
        food.x = Math.floor(Math.random() * 30) * box;
        food.y = Math.floor(Math.random() * 30) * box;
    }

    let newHead = {
        x: snakeX,
        y: snakeY
    }

    snake.unshift(newHead);
}

function drawGame() {
    createBackground();
    createSnake();
    drawFood();
    updateSnake();
}

let game = setInterval(drawGame, 100);

现在,每次蛇吃到食物时,食物就会在画布的随机位置重新出现,同时蛇的长度也会增加。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容