当前位置: 首页 > article >正文

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

代码:

<!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: snake[0].x + dx, y: snake[0].y + dy};
        snake.unshift(head);
        const didEatFood = snake[0].x === food.x && snake[0].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 (snake[i].x === snake[0].x && snake[i].y === snake[0].y) return true;
        }
        const hitLeftWall = snake[0].x < 0;
        const hitRightWall = snake[0].x > canvas.width - 10;
        const hitTopWall = snake[0].y < 0;
        const hitBottomWall = snake[0].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>

结果图:


http://www.kler.cn/a/146954.html

相关文章:

  • 通过shell脚本分析部署nginx网络服务
  • 高斯数据库Postgresql死锁和锁表解决方法
  • PyTorch使用教程-深度学习框架
  • 2024年11月16日 星期六 重新整理Go技术
  • Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案
  • 【开源免费】基于SpringBoot+Vue.JS购物推荐网站(JAVA毕业设计)
  • Clion+Ubuntu(WSL)+MySQL8.0开发环境搭建
  • 30天精通Nodejs--第十二天:ioredis
  • 华为OD机试 - 分月饼(Java JS Python C)
  • Vue常见的实现tab切换的两种方法
  • python大写中文转阿拉伯数字
  • C 中的指针 - 函数
  • Java游戏 王者荣耀
  • 【玩转client-go】使用client-go从POD拷贝文件出来
  • Android 13.0 开机过滤部分通知声音(莫名其妙的通知声音)
  • 蓝桥杯官网算法赛(蓝桥小课堂)
  • 做直播服务器要什么样的配置呢?
  • C语言做一个恶作剧关机程序
  • 大数据Doris(三十):删除数据(Delete)
  • RK356x U-Boot研究所(命令篇)3.11 mmc命令的用法
  • 论文阅读:“Model-based teeth reconstruction”
  • Python BDD 框架比较之 pytest-bdd vs behave
  • 14. 最长公共前缀
  • vue 中 asstes 和 static 有什么联系与区别
  • python-opencv 人脸68点特征点检测
  • git日历坐标系? 手动实现github活跃/贡献图