蛇游戏与自身碰撞

snake game collision with itself

我用 processign.js 做了一个贪吃蛇游戏,我正在尝试与自己发生碰撞。问题是它没有正常工作。

var screen = 0;
var bg = color(60,150,60);
var snake;
var apple;
var bonus;
var nBonus = 0;
var gameOver = false;

var appleSize = 10;
var applePosX = round(random(10,width-appleSize)/10)*10;
var applePosY = round(random(10,height-appleSize)/10)*10;

var keys = [];
void keyPressed() {
    keys[keyCode] = true;
};
void keyReleased() {
    keys[keyCode] = false;
};


frameRate(10);


// collision with itself


// -----------------------------------------------------------------------

// ------------------------------- THE SNAKE -----------------------------

var Snake = function(x, y) {
    this.x = x;
    this.y = y;
    this.len = 1;
    this.size = 10;
    this.snakePosX = 0;
    this.snakePosY = 0;
    this.points = 0;
    this.positions = [];
    this.moving = false;
    this.apples = 0;

    for(var i=0; i<this.len; i++) {
        var posX = this.x-i*10;
        var posY = this.y;
        this.positions[i] = {x:posX, y:posY};
    }
};
Snake.prototype.draw = function() {
    fill(0);
    stroke(255,255,255);
    for(var i=0; i<this.positions.length; i++) {
        rect(this.positions[i].x, this.positions[i].y, this.size, this.size);
    }
};
Snake.prototype.move = function() {
    if(gameOver === false) {
        if(keys[UP]) {
            this.snakePosY = -this.size;
            this.snakePosX = 0;
            this.moving = true;
        }
        if(keys[DOWN]) {
            this.snakePosY = this.size;
            this.snakePosX = 0;
            this.moving = true;
        }
        if(keys[LEFT]) {
            this.snakePosX = -this.size;
            this.snakePosY = 0;
            this.moving = true;
        }
        if(keys[RIGHT]) {
            this.snakePosX = this.size;
            this.snakePosY = 0;
            this.moving = true;
        }
    }

    if(this.moving == true) {
        if(snake.positions.length == 1) {
            this.positions[0].x += this.snakePosX;
            this.positions[0].y += this.snakePosY;
        }
        else {
            for(var i=1; i<this.positions.length; i++) {
                this.positions[i-1].x = this.positions[i].x;
                this.positions[i-1].y = this.positions[i].y;
                this.positions[i].x += this.snakePosX;
                this.positions[i].y += this.snakePosY;
            }
        }
    }
};
Snake.prototype.checkColl = function() {
    // collision with itself
    if(this.positions.length>1) {
        for(var i=0; i<this.positions.length; i++) {
            if(this.positions[0].x > 350) {
                text('holly crap', 100, 100);
            }
        }
    }

    // collision with walls
    if(this.positions[0].x > width-this.size || this.positions[0].x < 0 || this.positions[0].y > height-this.size || this.positions[0].y < 0) {
        gameOver = true;
        gameIsOver();
    }

    // collision with apples
    for(var i=0; i<this.positions.length; i++) {
        if(this.positions[i].x >= apple.x && this.positions[i].x+10 <= apple.x+10 && this.positions[i].y >= apple.y && this.positions[i].y+10 <= apple.y+10) {
            apple.draw();
            this.apples ++;
            this.points += 10;
            this.positions.unshift({x:apple.x, y:apple.y});
            apple.x = round(random(10,width-appleSize)/10)*10;
            apple.y = round(random(10,height-appleSize)/10)*10;
            if(this.apples > 1 && this.apples % 5 == 0) {
                nBonus = 1;
            }
        }
    }

    // collision with bonus
    if(this.positions[0].x >= bonus.x && this.positions[0].x+10 <= bonus.x+10 && this.positions[0].y >= bonus.y && this.positions[0].y+10 <= bonus.y+10) {
        if(this.moving) {
            bonus.x = round(random(10,width-appleSize)/10)*10;
            bonus.y = round(random(10,height-appleSize)/10)*10;
            nBonus = 0;
            this.points += 10;
        }
    }
};


// ------------------------ THE APPLES -----------------------------------

var Apple = function(x, y) {
    this.x = x;
    this.y = y;
};
Apple.prototype.draw = function() {
    fill(255,0,0);
    noStroke();
    rect(this.x, this.y, appleSize, appleSize);
};



// ------------------------ THE BONUS -----------------------------------

var Bonus = function(x, y) {
    this.x = x;
    this.y = y;
}
Bonus.prototype.draw = function() {
    fill(150,0,0);
    stroke(255,255,255)
    rect(this.x, this.y, appleSize, appleSize);
};



// -----------------------------------------------------------------------


snake = new Snake(width/2, height/2);
apple = new Apple(applePosX, applePosY);
bonus = new Bonus(width/2, height/2);


// -----------------------------------------------------------------------


void gameIsOver() {
    fill(0);
    textAlign(CENTER);
    text("Game Over\nPress 'S' to play again", width/2, height/2);
    textAlign(LEFT);

    if(keys[83]) { 
        screen = 2;
        gameOver = false;
    }
}


void playGame() {
    if(screen === 0) {
        if(mouseX >= width/2-50 && mouseY <= width/2+50 && mouseY >= height/2-15 && mouseY <= height/2+15) {
            if(mousePressed) {
                screen = 1;
            }
        }
    }
}

void makeScreen() {
    if(screen === 0) {
        textAlign(CENTER);
        textSize(30);
        text('SNAKE GAME', width/2, 100);

        stroke(255,255,255);
        noFill();
        rectMode(CENTER);
        rect(width/2, height/2, 100, 30);
        textSize(15);
        text('Play', width/2, height/2+5);

        textSize(11);
        text('By Eskimopest', width/2, height-20);

        textAlign(LEFT);
        rectMode(LEFT);

        playGame();

    }
    if(screen === 1) {
        snake.draw();
        snake.move();
        snake.checkColl();

        apple.draw();

        if(nBonus === 1) {
            bonus.draw();
        }


        fill(0);
        text('POINTS : '+ snake.points, 10, 20);
        text('APPLES : '+ snake.apples, 10, 40);
    }
    if(screen === 2) {
        snake.points = 0;
        snake.apples = 0;
        snake.x = width/2;
        snake.y = height/2;
        snake.len = 1;
        snake.positions = [{x:snake.x, y:snake.y}];
        snake.snakePosX = 0;
        snake.snakePosY = 0;

        applePosX = round(random(10,width-appleSize)/10)*10;
        applePosY = round(random(10,height-appleSize)/10)*10;

        screen = 1;
    }
}



// -----------------------------------------------------------------------

void draw() {
    background(bg);

    makeScreen();

    for(var i=0; i<snake.positions.length; i++) {
        text(i + 'x:'+snake.positions[i].x + ' y:'+snake.positions[i].y, 600, 20+i*10);
    }

}

问题出在 snake.prototype.checkColl 中,我正在努力解决这个问题,但没有结果。当我尝试制作

if(this.positions[0].x = this.positions[i].x)

没有任何反应。如果有人能帮助我,我将不胜感激。

应该是:

if(this.positions[0].x == this.positions[i].x)

使用单个 = 正在执行 分配 。你想做一个比较,所以你需要双==.