翼度科技»论坛 编程开发 JavaScript 查看内容

js+jquery实现贪吃蛇经典小游戏

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
项目只使用到了html,css,js,jquery技术点,没有使用游戏框架,下载本地直接双击index.html 运行即可体验游戏效果。
项目展示

进入游戏


游戏开始


游戏暂停


html文件
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css">
  8.    
  9. </head>
  10. <body>
  11.    
  12.         
  13.             <h1>贪吃蛇游戏</h1>
  14.             
  15.                
  16.                     得分: 0
  17.                     最高分: 0
  18.                
  19.                 <button id="startBtn">开始游戏</button>
  20.             
  21.             
  22.                
  23.             
  24.             
  25.                 <p>使用方向键 ← ↑ → ↓ 控制蛇的移动</p>
  26.                 <p>按空格键 Space 暂停/继续游戏</p>
  27.             
  28.         
  29.    
  30.    
  31. </body>
  32. </html>
复制代码
CSS文件
  1. * {
  2.     margin: 0;
  3.     padding: 0;
  4.     box-sizing: border-box;
  5. }
  6. body {
  7.     background: linear-gradient(135deg, #1a1a2e, #16213e);
  8.     min-height: 100vh;
  9.     display: flex;
  10.     justify-content: center;
  11.     align-items: center;
  12.     color: #fff;
  13.     font-family: Arial, sans-serif;
  14. }
  15. .container {
  16.     width: 100%;
  17.     max-width: 800px;
  18.     padding: 20px;
  19. }
  20. .game-wrapper {
  21.     background: rgba(255, 255, 255, 0.1);
  22.     border-radius: 20px;
  23.     padding: 30px;
  24.     box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
  25.     backdrop-filter: blur(4px);
  26.     border: 1px solid rgba(255, 255, 255, 0.18);
  27. }
  28. h1 {
  29.     text-align: center;
  30.     margin-bottom: 30px;
  31.     font-size: 2.5em;
  32.     color: #fff;
  33.     text-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
  34. }
  35. .game-info {
  36.     display: flex;
  37.     justify-content: space-between;
  38.     align-items: center;
  39.     margin-bottom: 20px;
  40. }
  41. .score-container {
  42.     font-size: 1.2em;
  43. }
  44. .score, .high-score {
  45.     margin: 5px 0;
  46. }
  47. #score, #highScore {
  48.     color: #4CAF50;
  49.     font-weight: bold;
  50. }
  51. #startBtn {
  52.     background: #4CAF50;
  53.     color: white;
  54.     border: none;
  55.     padding: 12px 30px;
  56.     border-radius: 25px;
  57.     font-size: 1.1em;
  58.     cursor: pointer;
  59.     transition: all 0.3s ease;
  60.     box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3);
  61. }
  62. #startBtn:hover {
  63.     background: #45a049;
  64.     transform: translateY(-2px);
  65. }
  66. .game-board-wrapper {
  67.     display: flex;
  68.     justify-content: center;
  69.     margin: 20px 0;
  70. }
  71. #gameBoard {
  72.     width: 600px;
  73.     height: 600px;
  74.     border-radius: 10px;
  75.     background: rgba(255, 255, 255, 0.05);
  76.     border: 2px solid rgba(255, 255, 255, 0.1);
  77.     position: relative;
  78. }
  79. .snake-body {
  80.     width: 20px;
  81.     height: 20px;
  82.     background: #4CAF50;
  83.     position: absolute;
  84.     border-radius: 4px;
  85. }
  86. .snake-body.head {
  87.     background: #66bb6a;
  88.     box-shadow: 0 0 15px rgba(76, 175, 80, 0.7);
  89. }
  90. .food {
  91.     width: 20px;
  92.     height: 20px;
  93.     background: #ff4444;
  94.     position: absolute;
  95.     border-radius: 50%;
  96.     box-shadow: 0 0 15px rgba(255, 68, 68, 0.7);
  97. }
  98. .controls-info {
  99.     text-align: center;
  100.     margin-top: 20px;
  101.     color: rgba(255, 255, 255, 0.7);
  102.     font-size: 0.9em;
  103.     line-height: 1.6;
  104. }
  105. .controls-info p {
  106.     margin: 5px 0;
  107. }
  108. .key-space {
  109.     display: inline-block;
  110.     padding: 2px 8px;
  111.     background: rgba(255, 255, 255, 0.1);
  112.     border: 1px solid rgba(255, 255, 255, 0.2);
  113.     border-radius: 4px;
  114.     margin: 0 3px;
  115. }
  116. @media (max-width: 768px) {
  117.     #gameBoard {
  118.         width: 300px;
  119.         height: 300px;
  120.     }
  121.    
  122.     .snake-body, .food {
  123.         width: 10px;
  124.         height: 10px;
  125.     }
  126. }
  127. .pause-text {
  128.     position: absolute;
  129.     top: 50%;
  130.     left: 50%;
  131.     transform: translate(-50%, -50%);
  132.     font-size: 2em;
  133.     color: #fff;
  134.     background: rgba(0, 0, 0, 0.7);
  135.     padding: 20px 40px;
  136.     border-radius: 10px;
  137.     z-index: 100;
  138.     animation: pulse 1.5s infinite;
  139. }
  140. @keyframes pulse {
  141.     0% { opacity: 0.6; }
  142.     50% { opacity: 1; }
  143.     100% { opacity: 0.6; }
  144. }
