我也来写一个贪吃蛇

悠悠洛 悠悠洛     2022-08-13     787

关键词:

  最近工作量好大,好忙,趁周末练练手,花了近3小时写了一个贪吃蛇。

  实现贪吃蛇的功能很简单。

  我就分享一下我实现贪吃蛇看起来在界面上移动并且吃食物长大的原理。

  我建了一个数组list_arr[]来保存贪吃蛇所在的每个格子的id,并建了2个全局变量x和y,监听贪吃蛇头的位置,当然x和y也是贪吃蛇的起始位置。

  那么贪吃蛇移动实际上就是每次从list_arr[]里取出第一个元素(list_arr.shift()方法),取出的第一个元素也可以认为是贪吃蛇的尾巴,然后把这个元素(也就是格子的id)代表的格子的css中的贪吃蛇的样式去掉。然后,把[x, y]这组坐标所代表的格子的id扔进list_arr[]里(list_arr.push()),并给这个格子添加上贪吃蛇的样式。所以实际上每次就操作了2个格子的样式。

  如果贪吃蛇吃食物([x, y]与食物所在坐标相同),那么把食物那个格子的css去掉代表食物的样式并加上贪吃蛇的样式,并且不去掉尾巴,也就是不去掉list_arr[]里的第一个元素所在格子的样式。

  1 <!doctype html>
  2 <head>
  3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4 <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  5 <meta name="format-detection" content="telephone=no">
  6 <meta name="apple-mobile-web-app-capable" content="yes">
  7 <meta name="apple-mobile-web-app-status-bar-style" content="black">
  8 <style>
  9     body {
 10         position: relative;
 11         margin: 0;
 12         width: 100vw;
 13         height: 100vh;
 14     }
 15     .wrapper {
 16         padding: 40px 0;
 17     }
 18     .snake-box {
 19         margin: 0 auto;
 20         border-collapse: collapse; 
 21         border:solid #ddd; 
 22         border-width:1px 0px 0px 1px;
 23     }
 24     .snake-box td {
 25         padding: 10px;
 26         border: solid #ddd; 
 27         border-width: 0px 1px 1px 0px; 
 28     }
 29     .snake-body {
 30         background-color: #8078f3;
 31     }
 32     .food {
 33         background-color: #e81616;
 34     }
 35 </style>
 36 </head>
 37 <body>
 38 <div class="wrapper">
 39     <table id="snake_box" class="snake-box">
 40     </table>
 41 </div>
 42 <script>
 43 //Array扩展indexOf
 44 Array.prototype.indexOf = function(val) {
 45     for (var i = 0; i < this.length; i++) {
 46         if (this[i] == val) return i;
 47     }
 48     return -1;
 49 };
 50 
 51 (function() {
 52     var option = {
 53         ‘width‘: 10,    //x轴数量
 54         ‘height‘: 10,    //y轴数量
 55         ‘cell‘: 10,        //暂时无用
 56         ‘speed‘: 400    //setInterval的执行周期 
 57     }
 58     var o = option;
 59 
 60     var snakeBox = document.getElementById(‘snake_box‘);
 61     snakeBox.innerHTML = null;
 62     var fragment = document.createDocumentFragment();
 63     var snakeBoxArray = new Array();
 64     for (var i = 0; i < o.height; i++) {
 65         var sTr = document.createElement(‘tr‘);
 66         sTr.setAttribute(‘class‘, ‘row‘);
 67         var cellFragment = document.createDocumentFragment();
 68         snakeBoxArray[i]=  new Array(); 
 69         for (var j = 0; j < o.width; j++) {
 70             var sTd = document.createElement(‘td‘);
 71             var sId = j + ‘_‘ + i;
 72             sTd.setAttribute(‘id‘, sId);
 73             sTd.setAttribute(‘class‘, ‘cell‘);
 74             cellFragment.appendChild(sTd);
 75             snakeBoxArray[i][j] = j + ‘_‘ + i;
 76         }
 77         fragment.appendChild(sTr).appendChild(cellFragment);
 78     }
 79     snakeBox.appendChild(fragment);
 80     var x = Math.floor(o.width / 2),
 81         y = Math.floor(o.height / 2),
 82         list_arr = [];  //记录蛇的cell
 83     document.getElementById(snakeBoxArray[x][y]).classList.add(‘snake-body‘);
 84     list_arr.push(x + ‘_‘ + y);
 85 
 86     /*实现键盘方向事件,
 87       注释的代码实现按下方向键立即朝指定方向移动一格,以解决按键后函数的响应延迟问题
 88      */
 89     var lastDir = 39; //记录上一次方向
 90     document.onkeydown = control;
 91     function control(e) {
 92         clearInterval(moveEvent)
 93         var dir;
 94         switch(e.keyCode) {
 95             case 37:  //
 96                 if (list_arr.length > 1 && lastDir == 39) {
 97                     dir = 39;
 98                 } else {
 99                     // x--
100                     lastDir = dir = 37;
101                 }
102                 break;
103             case 38:  //
104                 if (list_arr.length > 1 && lastDir == 40) {
105                     dir = 40;
106                 } else {
107                     // y--;
108                     lastDir = dir = 38;
109                 }
110                 break;
111             case 39:  //
112                 if (list_arr.length > 1 && lastDir == 37) {
113                     dir = 37;
114                 } else {
115                     // x++;
116                     lastDir = dir = 39;
117                 }
118                 break;
119             case 40:  //
120                 dir = lastDir == 38 ? 38 : 40;
121                 if (list_arr.length > 1 && lastDir == 38) {
122                     dir = 38;
123                 } else {
124                     // y++;
125                     lastDir = dir = 40;
126                 }
127                 break;
128         }
129         // var head = list_arr.shift();
130         // list_arr.push(x + ‘_‘ + y)
131         // document.getElementById(head).classList.remove(‘snake-body‘);
132         // document.getElementById(snakeBoxArray[y][x]).classList.add(‘snake-body‘);
133         moveEvent = setInterval(move.bind(this, dir), o.speed)  //移动
134     }
135 
136     /*移动函数*/
137     var moveEvent;
138     function move(direction) {
139         switch(direction) {
140             case 37:  //
141                 x--;
142                 break;
143             case 38:  //
144                 y--;
145                 break;
146             case 39:  //
147                 x++;
148                 break;
149             case 40:  //
150                 y++;
151                 break;
152         }
153 
154         /*死亡判定*/
155          var flag = list_arr.indexOf(x + ‘_‘ + y)
156          if (x < 0 || x >= o.width || y < 0 || y >= o.height || flag != -1) {
157              location.reload();
158          }
159         list_arr.push(x + ‘_‘ + y)
160         if (document.getElementById(snakeBoxArray[y][x]).classList.contains(‘food‘)) {
161             document.getElementById(snakeBoxArray[y][x]).classList.remove(‘food‘);
162             document.getElementById(snakeBoxArray[y][x]).classList.add(‘snake-body‘);
163             food();
164         } else {
165             var tail = list_arr.shift();
166             document.getElementById(tail).classList.remove(‘snake-body‘);
167             document.getElementById(snakeBoxArray[y][x]).classList.add(‘snake-body‘);
168         }    
169     }
170     moveEvent = setInterval(move.bind(this, 39), o.speed)  //加载完成就开始移动
171 
172     /*食物*/
173     var foodCell; //食物位置
174     function food() {
175         var foodX = Math.ceil(Math.random() * o.width) - 1,
176             foodY = Math.ceil(Math.random() * o.height) - 1;
177             foodCell = foodX + ‘_‘ + foodY;
178         if (list_arr.indexOf(foodCell) == -1) {
179             document.getElementById(foodCell).classList.add(‘food‘);
180         } else {
181             return food();
182         }
183     }
184     food();
185 })();    
186 
187 </script>
188 </body>
189 </html>

 

