使用js实现贪吃蛇游戏的代码
这篇文章主要介绍了关于使用js实现贪吃蛇游戏的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
13行常规(700bytes) |
shortest snake game.html |
压缩后的500bytes(当然两处document还是可以用eval压缩的) |
index.500bytes.html |
之前很火的20行代码地址(有BUG)(900bytes) |
hj7jay/article/details/51011269 |
一维数组700char
(0,0)位置的蛇身用0表示,(0,1)用1,(1,0)用10表示,以此类推
因为就13行js,
第4行 是声明
第5行 比较难理解,可以把?:运算符,拆分为4行if语句;可以参考下面的 二维数组 的版本
第9行 0|x 和 ~~x 和 x>>0 都能去除x(number)的尾数
应该算易读了
<!DOCTYPE html> <canvas id="1" width="400" height="400"></canvas> <script> let dir=1,food=3,snk=[1,0],ctx=document.getElementById("1").getContext("2d") document.onkeydown=e=>{dir = snk[0]-snk[1]==-(tmp = [-1,-10,1,10][e.keyCode-37]||dir)?dir:tmp } setInterval(()=>{ snk.unshift(Head = snk[0] + dir) if(Head!=food) snk.pop() else while(snk.includes(food=0|Math.random()*10*10)) ; if(snk.indexOf(Head,1)!=-1||(dir==1&&Head%10==0)||(dir==-1&&Head%10==9)||Head<0||Head>=100) return document.write(0&snk.shift()) //死亡记录蛇长 for(let i=0; i<100; i++){ ctx.fillStyle = '#0'+(food==i)*9910+snk.includes(i)*1990 ctx.fillRect(i%10*40,(i-i%10)*4, 40,40) } },100) </script>
颜色效果
<!DOCTYPE html> <canvas id="1" width="400" height="400"></canvas> <script> let dir=1,food=3,snk=[1,0],n_=0, ctx=document.getElementById("1").getContext("2d") document.onkeydown=e=>{ dir =snk[0]-snk[1]==-(tmp = [-1,-10,1,10][e.keyCode-37]||dir)?dir:tmp } setInterval(()=>{ snk.unshift(Head = snk[0] + dir) if(Head!=food) snk.pop() else while(snk.includes(food=0|Math.random()*10*10)) ; if(snk.indexOf(Head,1)!=-1||(dir==1&&Head%10==0)||(dir==-1&&Head%10==9)||Head<0||Head>=100) return alert("died"+ ++n_+"times") //死亡记录死亡次数 for(let i=0 ; i<100; i++){ ctx.fillStyle = '#0'+~~((food===i)*13000*Math.random())+~~(snk.includes(i)*3000*Math.random()) ctx.fillRect(i%10*40,(i-i%10)*4, 40,40) } },120) </script>
说明
如果自己要写的话:要注意两点
蛇尾应该比蛇头先消失,蛇头应该比食物先生成,
蛇不能走当前相反的方向
可以用长度为4的蛇进行测试
代码风格
省去没必要的标签
https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags
if() return只用一行
https://google.github.io/styleguide/cppguide.html
除了键盘响应那里用3目运算符能省3行之外,其他地方都没必要用
二维数组
以上的都是用一维数组实现的,下面的用二维数组写;要简化也能简化到17行以内900char以内(比20行的那个短就是了),不过没有必要
带注释的1100char
<!DOCTYPE html> <canvas id="1" width="400" height="400" style="border: 1px solid "></canvas> <script> ctx = document.getElementById("1").getContext("2d") //CanvasRenderingContext2D inferface let Len = 10, dir = 2, dirNow ; //dirNow 后面解释 food = [3, 0]; Snake = [[0, 0], [1, 0]] //食物的坐标,蛇身的坐标用Snake数组记录 Map = {'0,0':'#52a', '1,0':'#52a'} //用来记录绘图颜色的 地图 dirMat = [[-1, 0], [0, -1], [1, 0], [0, 1]] //方向矩阵 pairEq = ((p1, p2) => p1[0] == p2[0] && p1[1] == p2[1]) //检测 两数对 是否相等的函数 document.onkeydown = e =>{ if (37 <= e.keyCode == e.keyCode < 41 && dirNow != ( (e.keyCode - 35) % 4) ) //确定是 方向键 并且 保证方向与当前运动方向相反 dir = e.keyCode -37 } !function () { Head = Snake[Snake.length-1].map((x, i) => x + dirMat[dirNow=dir][i]); //得到头部接下来的移动位置 if (!pairEq(Head, food)) Map[Snake.shift()]='#fff' //必须先删尾巴,才能加入头部,吃没吃到食物是唯一判断标准 if (Snake.some(x=>pairEq(x,Head)) || !Head.every(x => 0<=x == x < Len)) //判断蛇头是否撞到蛇身或墙壁 return document.write("Game Over") //这样调用document.write会把页面全部清空 Snake.push(Head); //可以加入头部 while (Snake.some(x => pairEq(x, food))) //加入新头后, 生成食物更方便 food = [~~(Math.random() * Len), ~~(Math.random() * Len)]; //因为js没有整形的概念, ~~ 现在相当于向原点舍去 Map[Head] = '#52a' ; Map[food] = '#ad5' for( k in Map){ ctx.fillStyle= Map[k] ctx.fillRect(parseInt(k[0])*40,parseInt(k[2])*40,40,40) //e.g. k="1,3",也因此地图大小限制为10 } setTimeout(arguments.callee, 100); //100ms后调用此函数一次 }() </script>
七彩的(主要是比较好看)1100char
<!DOCTYPE html> <canvas id="1" width="400" height="400" style="border: 1px solid " ></canvas> <script> ctx = document.getElementById("1").getContext("2d") let Len = 10, dir = 2, dirNow ; food = [3, 0]; Snake = [[0, 0], [1, 0]] Map = {'0,0':'fff', '1,0':'fff'} dirMat = [[-1, 0], [0, -1], [1, 0], [0, 1]] pairEq = ((p1, p2) => p1[0] == p2[0] && p1[1] == p2[1]) document.onkeydown = e =>{ if (37 <= e.keyCode == e.keyCode < 41 && dirNow != ( (e.keyCode - 35) % 4) ) dir = e.keyCode -37 } !function () { Head = Snake[Snake.length-1].map((x, i) => x + dirMat[dirNow=dir][i]); if (!pairEq(Head, food)) Map[Snake.shift()]='0' if (Snake.some(x=>pairEq(x,Head)) || !Head.every(x => 0<=x == x < Len)) return document.write("Game Over") Snake.push(Head); while (Snake.some(x => pairEq(x, food))) food = [~~(Math.random() * Len), ~~(Math.random() * Len)]; Map[Head] = Map[food] = 'fff' for( k in Map){ ctx.fillStyle='#'+(0xfff-~~(parseInt(Map[k],16)*Math.random())).toString(16) ctx.fillRect(parseInt(k[0])*40,parseInt(k[2])*40,46,43) } setTimeout(arguments.callee, 100); }() </script>
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Atas ialah kandungan terperinci 使用js实现贪吃蛇游戏的代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Soalan dan penyelesaian yang sering ditanya untuk percetakan tiket kertas terma depan dalam pembangunan front-end, percetakan tiket adalah keperluan umum. Walau bagaimanapun, banyak pemaju sedang melaksanakan ...

Artikel ini membincangkan debugging JavaScript yang berkesan menggunakan alat pemaju pelayar, memberi tumpuan kepada menetapkan titik putus, menggunakan konsol, dan menganalisis prestasi.

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Artikel ini menerangkan cara menggunakan peta sumber untuk debug JavaScript minifikasi dengan memetakannya kembali ke kod asal. Ia membincangkan membolehkan peta sumber, menetapkan titik putus, dan menggunakan alat seperti Chrome Devtools dan Webpack.

Perbincangan mendalam mengenai punca-punca utama perbezaan dalam output konsol.log. Artikel ini akan menganalisis perbezaan hasil output fungsi Console.log dalam sekeping kod dan menerangkan sebab -sebab di belakangnya. � ...

Sebaik sahaja anda telah menguasai tutorial TypeScript peringkat kemasukan, anda harus dapat menulis kod anda sendiri dalam IDE yang menyokong TypeScript dan menyusunnya ke dalam JavaScript. Tutorial ini akan menyelam ke dalam pelbagai jenis data dalam TypeScript. JavaScript mempunyai tujuh jenis data: null, undefined, boolean, nombor, rentetan, simbol (diperkenalkan oleh ES6) dan objek. Typescript mentakrifkan lebih banyak jenis atas dasar ini, dan tutorial ini akan meliputi semuanya secara terperinci. Jenis data null Seperti JavaScript, Null dalam TypeScript
