問題
今度もまた数字ゲームだが,学生が別な問題を持ってた。「2人がお互いに最初は両手の指を1本ずつ立てた状態でスタートして,自分がどちらかの手で相手のどちらかの手を指すと,自分のその手の立っている指の数だけ,指された相手の手の指をさらに立てる,ということをお互いに繰り返していき,先に相手のどちらかの手の5本の指をすべて立てた方が勝ち,というゲーム」なのだそうだ。
とりあえず書いてみる
学生に,最初の部分だけ例を示してみた。ゲームの進め方は,次のようになるだろう。
- 自分のターンでは,まずどちらの手を選ぶかを入力
- 次に,相手のどちらの手を指すかを入力
- 相手の手の指の本数を再計算する
- 相手のターン
- …
画面表示と相手(コンピュータ)のターンの処理はまだ書いていないが,自分で書いてみてくださいね!
ここでも,データをどのように表現するかがポイントになってくる。さらにもう一つ,Processingならではの工夫のしどころとして,2つの情報をキーボードで入力する必要があるが,その度にkeyPressed()が呼ばれるため,入力モードを保持してキーが入力されるたびにモードを遷移させるアルゴリズムが必要である。変数の使い方として,値そのものが意味を持つ使い方と,もう一つ今回のように状態を表す使い方とがあるが,前者よりも後者の方が初心者にはわかりづらいようである。
int keyIndex = -1;
int you_right = 1;
int you_left = 1;
int cmp_right = 1;
int cmp_left = 1;
int choosednum = 0;
int mode = 0; //0 ... choose my hand, 1 ... choose cmp hand
void setup() {
size(320, 200);
noStroke();
background(0);
}
void draw() {
// keep draw() here to continue looping while waiting for keys
}
void keyPressed() {
if (key != 'r' && key != 'l') {
// error
keyIndex = -1;
} else {
if(mode == 0)[
swich(key){
case 'r':
choosednum = you_right;
break;
case 'l':
choosednum = you_left;
break;
default:
break;
}
mode ++;
}
else{
swich(key){
case 'r':
cmp_right += choosednum;
break;
case 'l':
cmp_left += choosednum;
break;
default:
break;
}
// Computer turn
//
choosednum = 0;
mode = 0;
}
}
}