>  기사  >  웹 프론트엔드  >  js를 사용하여 뱀 게임을 구현하는 코드

js를 사용하여 뱀 게임을 구현하는 코드

不言
不言원래의
2018-07-14 16:12:382628검색

이 글은 주로 스네이크 게임을 구현하기 위해 js를 사용하는 코드를 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다. 라인 일반(700바이트)

가장 짧은 스네이크 game.html압축 500바이트 (물론 두 문서는 여전히 eval로 압축 가능)index .5 00바이트 .html이전에 매우 인기가 많았습니다hj7jay/article/details/51011269

20

라인 코드 주소(BUG 포함)(900바이트)

1차원 배열 🎜🎜#(0,0) 위치의 뱀 몸체는 0으로 표현되고, (0,1)은 1로 표현되고, (1,0)은 10으로 표현되는 식으로

#🎜 🎜#왜냐면 그냥13行js,

4#🎜🎜 #行

#🎜🎜 #은 진술입니다

Line 5 은 이해하기 어렵습니다. 연산자를 if 문으로 4줄로 나누세요. 아래의 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 = &#39;#0&#39;+(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 = &#39;#0&#39;+~~((food===i)*13000*Math.random())+~~(snk.includes(i)*3000*Math.random())
        ctx.fillRect(i%10*40,(i-i%10)*4, 40,40)
    }
},120)
</script>
Instructions

원한다면 직접 작성해 보세요:

예 두 가지 점에 주의하세요

꼬리의 꼬리 뱀은 뱀의 머리보다 먼저 사라져야 한다

, 뱀 머리는 음식보다 먼저 생성되어야 한다

, 뱀은 걷지 못한다

    current
  1. 반대 방향#🎜 🎜#4# 🎜🎜#의 테스트용 뱀

  2. 의 길이로 사용할 수 있습니다.
  3. 코드 스타일# 🎜🎜# 불필요한 태그 저장

    # 🎜🎜#https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags if()는 하나만 반환합니다. 라인

https://google.github .io/styleguide/cppguide.html

    #🎜 🎜#
  1. 키보드 응답 외에

    3 연산자를 사용할 수 있습니다. 3

    줄 외에는

    을 사용할 필요가 없습니다.

    위 내용은 모두 1차원 배열을 사용하여 구현하였고, 다음은 2차원 배열을 사용하여 작성하였으며, 단순화를 원할 경우 17줄 이내로 단순화할 수 있습니다.
  2. 900
  3. 문자 내(20줄보다 짧을 뿐)이지만 필요하지 않습니다. 🎜#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 = {&#39;0,0&#39;:&#39;#52a&#39;, &#39;1,0&#39;:&#39;#52a&#39;} //用来记录绘图颜色的 地图
        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()]=&#39;#fff&#39; //必须先删尾巴,才能加入头部,吃没吃到食物是唯一判断标准
            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] = &#39;#52a&#39; ; Map[food] = &#39;#ad5&#39;
            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>
    #🎜🎜 #

    색상(

  4. 주로 비교 잘생김
  5. )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 = {&#39;0,0&#39;:&#39;fff&#39;, &#39;1,0&#39;:&#39;fff&#39;}
        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()]=&#39;0&#39;
            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] = &#39;fff&#39;
            for( k in Map){
                ctx.fillStyle=&#39;#&#39;+(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 중국어 웹사이트!
관련 추천:

JavaScript에서 파일 다운로드 기능을 구현하는 방법

JavaScript에서 HTTP 요청을 하는 방법을 사용하세요

위 내용은 js를 사용하여 뱀 게임을 구현하는 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.