面向对象案例——贪吃蛇游戏(代码片段)

最近项目上线,近一个星期没更博了,今天来写一个经典的游戏案例——贪吃蛇。在这个简单的案例里可以体会javaScript面向对象开发相关模式,学习使用面向对象的方式分析问题。1.功能实现1.1搭建页面:放一个容器盛放游戏场... 查看详情

使用前端原生js,贪吃蛇小游戏

好久好久,真的是好久好久没来写过了,因为最近有点小忙。不过即使是忙,也也还是写了两个小游戏,其中一个就是这个,贪吃蛇啦。算是一个小练手了,这个是在有点太简单了,只是第一次写这种小游戏,还是零零星星花了... 查看详情

数据结构大作业-贪吃蛇

...大作业选择的是贪吃蛇,最初我想了很久到底用什么语言来写贪吃蛇,最后想到java实现图形界面是最方便的,因为JDK里已经有AWT和SWING两个类可以实现图形界面,C语言我会用一个叫easyX的图形库,但是我感觉这个图形库用起来挺... 查看详情

使用vb创建贪吃蛇

    贪吃蛇作为一个经典游戏,在其开发成功后,有很长一段时间令很多人为之振奋,但随着时间的流逝,贪吃蛇也逐渐淡出人们的视野。本次,我利用VB重现贪吃蛇的创建。主要使用到的控件:Label标签,Command按... 查看详情

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏页面结构简单的21x21的方块,页面结构id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div... 查看详情

