鱼C论坛

 找回密码
 立即注册
查看: 514|回复: 11

[技术交流] 新春版贪吃蛇大冒险!祝你蛇年大吉!

[复制链接]
回帖奖励 32 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 2 次(中奖概率 90%)
发表于 2025-2-7 19:13:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 中英文泡椒 于 2025-2-26 18:32 编辑

贪吃蛇大家都玩过,新春版贪吃蛇大家体验过吗

项目介绍

贪吃蛇.png

传统贪吃蛇游戏玩家通过控制蛇的移动方向来吃食物,食物越多,蛇的长度越长。

游戏的目标是尽可能获得更高的分数,而我们的新春版贪吃蛇,

通过调用 placeFood 方法,生成随机位置的食物并从 fishc 字符串中取出一个汉字作为食物的字符。

每次蛇吃到食物时,从这个字符串中取出一个汉字并显示在蛇的身体上。

恭喜.png

这不仅是一款经典的贪吃蛇游戏,还能通过在一步步吃的过程中,把祝福吃下去,

寓意“贪吃蛇”在吞噬的过程中积攒好运,祝大家新的一年好运满满


完整代码

  1. <!DOCTYPE html>
  2. <html lang="zh">

  3. <head>
  4.     <meta charset="UTF-8" />
  5.     <title>贪吃蛇</title>
  6.     <style>
  7.         body {
  8.             text-align: center;
  9.             margin-top: 50px;
  10.             font-family: Arial, sans-serif;
  11.         }

  12.         #gameCanvas {
  13.             border: 2px solid #333;
  14.             background-color: #fafafa;
  15.             display: block;
  16.             margin: 0 auto;
  17.         }

  18.         #score {
  19.             font-size: 1.2em;
  20.             margin-bottom: 10px;
  21.         }
  22.     </style>
  23. </head>

  24. <body>
  25.     <h1>贪吃蛇</h1>
  26.     <div id="score">得分:<span id="scoreValue">0</span></div>
  27.     <canvas id="gameCanvas" width="400" height="400"></canvas>

  28.     <script>
  29.         // 1. 获取画布和上下文
  30.         const canvas = document.getElementById('gameCanvas');
  31.         const ctx = canvas.getContext('2d');
  32.         const scoreValue = document.getElementById('scoreValue');

  33.         // 2. 基本参数
  34.         const gridSize = 20;                     // 每格像素
  35.         const tileCount = canvas.width / gridSize;
  36.         let score = 0;
  37.         let gameOver = false;

  38.         // 3. 包含汉字的字符串
  39.         const fishc = "恭贺新春大吉大利蛇年发大财";
  40.         let fishcIndex = 0;   // 用于依次取汉字

  41.         // 4. 蛇的初始状态(数组第0项是蛇头)
  42.         //    蛇的每个身体段仅存坐标 (x, y),不存汉字
  43.         //    汉字将统一保存在 eatenChars 里,按吃到的先后顺序排列
  44.         let snake = [
  45.             { x: 10, y: 10 }  // 仅有一个头部,坐标可自行调整
  46.         ];

  47.         // 5. 用于存储“吃到的汉字”的数组
  48.         //    eatenChars[0] 表示最早吃到的汉字,eatenChars[1] 表示第二次吃到的汉字...
  49.         let eatenChars = [];

  50.         // 6. 食物对象(带有汉字)
  51.         let food = { x: 0, y: 0, char: '' };

  52.         // 7. 初始方向:向右(dx=1, dy=0)
  53.         let dx = 1;
  54.         let dy = 0;

  55.         // 8. 放置食物 + 取汉字
  56.         function placeFood() {
  57.             food.x = Math.floor(Math.random() * tileCount);
  58.             food.y = Math.floor(Math.random() * tileCount);
  59.             food.char = fishc[fishcIndex];
  60.             fishcIndex = (fishcIndex + 1) % fishc.length; // 循环取
  61.         }
  62.         placeFood(); // 游戏开始先放一次食物

  63.         // 9. 游戏主循环
  64.         function gameLoop() {
  65.             if (gameOver) return;
  66.             update();
  67.             draw();
  68.         }

  69.         // 10. 更新
  70.         function update() {
  71.             // 先计算新头部坐标
  72.             const newHead = {
  73.                 x: snake[0].x + dx,
  74.                 y: snake[0].y + dy
  75.             };

  76.             // (1) 撞墙检测
  77.             if (newHead.x < 0 || newHead.x >= tileCount ||
  78.                 newHead.y < 0 || newHead.y >= tileCount) {
  79.                 endGame();
  80.                 return;
  81.             }

  82.             // (2) 撞到自己
  83.             for (let i = 0; i < snake.length; i++) {
  84.                 if (snake[i].x === newHead.x && snake[i].y === newHead.y) {
  85.                     endGame();
  86.                     return;
  87.                 }
  88.             }

  89.             // (3) 在头部插入新头
  90.             snake.unshift(newHead);

  91.             // (4) 判断是否吃到食物
  92.             if (newHead.x === food.x && newHead.y === food.y) {
  93.                 // 吃到后分数加1,且“蛇长度+1”(本回合不 pop)
  94.                 score++;
  95.                 scoreValue.textContent = score;

  96.                 // 将本次食物的汉字加入到 eatenChars 的“队尾”
  97.                 // 表示这是最新吃到的汉字
  98.                 eatenChars.push(food.char);

  99.                 // 生成下一个食物
  100.                 placeFood();
  101.             } else {
  102.                 // 没吃到,就移除尾巴(保持长度不变)
  103.                 snake.pop();
  104.             }
  105.         }

  106.         // 11. 结束游戏
  107.         function endGame() {
  108.             gameOver = true;
  109.             alert(`游戏结束!得分:${score}`);
  110.         }

  111.         // 12. 绘制
  112.         function draw() {
  113.             // 清空画布
  114.             ctx.clearRect(0, 0, canvas.width, canvas.height);

  115.             // 设置绘制文字属性
  116.             ctx.font = "16px sans-serif";
  117.             ctx.textBaseline = "top";

  118.             // (A) 先画蛇
  119.             //     snake[0] 是头部,不显示汉字
  120.             //     snake[1] ~ snake[n-1] 依次显示 eatenChars[0] ~ eatenChars[n-2]
  121.             //     即:第一个吃到的汉字放在蛇的第1节位置,第二个吃到的放第2节位置……
  122.             for (let i = 0; i < snake.length; i++) {
  123.                 // 画身体方块
  124.                 ctx.fillStyle = "#008000"; // 绿色
  125.                 ctx.fillRect(
  126.                     snake[i].x * gridSize,
  127.                     snake[i].y * gridSize,
  128.                     gridSize,
  129.                     gridSize
  130.                 );

  131.                 // 从第1节开始,若存在对应的 eatenChars[i-1] 则显示
  132.                 if (i > 0) {
  133.                     // i-1 对应 eatenChars 的下标
  134.                     let charIndex = i - 1;
  135.                     if (charIndex < eatenChars.length) {
  136.                         ctx.fillStyle = "#FFFFFF"; // 白色文字
  137.                         ctx.fillText(
  138.                             eatenChars[charIndex],
  139.                             snake[i].x * gridSize + 2,
  140.                             snake[i].y * gridSize + 2
  141.                         );
  142.                     }
  143.                 }
  144.             }

  145.             // (B) 再画食物:红底黑字
  146.             ctx.fillStyle = "#FF0000";
  147.             ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize);
  148.             ctx.fillStyle = "#000000";
  149.             ctx.fillText(
  150.                 food.char,
  151.                 food.x * gridSize + 2,
  152.                 food.y * gridSize + 2
  153.             );
  154.         }

  155.         // 13. 方向键控制
  156.         document.addEventListener('keydown', function (e) {
  157.             switch (e.key) {
  158.                 case 'ArrowLeft':
  159.                     if (dx !== 1) {
  160.                         dx = -1;
  161.                         dy = 0;
  162.                     }
  163.                     break;
  164.                 case 'ArrowUp':
  165.                     if (dy !== 1) {
  166.                         dx = 0;
  167.                         dy = -1;
  168.                     }
  169.                     break;
  170.                 case 'ArrowRight':
  171.                     if (dx !== -1) {
  172.                         dx = 1;
  173.                         dy = 0;
  174.                     }
  175.                     break;
  176.                 case 'ArrowDown':
  177.                     if (dy !== -1) {
  178.                         dx = 0;
  179.                         dy = 1;
  180.                     }
  181.                     break;
  182.             }
  183.         });

  184.         // 14. 启动游戏循环
  185.         setInterval(gameLoop, 120);
  186.     </script>
  187. </body>

  188. </html>
