スロットゲームを作る(2)

前回の続き。キーを押したらその時の値が表示され続けるようにします。他の機能もつけます。

前回、配列(box[0],box[1],box[2])の初期値を0に設定していました。キーが押されたら、その時にランダムに表示していた値を配列に入力するようにしましょう。そして、もし配列の値が 0 の間は値をランダムに表示し続け、0 でなかったら(何らかの値が入力されていたら)そちらを表示する、というふうに修正します。

if (box[0] == 0){
  i = (int)random(7) + 1;
  text(i, 150, 160);
  if(keyPressed){
    if (keyCode == LEFT){
      box[0] = i;
    }
  }
}
else if (box[0] != 0){
  text(box[0], 150, 160);
}

ここで、「あれ、1 つ目の if は while じゃなくていいの?」と思うかもしれません。
ですが、もしここでwhileを使ってしまうと、キーが押されるまでwhileの中でループしてしまい、うまく動きません。
draw() 全体がひとつのループになっているので、ここは if 文でOK なわけです。
上記を、box[1],box[2] の分も記述します(text(・・・) の x 座標はそれぞれ250,350あたりにしておきます)。

次に、メッセージを表示させましょう。
box[0] ~ box[2] までの値が 0 以上で同じになった場合は “YOU WIN!”、そうでない場合は “YOU LOSE!” と表示されるようにします。
ついでに、各ボックスの下に小さく “Click ‘←’ to stop” と表示させます。

// WIN
  if ((box[0] > 0) && (box[0] == box[1]) && (box[1] == box[2])){
    textSize(30);
    text("YOU WIN!", 250, 60);
    textSize(10);
    text("Click to restart", 250, 80);
  }
  // LOSE
  else if ((box[0] > 0) && (box[1] > 0) && (box[2] > 0)){
    textSize(30);
    text("YOU LOSE!", 250, 60);
    textSize(10);
    text("Click to restart", 250, 80);
  }
  
  // message
  textSize(15);
  text("'←' to stop", 150, 220);
  text("'↓' to stop", 250, 220);
  text("'→' to stop", 350, 220);

ここで、「あれ、else if の部分は else じゃないの?」と思うかもしれません。
ですが、もし else だと、他のすべての場合を意味しますので、プログラムをスタートさせた時から “YOU LOSE!” が表示されてしまいます。

リセット機能も作りましょう。
これは簡単です。各ボックスの値を 0 にすれば、また動き始めます。勝敗の表示も消えます。

if(mousePressed){
    box[0] = 0;
    box[1] = 0;
    box[2] = 0;
}

それぞれの機能を関数化させたら完成です。

<メインタブ>

int[] box = {0, 0, 0};

void setup(){
  size(500, 300);
  strokeWeight(2);
  frameRate(8);
}

void draw(){
  background(255);
  fill(255);
  rect(100,100,100,100);
  rect(200,100,100,100);
  rect(300,100,100,100);
  
  slot();
  message();
  reset();
}

 

<slot タブ>

void slot(){
  textAlign(CENTER);
  fill(0);
  textSize(30);
  int i;
  
  //BOX[0]
  if (box[0] == 0){
    i = (int)random(7) + 1;
    text(i, 150, 160);
    if(keyPressed){
      if (keyCode == LEFT){
        box[0] = i;
      }
    }
  }
  else if (box[0] != 0){
    text(box[0], 150, 160);
  }
  
  // BOX[1]
  if (box[1] == 0){
    i = (int)random(7) + 1;
    text(i, 250, 160);
    if(keyPressed){
      if (keyCode == DOWN){
        box[1] = i;
      }
    }
  }
  else if (box[1] != 0){
    text(box[1], 250, 160);
  }
  
  // BOX[2]
  if (box[2] == 0){
    i = (int)random(7) + 1;
    text(i, 350, 160);
    if(keyPressed){
      if (keyCode == RIGHT){
        box[2] = i;
      }
    }
  }
  else if (box[2] != 0){
    text(box[2], 350, 160);
  }
}

 

<message タブ>

void message(){
  // WIN
  if ((box[0] > 0) && (box[0] == box[1]) && (box[1] == box[2])){
    textSize(30);
    text("YOU WIN!", 250, 60);
    textSize(10);
    text("Click to restart", 250, 80);
  }
  // LOSE
  else if ((box[0] > 0) && (box[1] > 0) && (box[2] > 0)){
    textSize(30);
    text("YOU LOSE!", 250, 60);
    textSize(10);
    text("Click to restart", 250, 80);
  }
  
  // message
  textSize(15);
  text("'←' to stop", 150, 220);
  text("'↓' to stop", 250, 220);
  text("'→' to stop", 350, 220);
}

 

<reset タブ>

void reset(){
  if(mousePressed){
    box[0] = 0;
    box[1] = 0;
    box[2] = 0;
  }
}

 

動作をチェックするときは、1から7だとほとんど揃わないので、1から2あたりにしてみるといいかと思います。

 

Leave a Reply

Your email address will not be published. Required fields are marked *