zoukankan      html  css  js  c++  java
  • 贪吃蛇 --- 对象

    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="utf-8" />

    <title></title>

    </head>

    <body>

    <div style="margin: 0 auto;width: 800px;height: 880px;border: 1px solid steelblue;">

    <div  style="height: 80px;">

    <div id="fenshu">

     

    </div>

    <input type="button" name="" id="anniu" value="再来一次" />

    </div>

    <canvas id="snakeCanvas" width="800" height="800" style="background: steelblue;"></canvas>

    </div>

    </body>

    </html>

    <script type="text/javascript" src="js/Snake.js"></script>

    <script type="text/javascript" src="js/food.js"></script>

    <script type="text/javascript" src="js/Manager.js"></script>

    <script type="text/javascript" src="js/main.js"></script>

     

     

     

     

     

    food

    function Food(w,range){

    this.x = 0;

    this.y = 0;

    this.w = w;

    this.range = range;

     

    // 1.随机位置的方法

    this.randomPos = function(theSnake){

    // 随机位置的方法 

    this.x = parseInt(Math.random()*this.range)*this.w;

    this.y = parseInt(Math.random()*this.range)*this.w;

     

    var isEnd = true;//判断食物在不在蛇的身体里

    while(isEnd){

    for(var i=0;i<theSnake.snakeBodyArray.length;i++){

    var pos =theSnake.snakeBodyArray[i];

    if(pos.x == this.x&&pos.y==this.y){

    break;

    }

    }

    if(i==theSnake.snakeBodyArray.length){

    isEnd = false;

    }

    }

     

    }

     

    // 2.绘制实物的方法

    this.drawFood = function(context,color){

    context.beginPath();

    context.fillStyle = color;

    context.fillRect(this.x,this.y,w,w);

    // console.log(this.x);

    // context.save();

     

    }

     

     

     

    }

     

     

     

     

     

     

     

    main

    var fenshu = document.getElementById("fenshu");

    var anniu = document.getElementById("anniu");

    var snakeCanvas = document.getElementById("snakeCanvas");

    var context = snakeCanvas.getContext("2d");

    var lock = false; // false 代表锁是打开的

    var timer = null;  //定时器

    var speed = 200;  //蛇移动的速度

     

    var isDie = false;  //活着 

     

    //创建对象 (画格)

    var manger = new Manager();

    manger.drawBackgroundLine(20,snakeCanvas,context);

     

    //画蛇

    var aSnake = new Snake(4,"greenyellow",manger.boxSize);

    aSnake.initSnake(context);

     

    //画食物

    var aFood = new Food(manger.boxSize,manger.numberOfBox);

    aFood.drawFood(context,"powderblue");

    aFood.randomPos(aSnake);

     

    function snakePlay(){

    timer = setInterval(function(){

    lock = false;   //开锁

    context.clearRect(0,0,snakeCanvas.width,snakeCanvas.height);//清除画布

    manger.drawBackgroundLine(20,snakeCanvas,context);//绘制背景

    aFood.drawFood(context,"powderblue");   //绘制食物

     

    aSnake.moveSnake();//移动蛇

    aSnake.drawSnakeBody(context);//画蛇

    manger.snakeEatFood(aSnake,aFood);//判断蛇是否吃到了食物

    aSnake.crashCheck(snakeCanvas,timer); //判断蛇是否死亡

     

    if(aSnake.snakeBodyArray.length == 5&&speed > 30){

    speed =30;

    clearInterval(timer);

    snakePlay();

    }

    if(aSnake.snakeBodyArray.length == 10&&speed > 20){

    speed = 20;

    clearInterval(timer);

    snakePlay();

    }

    fenshu.innerHTML = manger.ii;   //分数

    console.log(manger.ii);

    },speed)

    }

    snakePlay();

     

    function game(){

    lock = true;   //开锁

     

    context.clearRect(0,0,snakeCanvas.width,snakeCanvas.height);//清除画布

    manger.drawBackgroundLine(20,snakeCanvas,context);//绘制背景

    aFood.drawFood(context,"powderblue");   //绘制食物

     

    aSnake.drawSnakeBody(context);//画蛇

    }

     

     

     

     

     

     

    //  键盘的监听事假

    document.onkeydown = function(event){

    var ev =event || window.event;

    switch(ev.keyCode){

    case 37:

    if(lock == false&&(aSnake.direction == "top"||aSnake.direction == "bottom")){

    aSnake.direction = "left";  //direction是Snake的属性

    lock = true;

    }

    break;

    case 38:

    if(lock == false&&(aSnake.direction == "left" || aSnake.direction == "right")){

    aSnake.direction = "top";

    lock = true;

    }

    break;

    case 39:

    if(lock == false&&(aSnake.direction == "top"||aSnake.direction == "bottom")){

    aSnake.direction = "right";  //direction是Snake的属性

    lock = true;

    }

    break;

    case 40:

    if(lock == false&&(aSnake.direction == "left" || aSnake.direction == "right")){

    aSnake.direction = "bottom";

    lock = true;

    }

    break;

    }

    }

     

    anniu.onclick=function(){

    window.location.reload();

    }

     

     

     

    Manager

    //这个类功能  *画线

    function Manager(){

    this.boxSize = null;//格子大小

    this.numberOfBox = null;//格子数量

    this.ii=0;

    //画线

    this.drawBackgroundLine = function(boxSize,canvas,context){

    this.boxSize = boxSize;

    this.numberOfBox = parseInt(canvas.width/this.boxSize);

    //横线.

    for(var i=0;i<this.numberOfBox;i++){

    context.beginPath();

    context.moveTo(0,i*this.boxSize);

    context.lineTo(this.boxSize*this.numberOfBox,i*this.boxSize);

    context.strokeStyle = "lightgray";

    context.stroke();

    context.save();

    }

    //竖线.

    for(var i=0;i<this.numberOfBox;i++){

    context.beginPath();

    context.moveTo(i*this.boxSize,0);

    context.lineTo(i*this.boxSize,this.boxSize*this.numberOfBox);

    context.strokeStyle = "lightgray";

    context.stroke();

    context.save();

    }

     

    }

     

    // 蛇 是否吃到 食物

    this.snakeEatFood = function(theSnake,theFood){

    var snakeHead = theSnake.snakeBodyArray[theSnake.snakeBodyArray.length-1];

    if(snakeHead.x == theFood.x&&snakeHead.y == theFood.y){

    // 吃到食物

    //1.食物的位置重新随机

    theFood.randomPos(aSnake);

    //2.蛇的身体加长

    theSnake.addBody();

    this.ii++;

    }

     

     

    }

    }

     

     

    snake

     

     

    function Snake(bodyLength,color,w){// 蛇头的颜色

    this.bodyLength = bodyLength;

    this.color = color;  //蛇头

    this.snakeBodyArray = [];  //用来存储蛇每截身体的坐标------数组里最后一个元素是蛇头(第一个是的话距离墙太近-会死)

    this.WIDTH = w;  //一节身体的大小

    this.direction = "right";

     

    this.prevBody = [];  //处理头进去

    // 初始化蛇的状态--注意这个方法在初始化蛇的对象的时候就需要调用

    this.initSnake = function(context){

    for(var i = 0; i < this.bodyLength; i++){

    var pos = {

    x:i*this.WIDTH+200,

    y:100,

    }

    this.snakeBodyArray.push(pos);

    }

    this.drawSnakeBody(context);

    }

     

    // 1.绘制身体

    this.drawSnakeBody = function(context){

     

    var body = [];//处理头

    if (isDie) {

    body = this.prevBody;

    }else{

    body = this.snakeBodyArray;

    }

     

    for(var i=0 ;i<body.length; i++){

    var pos = body[i];

    context.beginPath();

    if(i == body.length - 1){

    context.fillStyle = this.color;

    }else{

    context.fillStyle = "black";

    }

    context.fillRect(pos.x,pos.y,this.WIDTH,this.WIDTH);

    context.strokeStyle = "width";

    context.strokeRect(pos.x,pos.y,this.WIDTH,this.WIDTH);

    }

    }

     

    // 2.移动

    this.moveSnake = function(){//把数组里第一个元素删掉,然后在最后一个元素后面添加一个新的再push回数组

     

    this.prevBody = [];//处理头

    for(var i = 0 ;i< this.snakeBodyArray.length;i++){

    this.prevBody.push(this.snakeBodyArray[i]);

    }

     

     

    this.snakeBodyArray.shift();//删除数组里第一个元素

    var currentHead = this.snakeBodyArray[this.snakeBodyArray.length-1];//获取到数组里最后一个元素

     

    var newHead = {};

    switch(this.direction){

    case "left":

    newHead.x = currentHead.x-this.WIDTH;

    newHead.y = currentHead.y;

    break;

    case "right":

    newHead.x = currentHead.x+this.WIDTH;

    newHead.y = currentHead.y;

    break;

    case "top":

    newHead.x = currentHead.x;

    newHead.y = currentHead.y-this.WIDTH;

    break;

    case "bottom":

    newHead.x = currentHead.x;

    newHead.y = currentHead.y+this.WIDTH;

    break;

    }

     

    this.snakeBodyArray.push(newHead);

    }

    // s蛇身体增加长度 

    this.addBody = function(){

    var pos = {x:0,y:0};

    this.snakeBodyArray.unshift(pos);

    }

    // 蛇是否碰到了墙壁或者自己

    this.crashCheck = function(canvas,timer){

    var snakeHead = this.snakeBodyArray[this.snakeBodyArray.length-1];

    if(snakeHead.x>=canvas.width||snakeHead.x<0||snakeHead.y<0||snakeHead.y>=canvas.height){

    isDie = true;

     

    clearInterval(timer);

    game();

    alert("game Over");

    return;

    // window.location.reload();//刷新重新开始

    }

    //循环检测身体部分是否发生了碰撞

    for(var i=0; i<this.snakeBodyArray.length-1; i++){

    var bodyPice = this.snakeBodyArray[i];

    if(snakeHead.x==bodyPice.x&&snakeHead.y==bodyPice.y){

    isDie = true;

     

     

    clearInterval(timer);

    game();

    alert("game Over");

    return;

    }

    }

     

     

     

    }

     

     

    }

  • 相关阅读:
    Loadrunner:场景运行较长时间后报错:Message id [-17999] was not saved
    JMeter学习(三十二)属性和变量
    LoadRunner参数化MySQL
    Linux下安装使用NMON监控、分析系统性能
    使用Loadrunner进行http接口压力测试
    Windows远程桌面连接Ubuntu 14.04
    oracle转Mysql中,varchar2(10)和number应该转换为什么类型?
    centos下pip安装mysql_python
    JMeter中返回Json数据的处理方法
    如何使用AutoIT完成单机测试
  • 原文地址:https://www.cnblogs.com/promiseZ/p/6151277.html
Copyright © 2011-2022 走看看