hj7jay/article/details/51011269
一次元配列700char
(0,0)の位置にあるヘビ本体は0で表され、(0,1)は1で表され、(1,0)は10 などで表されます。
js は 13 行しかないので、
4 行目 5 行目 は理解するのが難しいです。 ?: 演算子を 4 行の if ステートメントに分割できます。以下の 2 次元配列バージョンを参照できます 9 行目0 |x と ~~x および x>>0 は x の仮数を削除できます。 (数字)は簡単です <!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> の説明を読んでください
自分で書きたい場合 :2つの点に注意してください ヘビの尾はヘビの頭より先に消えるはずです
- 、
ヘビの頭は食べ物の前に生成されるべきです、 ヘビは歩くことができません
- 流れ
が逆方向に の長さのヘビでテストできます
コードスタイル
不要なタグを保存します
- https://google.github.io/styleguide/ htmlcssガイド.html#Optional_Tags
if() は 1 行だけを返します
- https://google.github.io/styleguide/cppguide.html
3 オブジェクト演算子は 3- 行を保存できます。他の場所で使用する必要はありません
二次元配列
上記はすべて 1 次元配列で実装されており、以下は2 次元配列で記述します。簡素化したい場合は、17 行未満に簡略化できます900 文字 (20 行のものより) ほんの短い) ですが、その必要はありません
1100 char<!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> Colorful( 主に見た目が良くなるから)1100 char<!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 中国語 Web サイトに注目してください。 関連するおすすめ: JavaScriptでファイルダウンロード機能を実装する方法
JavaScriptでHTTPリクエストを行う方法を使用する
|