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

引言

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

痛苦

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

结语

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

相关推荐
y先森3 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy3 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189113 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿4 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡5 小时前
commitlint校验git提交信息
前端
emmm4595 小时前
html兼容性问题处理
html
虾球xz5 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇5 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒6 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员6 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js