复制代码
js文件
  1. $(document).ready(function() {
  2.     // 游戏配置
  3.     const boardSize = 600;
  4.     const cellSize = 20;
  5.     const gridSize = boardSize / cellSize;
  6.    
  7.     // 游戏状态
  8.     let snake = [];
  9.     let food = {};
  10.     let direction = 'right';
  11.     let gameLoop;
  12.     let score = 0;
  13.     let highScore = localStorage.getItem('highScore') || 0;
  14.     let isGameRunning = false;
  15.    
  16.     // 添加暂停状态变量
  17.     let isPaused = false;
  18.     let savedInterval = null;
  19.    
  20.     // 显示最高分
  21.     $('#highScore').text(highScore);
  22.     // 初始化蛇的位置
  23.     function initSnake() {
  24.         snake = [
  25.             {x: 6, y: 10},
  26.             {x: 5, y: 10},
  27.             {x: 4, y: 10}
  28.         ];
  29.     }
  30.     // 生成食物
  31.     function generateFood() {
  32.         while (true) {
  33.             food = {
  34.                 x: Math.floor(Math.random() * gridSize),
  35.                 y: Math.floor(Math.random() * gridSize)
  36.             };
  37.             
  38.             // 确保食物不会生成在蛇身上
  39.             let foodOnSnake = false;
  40.             for (let body of snake) {
  41.                 if (body.x === food.x && body.y === food.y) {
  42.                     foodOnSnake = true;
  43.                     break;
  44.                 }
  45.             }
  46.             if (!foodOnSnake) break;
  47.         }
  48.     }
  49.     // 绘制游戏画面
  50.     function draw() {
  51.         $('#gameBoard').empty();
  52.         
  53.         // 绘制蛇
  54.         snake.forEach((segment, index) => {
  55.             const snakeElement = $('')
  56.                 .addClass('snake-body')
  57.                 .css({
  58.                     left: segment.x * cellSize + 'px',
  59.                     top: segment.y * cellSize + 'px'
  60.                 });
  61.             
  62.             if (index === 0) {
  63.                 snakeElement.addClass('head');
  64.             }
  65.             
  66.             $('#gameBoard').append(snakeElement);
  67.         });
  68.         
  69.         // 绘制食物
  70.         $('#gameBoard').append(
  71.             $('')
  72.                 .addClass('food')
  73.                 .css({
  74.                     left: food.x * cellSize + 'px',
  75.                     top: food.y * cellSize + 'px'
  76.                 })
  77.         );
  78.     }
  79.     // 移动蛇
  80.     function moveSnake() {
  81.         const head = {x: snake[0].x, y: snake[0].y};
  82.         
  83.         switch(direction) {
  84.             case 'up': head.y--; break;
  85.             case 'down': head.y++; break;
  86.             case 'left': head.x--; break;
  87.             case 'right': head.x++; break;
  88.         }
  89.         
  90.         // 检查是否撞墙
  91.         if (head.x < 0 || head.x >= gridSize || head.y < 0 || head.y >= gridSize) {
  92.             gameOver();
  93.             return;
  94.         }
  95.         
  96.         // 检查是否撞到自己
  97.         for (let body of snake) {
  98.             if (head.x === body.x && head.y === body.y) {
  99.                 gameOver();
  100.                 return;
  101.             }
  102.         }
  103.         
  104.         snake.unshift(head);
  105.         
  106.         // 检查是否吃到食物
  107.         if (head.x === food.x && head.y === food.y) {
  108.             score += 10;
  109.             $('#score').text(score);
  110.             if (score > highScore) {
  111.                 highScore = score;
  112.                 localStorage.setItem('highScore', highScore);
  113.                 $('#highScore').text(highScore);
  114.             }
  115.             generateFood();
  116.         } else {
  117.             snake.pop();
  118.         }
  119.         
  120.         draw();
  121.     }
  122.     // 游戏结束
  123.     function gameOver() {
  124.         clearInterval(gameLoop);
  125.         alert('游戏结束!得分:' + score);
  126.         isGameRunning = false;
  127.         isPaused = false;
  128.         $('#startBtn').text('重新开始');
  129.         $('.pause-text').remove();
  130.     }
  131.     // 开始游戏
  132.     function startGame() {
  133.         if (isGameRunning) return;
  134.         
  135.         isGameRunning = true;
  136.         isPaused = false;
  137.         score = 0;
  138.         $('#score').text(score);
  139.         direction = 'right';
  140.         $('#startBtn').text('游戏中...');
  141.         
  142.         initSnake();
  143.         generateFood();
  144.         draw();
  145.         
  146.         if (gameLoop) clearInterval(gameLoop);
  147.         gameLoop = setInterval(moveSnake, 150);
  148.     }
  149.     // 添加暂停函数
  150.     function togglePause() {
  151.         if (!isGameRunning) return;
  152.         
  153.         if (isPaused) {
  154.             // 继续游戏
  155.             isPaused = false;
  156.             gameLoop = setInterval(moveSnake, 150);
  157.             $('#startBtn').text('游戏中...');
  158.             // 移除暂停提示
  159.             $('.pause-text').remove();
  160.         } else {
  161.             // 暂停游戏
  162.             isPaused = true;
  163.             clearInterval(gameLoop);
  164.             $('#startBtn').text('已暂停');
  165.             // 添加暂停提示
  166.             $('#gameBoard').append(
  167.                 $('')
  168.                     .addClass('pause-text')
  169.                     .text('游戏暂停')
  170.             );
  171.         }
  172.     }
  173.     // 键盘控制
  174.     $(document).keydown(function(e) {
  175.         // 防止方向键和空格键滚动页面
  176.         if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
  177.             e.preventDefault();
  178.         }
  179.         
  180.         // 空格键控制暂停
  181.         if (e.keyCode === 32) { // 空格键
  182.             togglePause();
  183.             return;
  184.         }
  185.         
  186.         // 游戏暂停时不响应方向键
  187.         if (!isGameRunning || isPaused) return;
  188.         
  189.         switch(e.keyCode) {
  190.             case 38: // 上
  191.                 if (direction !== 'down') direction = 'up';
  192.                 break;
  193.             case 40: // 下
  194.                 if (direction !== 'up') direction = 'down';
  195.                 break;
  196.             case 37: // 左
  197.                 if (direction !== 'right') direction = 'left';
  198.                 break;
  199.             case 39: // 右
  200.                 if (direction !== 'left') direction = 'right';
  201.                 break;
  202.         }
  203.     });
  204.     // 绑定开始按钮事件
  205.     $('#startBtn').click(startGame);
  206. });
复制代码
总结

可以直接下载代码到本地,双击index.html文件即可运行查看效果并体验游戏。

来源:https://www.cnblogs.com/enba/p/18565839
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具