這篇文章主要介紹了關於使用js實現貪吃蛇遊戲的程式碼,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
#13 |
|
#shortest snake game.html |
壓縮後的500bytes(當然兩處document還是可以用eval壓縮的) |
index.500bytes.html |
#之前很夯的 20行程式碼位址(有BUG)(900bytes) |
一維數組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中文網!
相關推薦:
以上是使用js實現貪吃蛇遊戲的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!