javascrip写的贪吃蛇

...world一样,简单又有代表性,以前我学习c语言的时候,第一个做的趣味小游戏也是贪吃蛇---------------------------------1//贪吃蛇的食物模块2(function(){3varelements=[]4//创建一个食物的构造函数5functionFood(x,y,width,height,color){6/ 查看详情

贪吃蛇

  无聊发现自己没写过贪吃蛇,于是做了一个简单的贪吃蛇,并不打算做完整版的(只能看到贪吃蛇不断的从上往下移动)。。  效果(截图软件的问题,会有前一帧的印记):  代码:#include<iostream>#include<windows.h... 查看详情

贪吃蛇需求分析

...nbsp;贪吃蛇游戏(单词版)Parttwo选题背景和意义 作为一个经典的游戏,贪吃蛇设计简单,实用和娱乐性高,是90后的我们童年的美好回忆。对于贪吃蛇传统的玩法,大家众所周知,即:玩家通过控制游戏手柄上下左右四个方... 查看详情

gui简单实战——贪吃蛇(代码片段)

将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目项目功能用键盘上下左右实现贪吃蛇的自动移动贪吃蛇吃到食物后,长度加一,分数加一贪吃蛇吃到自己的身体,则游戏结束按空格键实现游戏的暂停和继续效果截... 查看详情

做一个简单的贪吃蛇游戏

这是一个贪吃蛇游戏,你可以忽略他的外表,好了,先上html代码<styletype="text/css"> *{margin:0;padding:0;} #container{width:1000px;height:550px;border:1pxsolid#000;margin:0auto;} #container#ground{width:1000px;height:500px; 查看详情

用代码移动桌面图标(贪吃蛇)(代码片段)

...b站搜电脑病毒的视频看(不要问我为什么会搜这个),看到一个很有意思的"病毒",其实也不算病毒,它会控制桌面图标形成一个人形,并跳舞,跳完之后电脑就蓝屏了.之后下定决心也要整一个,埋头研究了两个星期吧,写了一个贪... 查看详情

自制贪吃蛇游戏中的几个“大坑”(代码片段)

...坷”和“挫折”,下面就几个让我印象深刻的“挫折”做一个具体的讲解,以此来为这个贪吃蛇项目画上一个完整句号。(包括打包这个游戏时遇到的问题及解决方式。)BUG1 在运行贪吃蛇游戏时,如果同时按下两个方向键... 查看详情

华为机试真题c++实现贪吃蛇

目录 题目思路考点Code题目贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。下面让我们来完... 查看详情

java一个简单的贪吃蛇(代码片段)

Java一个简单的贪吃蛇虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数,函数调用,内部类,继承,接口。有助于半初学者强化理解。直接上代码游戏主体类:packagecom.chenghu.snake;importjavax.swing.*;publiccl... 查看详情

华为od机试真题python实现贪吃蛇

目录题目思路考点Code题目贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。下面让我们来完成贪... 查看详情

如何用python写一个贪吃蛇ai(代码片段)

...后华丽丽地把整个矩形填满,真心是看得赏心悦目。作为一个CSer,第一个想到的是,这东西是写程序实现的(因为,一般人干不出这事。果断是要让程序来干的)第二个想到的是,写程序该如 查看详情

100行代码,使用pygame制作一个贪吃蛇小游戏!

...们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了。用到的Pygame函数贪吃蛇小游戏用到的函数功能描述init()初始化pygamedisplay.set_mode()以元组或列表为参数创建窗口update()... 查看详情

《结对-贪吃蛇-设计文档》

...设计文档:搭建环境:AndroidStudio,eclipse“贪吃蛇”游戏是一个经典的游戏,它操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。进行了游戏的... 查看详情