WEB 八

JS 面向对象编程

利用JS面向对象编程写一个贪吃蛇小游戏

思路:地图->蛇->让蛇运动->用键盘控制蛇运动->食物->食物随机->蛇吃食物并让蛇边长->添加死亡判定

首先创建一个地图类

function Map(){
            this.width=1200;
            this.height=600;
            this.margin="0 auto";
            this.bgcolor="black";
            this._map=null;
            this.createMap=function(){
                if(this._map==null){
                    this._map=document.createElement("div");
                    this._map.style.width=this.width+"px";
                    this._map.style.height=this.height+"px";
                    this._map.style.backgroundColor=this.bgcolor;
                    this._map.style.margin=this.margin;
                    this._map.style.position="relative";
                    this._map.style.overflow="hidden";
                    document.body.appendChild(this._map);
                }
            }
        }

然后在window.onload事件里面新建一个MAP实例,调用createMap方法;

创建一个蛇类

function Snake(){
            this.width=30;
            this.height=30;
            this.direct=r="right";
            this.position="absolute";
            this.snakebody=[[1,1,"white",null],[2,1,"white",null],[3,1,"blue",null]];
            this.createSnake=function(){
                for(i=0;i<this.snakebody.length;i++){
                    if(this.snakebody[i][3]==null){
                        this.snakebody[i][3]=document.createElement("div");
                        this.snakebody[i][3].style.width=this.width+"px";
                        this.snakebody[i][3].style.height=this.height+"px";
                        this.snakebody[i][3].style.position=this.position;
                        this.snakebody[i][3].style.backgroundColor=this.snakebody[i][2];
                        map._map.appendChild(this.snakebody[i][3]);
                    }
                    this.snakebody[i][3].style.left=this.snakebody[i][0]*30+"px";
                    this.snakebody[i][3].style.top=this.snakebody[i][1]*30+"px";
                }
            }
            this.moveSnake=function(){
                for(var i=0;i<this.snakebody.length-1;i++){
                    this.snakebody[i][0]=this.snakebody[i+1][0];
                    this.snakebody[i][1]=this.snakebody[i+1][1];
                }
                    switch (this.direct){
                        case"right":this.snakebody[this.snakebody.length-1][0]+=1;break;
                        case"left":this.snakebody[this.snakebody.length-1][0]-=1;break;
                        case"top":this.snakebody[this.snakebody.length-1][1]-=1;break;
                        case"down":this.snakebody[this.snakebody.length-1][1]+=1;break;
                    }
                this.snackCollider();
                if(this.snakebody[this.snakebody.length-1][0]>=40){
                    this.snakebody[this.snakebody.length-1][0]=0;
                }
                if(this.snakebody[this.snakebody.length-1][0]<0){
                    this.snakebody[this.snakebody.length-1][0]=39;
                }if(this.snakebody[this.snakebody.length-1][1]>=20){
                    this.snakebody[this.snakebody.length-1][1]=0;
                }
                if(this.snakebody[this.snakebody.length-1][1]<0){
                    this.snakebody[this.snakebody.length-1][1]=19;
                }


                if(this.snakebody[this.snakebody.length-1][0]==food.x&&this.snakebody[this.snakebody.length-1][1]==food.y){
                    this.snakebody.unshift([
                        this.snakebody[this.snakebody.length-1][0],
                        this.snakebody[this.snakebody.length-1][1],
                        "white",
                        null
                    ]);
                    food.createFood();
                }
                this.createSnake();

            }
this.snackCollider=function(){
                for(var i=1;i<this.snakebody.length-1;i++){
                    if(this.snakebody[this.snakebody.length-1][0]==this.snakebody[i][0]&&this.snakebody[this.snakebody.length-1][1]==this.snakebody[i][1])
                    {
                        clearInterval(time);
                        alert("撞死了");
                    }
                }
            }
        }

蛇类里面包括了蛇的运动方法 创建方法 死亡判定;

同再window.onload里新建并调用方法;

创建食物类,在createFOOD方法里面添加随机产生的函数;

function Food() {
this.x = 0;
this.y = 0;
this.width = 30;
this.height = 30;
this.bgcolor = "red";
this._food = null;
this.createFood = function () {

                        this.x = Math.floor(Math.random() * 40);
                        this.y = Math.floor(Math.random() * 20);
                if (this._food == null) {
                    this._food = document.createElement("div");
                    this._food.style.position = "absolute";
                    this._food.style.width = this.width + "px";
                    this._food.style.height = this.height + "px";
                    this._food.style.backgroundColor = this.bgcolor;
                    map._map.appendChild(this._food);
                }

                this._food.style.left = this.x * this.width + "px";
                this._food.style.top = this.y * this.height + "px";
            }
    }

实例化对象并调用方法

添加计时器让蛇一直在运动;

有一个BUG食物可能会出现在蛇的身体里面

[图片上传失败...(image-65ff1c-1528297648579)]

在createfood里面添加了判断函数

但是经过测试无法实现;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容