兔子吃月饼,探索前端技术与中秋节的奇妙结合

引言

中秋节,是中国传统的重要节日之一,也是家人团聚、共享美食的时刻。而作为一名后端开发者,我在这个特殊的节日里,尝试着用技术的力量创造出一款贪吃蛇游戏,以兔子吃月饼的形式,让大家在游戏中感受中秋的喜庆氛围。

痛苦

作为后端开发者,我平时主要负责处理服务器端的逻辑和数据,但是为了让游戏更加生动有趣,我也尝试着写一些前端代码。通过学习HTML和CSS等前端技术,我可以将自己的创意和想法转化为生动的网页。在编写HTML代码时,我学会了使用不同的标签和属性来构建网页的结构和内容,通过CSS样式的调整,我可以为网页增添美观和吸引力。然而,在写前端代码的过程中,我发现了一个问题,那就是CSS样式的调整十分困难。作为一个后端开发者,我对前端的了解并不深入,因此在调整样式的时候遇到了不少困难。不过,我并没有放弃,通过学习和查找相关资料,我逐渐解决了其中的问题,并且为游戏添加了一些简单但有趣的动画效果,使得兔子吃月饼的过程更加生动。

在游戏开发的过程中,我还遇到了一个问题,那就是寻找合适的免费矢量图片。很多网站都收费保护版权,对于我这样的非商业用途来说,这显然是不适用的。经过一番搜索,我终于找到了一些免费的兔子图片和月饼图片,虽然数量有限,但已足够满足我游戏的需求。在此特别声明,如果我使用的图片有侵权行为,请及时联系我,我会立即删除。

除了尝试调整CSS样式和寻找免费矢量图片外,我还尝试了使用区域录屏软件来录制游戏的效果图。这样可以更好地展示游戏的特点和动画效果。虽然初次使用这些软件有一些困难,但通过学习和实践,我成功录制了一些令人满意的效果图。

另外,我还尝试了使用码上掘金这个功能来分享我的代码和经验。然而,由于对这个功能不太熟悉,我遇到了一些困难。不过,我相信随着继续学习和实践,我会逐渐掌握这个功能,并能够更好地与其他开发者交流和分享我的经验。

成果

通过这个小小的游戏开发过程,我深刻体会到了技术的无限魅力。技术不仅仅是一种工具,更是一种创造力的表达方式。正是通过技术,我才能将中秋节的喜庆氛围与游戏相结合,带给大家一份独特的体验。

虽然实现的效果看起来很low,但实际上是因为我的前端能力有限。但是这并不让我气馁,相反,它激发了我不断学习和提升自己的动力。

代码

js样式如下:

ini 复制代码
document.addEventListener('DOMContentLoaded', () => {  
    const board = document.getElementById('game-board');  
    const gridSize = 45;  
    const boardSize = 400;  
    const snakeSize = 20;  
    const snakeSpeed = 900;  
    let snake = [{ x: 0, y: 0 }];  
    let direction = 'right';  
    let food = generateFood();  
    
    setInterval(moveSnake, snakeSpeed);  
    document.addEventListener('keydown', changeDirection);  
    
    function moveSnake() {  
      const head = Object.assign({}, snake[0]);  
    
      switch (direction) {  
        case 'right':  
          head.x += gridSize;  
          break;  
        case 'left':  
          head.x -= gridSize;  
          break;  
        case 'up':  
          head.y -= gridSize;  
          break;  
        case 'down':  
          head.y += gridSize;  
          break;  
      }  
    
      snake.unshift(head);  
      if (head.x === food.x && head.y === food.y) {  
        food = generateFood();  
      } else {  
        snake.pop();  
      }  
    
      renderSnake();  
      renderFood();  
    }  
    
    // function renderSnake() {  
    //   const snakeElements = document.getElementsByClassName('snake');  
    //   while (snakeElements.length > 0) {  
    //     snakeElements[0].parentNode.removeChild(snakeElements[0]);  
    //   }  
    //   snake.forEach((segment, index) => {  
    //     const element = document.createElement('div');  
    //     if(index ==0){
    //     element.className = 'rabbit';  
    //     element.style.left = segment.x + 'px';  
    //     element.style.top = segment.y + 'px';  
    //     board.appendChild(element);  
    //     }else{
    //         element.className = 'food';  
    //         element.style.left = segment.x + 'px';  
    //         element.style.top = segment.y + 'px';  
    //         board.appendChild(element);  
    //     }
    //   });  
       
    // }  
    
    function renderSnake() {  
        const snakeElements = document.getElementsByClassName('foods');  
        while (snakeElements.length > 0) {  
          snakeElements[0].parentNode.removeChild(snakeElements[0]);  
        }  
        const rabbitElements = document.getElementsByClassName('rabbit');  
        while (rabbitElements.length > 0) {  
            rabbitElements[0].parentNode.removeChild(rabbitElements[0]);  
        } 
        snake.forEach((segment, index) => {  
          const element = document.createElement('div');  
          if(index == 0){
                element.className = 'rabbit';  
            }else{
                element.className = 'foods';  
            }
          element.style.left = segment.x + 'px';  
          element.style.top = segment.y + 'px';  
          board.appendChild(element);  
        });  
      }  

    function renderFood() {  
      const foodElement = document.getElementsByClassName('food');  
      while (foodElement.length > 0) {  
        foodElement[0].parentNode.removeChild(foodElement[0]);  
      }  
      const element = document.createElement('div');  
      element.className = 'food';  
      element.style.left = food.x + 'px';  
      element.style.top = food.y + 'px';  
      board.appendChild(element);  
    }  
    
    function generateFood() {  
      const x = Math.floor(Math.random() * (boardSize / gridSize)) * gridSize;  
      const y = Math.floor(Math.random() * (boardSize / gridSize)) * gridSize;  
      return { x, y };  
    }  
    function changeDirection(event) {  
        switch (event.keyCode) {  
          case 37: // Left arrow key pressed.  
            if (direction !== 'right') { direction = 'left'; } break; // Only allow left if not moving right. (Prevents reverse direction.)   
          case 39: // Right arrow key pressed.  
            if (direction !== 'left') { direction = 'right'; } break; // Only allow right if not moving left. (Prevents reverse direction.)   
          case 38: // Up arrow key pressed.  
            if (direction !== 'down') { direction = 'up'; } break; // Only allow up if not moving down. (Prevents reverse direction.)   
          case 40: // Down arrow key pressed.  
            if (direction !== 'up') { direction = 'down'; } break; // Only allow down if not moving up. (Prevents reverse direction.)   
          default: break; // Do nothing if the key pressed isn't an arrow key.   
        }  
      }
});

html如下:

xml 复制代码
<!DOCTYPE html>  
<html>  
<head>  
  <title>贪吃蛇游戏</title>  
  <style>  
    #game-board {  
      width: 600px;  
      height: 600px;  
      border: 1px solid #000;  
      position: relative;  
      background-image: url('board.png');  
      z-index: -1;
    }  
  
    .snake {  
      width: 20px;  
      height: 20px;  
      background-color: #000;  
      position: absolute;  
    }  

    .rabbit {  
      width: 50px;  
      height: 50px;  
      background-image: url('th.jpg');  
      background-size: cover; 
      /* background-color: #000;   */
      position: absolute;  
    }  
  
 .food {  
  width: 50px;  
  height: 50px;  
  background-image: url('food.png');  
  background-size: cover; 
  position: absolute;  
}  

.foods {  
  width: 50px;  
  height: 50px;  
  background-image: url('food.png');  
  background-size: cover; 
  position: absolute;  
}  
  </style>  
</head>  
<body>  
  <div id="game-board"></div>  
  <script src="snake.js"></script>  
</body>  
</html>

结语

我意识到无论是前端还是后端,每个人都有自己独特的技能和见解,我们可以互相学习和启发。我深深地被技术的魅力和无限潜力所吸引,我相信,只要保持学习和努力,我们可以创造出更多有趣和有意义的作品。

相关推荐
jay神14 分钟前
基于 YOLOv8 的轴承缺陷检测(Web 版)
前端·人工智能·yolo
jay神22 分钟前
基于 YOLOv8 的森林火灾检测系统(Web 版)
前端·yolo
code2cat26 分钟前
HTML基础篇之第一张网页:从index.html到浏览器里的任务清单
前端·html
miss1 小时前
AI 改完不敢上线?OpenSpec 规约驱动开发实战
前端·代码规范·前端工程化
AiMan2 小时前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真2 小时前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment2 小时前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan2 小时前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端
总要学点什么2 小时前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
上海懒图科技3 小时前
工厂厂区电子地图定位导航:厂区人车精准定位,安全合规双保障
前端·arcgis·vue