复制代码


大家有改进的建议可以评论一下,求评分



@cjjJasonchen @yinda_peng @python爱好者. @鱼小二 @学习编程中的Ben @唯有无奈 @sfqxx @小凯2013 @KeyError @元豪

评分

参与人数 5荣誉 +17 鱼币 +12 贡献 +13 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^
sfqxx + 5 + 3 吞噬改为积攒
smallwh + 3 + 3 + 3 鱼C有你更精彩^_^
鱼小二 + 2 + 2 + 2 感谢楼主无私奉献!
小甲鱼的二师兄 + 2 + 2 + 2 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-10 19:12:28 | 显示全部楼层

回帖奖励 +1 鱼币

这个不错!顶上去!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-12 00:10:23 | 显示全部楼层

回帖奖励 +1 鱼币

寓意“贪吃蛇”逐渐吞噬好运,寓意“越吃越有福气”。

应该改为“积攒”好运
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-12 09:03:07 | 显示全部楼层

回帖奖励 +1 鱼币

这个不错!顶上去!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-12 09:23:58 | 显示全部楼层
鱼小二 发表于 2025-2-12 00:10
应该改为“积攒”好运

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-13 11:27:45 | 显示全部楼层

回帖奖励 +1 鱼币

挺有意思的,顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-16 21:35:58 | 显示全部楼层

回帖奖励 +1 鱼币

好欸
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-17 19:28:57 | 显示全部楼层

回帖奖励 +1 鱼币


还没改,快点改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-22 09:54:21 | 显示全部楼层

回帖奖励 +1 鱼币

支持
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-3-6 11:10:08 | 显示全部楼层
学习python中,希望自己也能早日做到这样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 16:37 | 显示全部楼层

回帖奖励 +1 鱼币

非常不错!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 17:14 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 07:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表