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

引言

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

痛苦

作为后端开发者,我平时主要负责处理服务器端的逻辑和数据,但是为了让游戏更加生动有趣,我也尝试着写一些前端代码。通过学习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>

结语

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

相关推荐
熊的猫9 分钟前
webpack 核心模块 — loader & plugins
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
速盾cdn16 分钟前
速盾:vue的cdn是干嘛的?
服务器·前端·网络
四喜花露水1 小时前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
前端Hardy1 小时前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
web Rookie1 小时前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust2 小时前
css:基础
前端·css
帅帅哥的兜兜2 小时前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
yi碗汤园2 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
就是个名称2 小时前
购物车-多元素组合动画css
前端·css
编程一生2 小时前
回调数据丢了?
运维·服务器·前端