見出し画像

🚀P5.jsでsnakeゲームを作りたいです。ベースソースをください

let snake;
let rez = 20;
let food;
let w;
let h;

function setup() {
  createCanvas(400, 400);
  w = floor(width / rez);
  h = floor(height / rez);
  frameRate(10);
  snake = new Snake();
  foodLocation();
}

function foodLocation() {
  let x = floor(random(w));
  let y = floor(random(h));
  food = createVector(x, y);
}

function keyPressed() {
  if (keyCode === LEFT_ARROW) {
    snake.setDir(-1, 0);
  } else if (keyCode === RIGHT_ARROW) {
    snake.setDir(1, 0);
  } else if (keyCode === DOWN_ARROW) {
    snake.setDir(0, 1);
  } else if (keyCode === UP_ARROW) {
    snake.setDir(0, -1);
  }
}

function draw() {
  scale(rez);
  background(220);
  if (snake.eat(food)) {
    foodLocation();
  }
  snake.update();
  snake.show();

  if (snake.endGame()) {
    print("END GAME");
    background(255, 0, 0);
    noLoop();
  }

  noStroke();
  fill(255, 0, 0);
  rect(food.x, food.y, 1, 1);
}

class Snake {
  constructor() {
    this.body = [];
    this.body[0] = createVector(floor(w / 2), floor(h / 2));
    this.xdir = 0;
    this.ydir = 0;
  }

  setDir(x, y) {
    this.xdir = x;
    this.ydir = y;
  }

  update() {
    let head = this.body[this.body.length - 1].copy();
    this.body.shift();
    head.x = (head.x + this.xdir + w) % w;
    head.y = (head.y + this.ydir + h) % h;
    this.body.push(head);
  }

  endGame() {
    let head = this.body[this.body.length - 1];
    for (let i = 0; i < this.body.length - 1; i++) {
      let part = this.body[i];
      if (part.equals(head)) {
        return true;
      }
    }
    return false;
  }

  eat(pos) {
    let head = this.body[this.body.length - 1];
    if (head.x === pos.x && head.y === pos.y) {
      this.body.push(head.copy());
      return true;
    }
    return false;
  }

  show() {
    for (let i = 0; i < this.body.length; i++) {
      fill(0);
      noStroke();
      rect(this.body[i].x, this.body[i].y, 1, 1);
    }
  }
}

スネークゲームで壁を通り抜ける機能を実現するために、主に以下の部分を修正しました。ここでは、各処理のポイントを詳しく説明します。

1. `update` メソッドの変更

このメソッドはスネークの位置を更新するために使われます。壁を通り抜ける機能を実装するために、スネークの頭部がキャンバスの端に達したときに、反対側から出現するように計算を行います。

head.x = (head.x + this.xdir + w) % w;
head.y = (head.y + this.ydir + h) % h;
  • `head.x` と `head.y` はスネークの頭の位置を示します。

  • `this.xdir` と `this.ydir` はスネークの移動方向を示します(左、右、上、下)。

  • `w` と `h` はキャンバスの幅と高さをグリッドの数で割った値です(`width / rez` と `height / rez`)。

`% w` と `% h` は、頭がキャンバスの端に達した場合に、値をキャンバスの範囲内にラップアラウンドするためのモジュロ演算です。これにより、スネークが一方の端に達すると、自動的に反対側から出てくるようになります。

2. `endGame` メソッドの変更

以前のバージョンでは、このメソッドはスネークが壁にぶつかるか、自分自身にぶつかった場合にゲームオーバーを判断していました。壁を通り抜ける機能を実装するため、壁にぶつかる条件を削除しました。

for (let i = 0; i < this.body.length - 1; i++) {
  let part = this.body[i];
  if (part.equals(head)) {
    return true;  // 自分自身にぶつかった場合のみゲームオーバー
  }
}
return false;

このコードでは、スネークの頭が自分の体のどの部分とも重なっていないかをチェックします。重なっている場合は `true` を返してゲームオーバーとなります。

総括

これらの変更により、スネークはキャンバスの端を通り抜けて、反対側から出現するようになりました。また、スネークが自分自身にぶつかった場合のみゲームオーバーとなるようにゲームのルールが変更されています。これにより、ゲームプレイが少し異なる新しいダイナミクスを提供し、プレイヤーにとって新たな挑戦となります。

お願い致します