質問: 質問させていただきます 現在proccesingで簡単なサイコロを振るプログラムを作っています。 動きとしてはクリックされるまでランダムに出目を表示し、クリックすると出目の表示を停止させるプログラムを目標としています ``` float d=random(6); void setup() { size(250, 250); rect(50, 50, 150, 150); fill(255,0,0); ellipse(125,125,30,30); } void draw() { if(d==0){ fill(255,0,0); ellipse(125,125,30,30); }else if(d==1){ fill(0,0,0); ellipse(85,85,30,30); fill(0,0,0); ellipse(165,165,30,30); }else if(d==2){ fill(0,0,0); ellipse(125,125,30,30); fill(0,0,0); ellipse(85,85,30,30); fill(0,0,0); ellipse(165,165,30,30); }else if(d==3){ fill(0,0,0); ellipse(85,85,30,30); fill(0,0,0); ellipse(165,85,30,30); fill(0,0,0); ellipse(85,165,30,30); fill(0,0,0); ellipse(165,165,30,30); }else if(d==4){ fill(0,0,0); ellipse(125,125,30,30); fill(0,0,0); ellipse(85,85,30,30); fill(0,0,0); ellipse(165,85,30,30); fill(0,0,0); ellipse(85,165,30,30); fill(0,0,0); ellipse(165,165,30,30); }else if(d==5){ fill(0,0,0); ellipse(85,85,30,30); fill(0,0,0); ellipse(165,85,30,30); fill(0,0,0); ellipse(85,165,30,30); fill(0,0,0); ellipse(165,165,30,30); fill(0,0,0); ellipse(165,125,30,30); fill(0,0,0); ellipse(85,125,30,30); } } ``` ここからどうしたらいいか色々試してみたのですがうまくいきませんでした 回答やアドバイスを頂けると嬉しいです。
回答: ランダムな出目について =========== 他の回答にあるように`random`関数はfloat型(小数)の範囲で乱数を出力しますので、`int`関数で整数に丸め(切り捨て)ましょう。また、分かりやすくするために`d`に対して`+1`しても良いと思います。 ``` // 現状 float d = random(6); // これだと 0.0〜5.999.. の範囲から返される // 改善案 int d = int(random(6)) + 1; // これならば 1〜6 の範囲から返される int d = int(random(1, 7)); // これも同じ結果 ``` クリックでサイコロの回転(出目変化)を止める ====================== これを考えるには「プログラムの**状態**(=state)」というものを考える必要があります。 今回の場合は次の2状態が考えられます。 1. ランダムに出目を表示し続けている状態 2. 止まった出目が表示されている状態 ある状態が別の状態変化することを「状態遷移」と呼ばれています。 今回の場合は次の1つだけが考えられます。 * クリックすると「ランダムに出目が表示される(状態1)」から「止まった出目が表示される(状態2)」に遷移する 状態遷移が発生する場合は、今の状態が何か明確にしなければならないため専用の変数が設けられます。この変数のことを「状態変数」と呼ばれます。 Processingの場合は`d`変数のように状態変数を設け、`draw`メソッド内で状態に合わせた処理と、`mousePressed`メソッド内で状態遷移することで目的を達成できるはずです。 アドバイスとしては、「`draw`メソッド内で毎回サイコロを描き直す」です。 以下に大枠だけコードの例を示しますが、自力で作れるのが理想的です。 どうしても分からなければ参考にしてください。 ``` int state = 0; // 0=状態1、1=状態2 とする int d = int(random(6)) + 1; void setup() { size(250, 250); frameRate(10); // 1秒間にdrawが呼び出される回数 } void draw() { // 状態1ならサイコロの出目をランダムに変える if (state == 0) { ... } // 画面を毎回リセットする background(); // サイコロの背景を描き直す fill(255); rect(50, 50, 150, 150); fill(255,0,0); ellipse.. // サイコロの出目 if (d == 1) { ... } else if ... } void mousePressed() { // クリックされた→ここで状態遷移! } ```