未完成的JS作品之一:用面向对象思想写的虫吃豆游戏

来源:岁月联盟 编辑:zhuzhu 时间:2003-07-11
无聊时写的,稍作修改就可以支持多人游戏的,实在是懒得写下去了
i键:上,j键:左,k键:下,l键:右

<html>
<style>
td {width:2pt;height:2pt;font-size:2pt;}
</style>
<script>
function Pos(x,y) {
    this.x = x;
    this.y = y;
    return this;
}
function Snake(x,y) {
    this.node = new Array();
    for (var i=0;i<20;i++)
        this.node[i] = new Pos(x,y);
    this.direction = 0;
    this.board = null;
    this.setBoard = function (board) {
        this.board = board;
    }
    this.left = function () {
        var c;
        with (this)
            if (board.check(node[0].x-1,node[0].y)) {
                clear();
                moveNode();
                node[0].x--;
                c = board.getDot(node[0].x,node[0].y);
                draw();
            }
            else
                c = 'black';
        this.direction = 2;
        return c;
    }
    this.right = function () {
        var c;
        with (this)
            if (board.check(node[0].x+1,node[0].y)) {
                clear();
                moveNode();
                node[0].x++;
                c = board.getDot(node[0].x,node[0].y);
                draw();
            }
            else
                c = 'black';
        this.direction = 4;
        return c;
    }

    this.up = function () {
        var c;
        with (this)
            if (board.check(node[0].x,node[0].y-1)) {
                clear();
                moveNode();
                node[0].y--;
                c = board.getDot(node[0].x,node[0].y);
                draw();
            }
            else
                c = 'black';
        this.direction = 1;
        return c;
    }

    this.down = function () {
        var c;
        with (this)
            if (board.check(node[0].x,node[0].y+1)) {
                clear();
                moveNode();
                node[0].y++;
                c = board.getDot(node[0].x,node[0].y);
                draw();
            }
            else
                c = 'black';
        this.direction = 3;
        return c;
    }
    this.moveNode = function () {
        with (this)
            for (var i=node.length-1;i>0;i--) {
                node[i].x = node[i-1].x;
                node[i].y = node[i-1].y;
            }
    }
    this.draw = function () {
        with (this)
            board.drawDot(node[0].x, node[0].y);
    }
    this.clear = function () {
        with (this) {
            if (node.length>1)
                if (node[node.length - 1].x == node[node.length - 2].x &&
                node[node.length - 1].y == node[node.length - 2].y)
                    return;
            board.clearDot(node[node.length - 1].x, node[node.length - 1].y);
        }
    }
    this.move = function () {
        var c;
        with (this) {
            if (direction==1)
                c = up();
            if (direction==2)
                c = left();
            if (direction==3)
                c = down();
            if (direction==4)
                c = right();
        }
        return c;
    }
}
function Board(name,col,row) {
    this.name = name;
    this.obj = null;
    this.col = col;
    this.row = row;
    this.draw = function () {
        var i,j;
        document.write('<table id=' + this.name + ' border=0>');
        for (j=0;j<this.row;j++) {
            document.write('<tr>');
            for (i=0;i<this.col;i++)
                document.write('<td>&nbsp;</td>');
            document.write('</tr>');
        }
        document.write('</table>');
        this.obj = eval(this.name);
    }
    this.check = function (x,y) {
        if (this.obj.rows[y].cells[x].style.background == 'black')
            return false
        else
            return true;
    }
    this.getDot = function (x,y) {
        return this.obj.rows[y].cells[x].style.background;
    }
    this.drawDot = function (x,y) {
        this.obj.rows[y].cells[x].style.background = 'black';
    }
    this.clearDot = function (x,y) {
        this.obj.rows[y].cells[x].style.background = 'white';
    }
    this.addDot = function () {
        var x,y;
        with (this) {
            do {
                x = Math.ceil(Math.random()*(col-3) + 1);
                y = Math.floor(Math.random()*(row-3) + 1);
            }
            while (getDot(x,y) != 'white')
            obj.rows[y].cells[x].style.background = 'red';
        }
        
    }
    this.clear = function () {
        var i,j;
        for (j=0;j<this.row;j++)
            for (i=0;i<this.col;i++)
                if (i==0 || j==0 || i==this.col-1 || j==this.row-1)
                    this.obj.rows[j].cells[i].style.background = 'black';
                else
                    this.obj.rows[j].cells[i].style.background = 'white';
        for (i=0;i<10;i++)
            this.addDot();
    }

}
function keyPress() {
    if (event.keyCode==105 && snake.direction!=1 && snake.direction!=3)
        snake.direction=1;
    if (event.keyCode==106 && snake.direction!=2 && snake.direction!=4)
        snake.direction=2;
    if (event.keyCode==107 && snake.direction!=1 && snake.direction!=3)
        snake.direction=3;
    if (event.keyCode==108 && snake.direction!=2 && snake.direction!=4)
        snake.direction=4;
}
var count=0;
function run() {
    var c = snake.move();
    if(c=='black')
        alert('Game Over!');
    else {
        if(c=='red') {
            count++;
            for (var i=0;i<5;i++)
                snake.node[snake.node.length] = new Pos(snake.node[snake.node.length-1].x, snake.node[snake.node.length-1].y);
            board.addDot();
            score.value = count;
        }
        window.setTimeout('run()',30);
    }
}
</script>
<body>
SCORE:<input name=score type=text value=0 disabled onfocus=this.blur()><br>
<script>
var board = new Board('GameBoard',50,40);
board.draw();
board.clear();
var snake = new Snake(1,1);
snake.setBoard(board);
snake.draw();
document.body.onkeypress = keyPress;
window.setTimeout('run()',10);
</script>
<body>
</html>