3

i have written a snake program using javascript.. the problem is that the snake does not grow more than 2 blocks size....

<html>
<head>
<script type="text/javascript">

var matrix, body, dir, key, lastx, lasty, start, applex, appley, eat, hal;


function node(x, y) {
    this.x = x;
    this.y = y;
}


function draw() {
    var str;
    for (var i = 0; i < body.length; i++) {
        matrix[body[i].x * 50 + body[i].y].bgColor = "black";
    }

}


function halt() {
    hal = 1 - hal;
    if (hal == 0) automove();
}


function check_status() {
    if (start == 1 && hal == 0) {

        var ch;
        if (eat == 1) {
            do {
                ch = 0;
                applex = Math.round(49 * Math.random());
                appley = Math.round(49 * Math.random());
                for (var i = 0; i < body.length; i++)
                if (body[i].x == applex && body[i].x == appley) ch = 1;
            } while (ch == 1);


            matrix[applex * 50 + appley].bgColor = "blue";
            eat = 0;
        }



        lastx = body[body.length - 1].x;
        lasty = body[body.length - 1].y;
        for (var i = 1; i < body.length; i++) {
            body[i].x = body[i - 1].x;
            body[i].y = body[i - 1].y;
        }


        if (dir == 1)--body[0].x;
        else if (dir == -1)++body[0].x;
        else if (dir == 2)--body[0].y;
        else if (dir == -2)++body[0].y;

        if (body[0].x == -1 || body[0].x == 50 || body[0].y == 50 || body[0].y == -1) {
            alert("GAME OVER!!");
            start = 0;
        }


        for (var i = 1; i < body.length; i++) {
            if (body[0].x == body[i].x && body[0].y == body[i].y) {
                alert("GAME OVER!!");
                start = 0;
                i = 10000;
            }
        }


        if (body[0].x == applex && appley == body[0].y) {
            eat = 1;
            body[body.length] = new node(lastx, lasty);
        }
        matrix[lastx * 50 + lasty].bgColor = "white";
        draw();
    }
}



function automove() {
    if (start == 1 && hal == 0) {
        if (key != -dir) dir = key;
        check_status();
        window.setTimeout("automove()", 200);
    }
}


function init() {
    start = 1;
    var x = document.getElementById("mine");
    var str = "<table id='tab' align='center' height='500px' cellSpacing='0' cellPadding='0' width='500px' border='4' >";


    for (var i = 0; i < 50; i++) {
        str += "<tr>";
        for (var j = 0; j < 50; j++)
        str += "<td></td>";
        str += "</tr>";
    }
    str += "</table>";
    x.innerHTML = str;


    matrix = document.getElementsByTagName("td");
    body = new Array();
    body[0] = new node(0, 0);
    draw();
    dir = key = -1;

    eat = 1;
    v = 0;
    hal = 0;
    automove();
}


function keypress(e) {
    if ((e.keyCode == 38) || ((e.which) && (e.which == 38))) //up
    key = 1;
    else if ((e.keyCode == 40) || ((e.which) && (e.which == 40))) //down
    key = -1;
    else if ((e.keyCode == 37) || ((e.which) && (e.which == 37))) //left
    key = 2;
    else if ((e.keyCode == 39) || ((e.which) && (e.which == 39))) //right
    key = -2;
    check_status();
}

</script>
</head>
<body onkeydown=keypress(event)>
<br/>
<input type="button" onClick="init()" value="play">
<input type="button" onClick="halt()" value="pause">
<p id="mine"></p>
<br><h5 id="score"></h5>
</body>
</html>
3
  • I don't fancy deciphering that. Please can you indent it (+ 4 spaces before each line)? Commented Aug 1, 2010 at 15:19
  • 1
    You should get into the practice of adding comments to your code as and when you write it. Code such as this (involving lot of maths) can quickly become confusing even to its original author. Commented Aug 1, 2010 at 15:25
  • 1
    jsbeautifier.org to the rescue! Commented Aug 1, 2010 at 15:29

1 Answer 1

6

The problem is here:

lastx=body[body.length-1].x;
lasty=body[body.length-1].y;
for(var i=1;i<body.length;i++)
{
    body[i].x=body[i-1].x;
    body[i].y=body[i-1].y;
}

In that loop, body[1] is assigned to body[0], then body [2] is assigned to body[1] etc. This means that everything from index 1 to the end will be set equal to body[0], then body[0] is altered based on direction - so there are only two positions.

Look into the javascript unshift method.

You could replace that loop with:

body.unshift(body[0]);
Sign up to request clarification or add additional context in comments.

1 Comment

did this program while i was feeling sleepy. KILL ME for making this dumb error!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.