

質問させていただきます

現在proccesingで簡単なサイコロを振るプログラムを作っています。  
動きとしてはクリックされるまでランダムに出目を表示し、クリックすると出目の表示を停止させるプログラムを目標としています

[code]

    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);
        } 
      }
    
[/code]

ここからどうしたらいいか色々試してみたのですがうまくいきませんでした  
回答やアドバイスを頂けると嬉しいです。


CC BY-SA 3.0
2017-02-20T01:57:34.337
32797
2017-05-10T22:32:55.717
2017-02-20T08:21:26.047
19110
20737
question
processing
Proccesingのプログラム作成について


`random()`
関数の返り値がfloat、つまり小数だという所がバグの原因になっていそうです。返り値が小数なのに`==`で整数値と比較しても期待した動作にはなりません。この場合は
`int(random(6))`
とするなどして整数値に丸めるのが良いでしょう（[ドキュメント](https://processing.org/reference/random_.html)にもそう書いてあります）。

以下は、全体の組み方のおおまかな例です。詰まったら参考にしてください。

> 1\. 「サイコロが回っている」と「サイコロが止まっている」という状態を表すための変数を1つ作ります。  
>  2\. マウスがクリックされたらこの状態変数をチェックして切り替えます。これには `mouseClicked()` を使う方法があります。  
>  3\. `draw()` の中では状態変数をチェックして、「サイコロが回っている」ならサイコロの値 `d`
> を切り替えます。必要なら、タイマーを使ってサイコロが切り替わるスピードを遅くすることもできるでしょう。  
>  4\. 描画する前には `background()` 関数などを使って画面をリセットする必要があるでしょう。


CC BY-SA 3.0
2017-02-20T06:57:31.483
32803
2017-02-20T06:57:31.483
19110
32797
answer


# ランダムな出目について

他の回答にあるように`random`関数はfloat型（小数）の範囲で乱数を出力しますので、`int`関数で整数に丸め（切り捨て）ましょう。また、分かりやすくするために`d`に対して`+1`しても良いと思います。

[code]

    // 現状
    float d = random(6); // これだと 0.0〜5.999.. の範囲から返される
    
    // 改善案
    int d = int(random(6)) + 1; // これならば 1〜6 の範囲から返される
    int d = int(random(1, 7));  // これも同じ結果
    
[/code]

# クリックでサイコロの回転（出目変化）を止める

これを考えるには「プログラムの **状態** （=state）」というものを考える必要があります。  
今回の場合は次の2状態が考えられます。

  1. ランダムに出目を表示し続けている状態
  2. 止まった出目が表示されている状態

ある状態が別の状態変化することを「状態遷移」と呼ばれています。  
今回の場合は次の1つだけが考えられます。

  * クリックすると「ランダムに出目が表示される（状態1）」から「止まった出目が表示される（状態2）」に遷移する

状態遷移が発生する場合は、今の状態が何か明確にしなければならないため専用の変数が設けられます。この変数のことを「状態変数」と呼ばれます。  
Processingの場合は`d`変数のように状態変数を設け、`draw`メソッド内で状態に合わせた処理と、`mousePressed`メソッド内で状態遷移することで目的を達成できるはずです。  
アドバイスとしては、「`draw`メソッド内で毎回サイコロを描き直す」です。

以下に大枠だけコードの例を示しますが、自力で作れるのが理想的です。  
どうしても分からなければ参考にしてください。

[code]

    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() {
        // クリックされた→ここで状態遷移！
    }
    
[/code]


CC BY-SA 3.0
2017-02-25T10:31:42.990
32942
2017-02-25T10:31:42.990
19925
32797
answer