zoukankan      html  css  js  c++  java
  • 饶有兴致的用javascript做了个贪食蛇游戏

    09年写的东西。一直藏在自己的记事本里头,现在开始整理写博客,所以直接搬过来

    先上效果图

      

    再添代码:

      

    <HTML>  
    <HEAD>  
        <TITLE>贪吃蛇 Snake v1.0 版,作者:刚刀飞絮</TITLE>  
    <STYLE>  
        body{   
            font-size:9pt;   
        }   
        table{   
            border-collapse: collapse;   
            border:solid #333 1px;   
        }   
        td{   
            height: 10px;   
             10px;   
            font-size: 0px;   
        }   
        .filled{   
            background-color:blue;   
        }   
    </STYLE>  
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    </HEAD>  
    <SCRIPT>  
        function $(id){return document.getElementById(id);}   
    /**************************************************************   
    javascript面向对象  
    **************************************************************/   
        //贪吃蛇类   
        var Snake = {   
            tbl: null,   
            /**   
            * body: 蛇身,数组放蛇的每一节,   
            * 数据结构{x:x0, y:y0, color:color0},   
            * x,y表示坐标,color表示颜色   
            **/   
            body: [],   
            //当前移动的方向,取值0,1,2,3, 分别表示向上,右,下,左, 按键盘方向键可以改变它   
            direction: 0,   
            //定时器   
            timer: null,   
            //速度   
            speed: 250,   
            //是否已经暂停   
            paused: true,   
            //行数   
            rowCount: 30,   
            //列数   
            colCount: 30,   
            //初始化
            
            init: function(){   
                var colors = ['red','orange','yellow','green','blue','purple','#ccc'];   
                this.tbl = $("main"); 
       //document.getElementById("fen").innerHTML=this.scre(); 
       
                var x = 0;   
                var y = 0;   
                var colorIndex = 0;   
                //产生初始移动方向   
                this.direction = Math.floor(Math.random()*4);   
                //构造table   
                for(var row=0;row<this.rowCount;row++){   
                    var tr=this.tbl.insertRow(-1);   
                    for(var col=0;col<this.colCount;col++) {   
                        var td=tr.insertCell(-1);   
                    }   
                }   
                //根据循环次数产生任意个松散节点   
                for(var i=0; i<1; i++){   
                    x = Math.floor(Math.random()*this.colCount);   
                    y = Math.floor(Math.random()*this.rowCount);   
                    colorIndex = Math.floor(Math.random()*7);   
                    if(!this.isCellFilled(x,y)){   
                        this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];   
                    }   
                }   
                //产生蛇头   
                while(true){   
                    x = Math.floor(Math.random()*this.colCount);   
                    y = Math.floor(Math.random()*this.rowCount);   
                    if(!this.isCellFilled(x,y)){   
                        this.tbl.rows[y].cells[x].style.backgroundColor = "black";   
                        this.body.push({x:x,y:y,color:'black'});   
                        break;   
                    }   
                }   
       
                this.paused = true;   
                //添加键盘事件   
                document.onkeydown= function(e){   
                    if (!e)e=window.event;   
                    switch(e.keyCode | e.which | e.charCode){   
                            case 13: {   
                                    if(Snake.paused){   
                                            Snake.move();   
                                            Snake.paused = false;   
                                    }   
                                    else{   
                                          //如果没有暂停,则停止移动   
                                            Snake.pause();   
                                            Snake.paused = true;   
                                    }   
                                    break;   
                            }   
                        case 37:{//left   
                            //阻止蛇倒退走   
                            if(Snake.direction==1){   
                                break;   
                            }   
                            Snake.direction = 3;   
                            break;   
                        }   
                        case 38:{//up   
                              //快捷键在这里起作用   
                                if(event.ctrlKey){   
                                      Snake.speedUp(-20);   
                                        break;   
                                }   
                            if(Snake.direction==2){//阻止蛇倒退走   
                                break;   
                            }   
                            Snake.direction = 0;   
                            break;   
                        }   
                        case 39:{//right   
                            if(Snake.direction==3){//阻止蛇倒退走   
                                break;   
                            }   
                            Snake.direction = 1;   
                            break;   
                        }   
                        case 40:{//down   
                                if(event.ctrlKey){   
                                      Snake.speedUp(20);   
                                        break;   
                                }   
                            if(Snake.direction==0){//阻止蛇倒退走   
                                break;   
                            }   
                            Snake.direction = 2;   
                            break;   
                        }   
                    }   
                }   
            },   
            //移动   
            move: function(){   
                this.timer = setInterval(function(){   
                    Snake.erase();   
                    Snake.moveOneStep();   
                    Snake.paint();   
                }, this.speed);   
            },   
            //移动一节身体   
            moveOneStep: function(){   
                if(this.checkNextStep()==-1){   
                    clearInterval(this.timer);   
                   var result=window.confirm("Game Over ! 
    是否要重新玩?")
                   result?this.restart():"";  
                    return;   
                }   
                if(this.checkNextStep()==1){   
                    var _point = this.getNextPos();   
                    var _x = _point.x;   
                    var _y = _point.y;   
                    var _color = this.getColor(_x,_y);   
                    this.body.unshift({x:_x,y:_y,color:_color});   
                    //因为吃了一个食物,所以再产生一个食物   
                    this.generateDood();   
                    return;   
                }   
                //window.status = this.toString();   
                var point = this.getNextPos();   
                //保留第一节的颜色   
                var color = this.body[0].color;   
                //颜色向前移动   
                for(var i=0; i<this.body.length-1; i++){   
                        this.body[i].color = this.body[i+1].color;   
                }   
                //蛇尾减一节, 蛇尾加一节,呈现蛇前进的效果   
                this.body.pop();   
                this.body.unshift({x:point.x,y:point.y,color:color});   
                //window.status = this.toString();   
            },  
       
            //探寻下一步将走到什么地方   
            pause: function(){   
                    clearInterval(Snake.timer);   
                    this.paint();   
            },   
            getNextPos: function(){   
                var x = this.body[0].x;   
                var y = this.body[0].y;   
                var color = this.body[0].color;   
                //向上   
                if(this.direction==0){   
                    y--;   
                }   
                //向右   
                else if(this.direction==1){   
                    x++;   
                }   
                //向下   
                else if(this.direction==2){   
                    y++;   
                }   
                //向左   
                else{   
                    x--;   
                }   
                //返回一个坐标   
                return {x:x,y:y};   
            },   
            //检查将要移动到的下一步是什么   
            checkNextStep: function(){   
                var point = this.getNextPos();   
                var x = point.x;   
                var y = point.y;   
                if(x<0||x>=this.colCount||y<0||y>=this.rowCount){   
                    return -1;//触边界,游戏结束   
                }   
                for(var i=0; i<this.body.length; i++){   
                    if(this.body[i].x==x&&this.body[i].y==y){   
                        return -1;//碰到自己的身体,游戏结束   
                    }   
                }   
                if(this.isCellFilled(x,y)){   
                    return 1;//有东西   
                }   
                return 0;//空地   
            },   
            //擦除蛇身   
            erase: function(){   
                for(var i=0; i<this.body.length; i++){   
                    this.eraseDot(this.body[i].x, this.body[i].y);   
                }   
            },   
            //绘制蛇身   
            paint: function(){   
                for(var i=0; i<this.body.length; i++){   
                    this.paintDot(this.body[i].x, this.body[i].y,this.body[i].color);   
                }   
       this.score(this.body.length-1)
            }, 
      //计算分数
      score: function(score){
       $("fen").innerHTML=score*10;
       } ,
            //擦除一节   
            eraseDot: function(x,y){   
                this.tbl.rows[y].cells[x].style.backgroundColor = "";   
            },   
            paintDot: function(x,y,color){   
                this.tbl.rows[y].cells[x].style.backgroundColor = color;   
            },   
            //得到一个坐标上的颜色   
            getColor: function(x,y){   
                return this.tbl.rows[y].cells[x].style.backgroundColor;   
            },   
            //用于调试   
            toString: function(){   
                var str = "";   
                for(var i=0; i<this.body.length; i++){   
                    str += "x:" + this.body[i].x + " y:" + this.body[i].y + " color:" + this.body[i].color + " - ";   
                }   
                return str;   
            },   
            //检查一个坐标点有没有被填充   
            isCellFilled: function(x,y){   
                if(this.tbl.rows[y].cells[x].style.backgroundColor == ""){   
                    return false;   
                }   
                return true;   
            },   
            //重新开始   
            restart: function(){   
                if(this.timer){   
                    clearInterval(this.timer);   
                }   
                for(var i=0; i<this.rowCount;i++){   
                        this.tbl.deleteRow(0);   
                }   
                this.body = [];   
                this.init();   
                this.speed = 250;   
            },   
            //加速   
            speedUp: function(time){   
                    if(!this.paused){   
                            if(this.speed+time<10||this.speed+time>2000){   
                                    return;   
                            }   
                            this.speed +=time;   
                            this.pause();   
                            this.move();   
                    }   
            },   
            //产生食物。   
            generateDood: function(){   
                    var colors = ['red','orange','yellow','green','blue','purple','#ccc'];   
                        var x = Math.floor(Math.random()*this.colCount);   
                var y = Math.floor(Math.random()*this.rowCount);   
                var colorIndex = Math.floor(Math.random()*7);   
                if(!this.isCellFilled(x,y)){   
                    this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];   
                }   
            }   
        };   
     
    </SCRIPT>  
    
    <BODY onLoad="Snake.init();" >
    <div align="center" style="font-size:14px; color:#F00" >贪吃蛇游戏 &nbsp;&nbsp;&nbsp; 分数:<SPAN  id="fen"></SPAN></div>   
    <TABLE id="main" border="1" cellspacing="0" cellpadding="0" align="center"></TABLE>  
    <div align="center" style="font-size:12px"><INPUT type="button" id="btn" value="开始/暂停" />
    <INPUT type="button" id="reset" value="重新开始" /> 
    <INPUT type="button" id="upSpeed" value="加速" />
    <INPUT type="button" id="downSpeed" value="减速" />
    </div>   
    <SCRIPT> 
            $('btn').onclick = function(){   
                    if(Snake.paused){   
                            Snake.move();   
                            Snake.paused = false;   
                    }   
                    else{   
                            Snake.pause();   
                            Snake.paused = true;   
                    }   
            };   
            $("reset").onclick = function(){   
                    Snake.restart();   
                    this.blur();   
            };   
            $("upSpeed").onclick = function(){   
                    Snake.speedUp(-20);   
            };   
            $("downSpeed").onclick = function(){   
                    Snake.speedUp(20);   
            };   
    </SCRIPT>  
    </BODY>  
    </HTML>  
    View Code

    喜欢的可以直接代码复制另存为,玩玩。

  • 相关阅读:
    Struts2的HelloWorld
    javaScript 避免使用eval
    javaScript 全局变量注意
    NET下的XML序列化 5
    通过aps.net创建web services 3
    XML web Service标准2
    webServices简介笔记1
    批量更新
    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。
    json时间格式的互换
  • 原文地址:https://www.cnblogs.com/echosong/p/3352989.html
Copyright © 2011-2022 走看看