2016-08-25 13 views
-2

シンプルなゲームのためにこのコードを書いています。数字をランダム化してからswitchで何かをしています。それは簡単ですが、私は1回のラウンドで1回しか仕事をしたくありません。私の場合、ラウンドは3つのタスクです。ラウンドが終わったら、変数をリセットして新しいラウンドをやり直したい。だからランダムですが、タスクは1ラウンドで2回起こることはありません。Objective-Cでランダムな繰り返しはありません

私はこのコードを書いたが、うまくいかなかった。 rand()を起動するボタンをクリックすると1番目のタスクが実行され、2番目のタスクが再びクリックされますが、3回目をクリックすると何も起こりません。 3番目のタスクは4回目のクリックで機能します。

int text; 
int x=3; //this is number of tasks in one round, so in switch i have 3 tasks 
int z=9999; 
int x0=1; //this mean's that task 0 can happen only once in one round 
int x1=1; 
int x2=1; 

-(void)reset{ // this is rof checking if x is <1, then it will reset all variables (start a new round) 
    if (x<1) { 
     x=3; 
     x0=1; 
     x1=1; 
     x2=1; 
    } 
} 

-(void)randomize{ 
    text = rand() % 3; //this wil get me a random number for switch 
    while(text==z) //this is because i don't want to have same number consecutively 
    {text = rand() % 3;} 
} 

- (IBAction)random:(id)sender { 
    [self randomize]; 

    switch (text) { 
     case 0: 
      if (x0!=0){ 
       //something will happen 
       z=0; 
       x0--; 
       x--; 
       [self reset]; 
       break; 
      } 
      else { 
       [self randomize]; 
      } 
     case 1: 
      if (x1!=0) { 
       //something will happen 
       z=1; 
       x1--; 
       x--; 
       [self reset]; 
       break; 
      } 
      else { 
       [self randomize]; 
       break; 
      } 
     case 2: 
      if (x2!=0) { 
       //something will happen 
       z=2; 
       x2--; 
       x--; 
       [self reset]; 
      } 
      else { 
       [self randomize]; 
      } 
    } 
} 

答えて

0

は、あなたの選択肢の集合とshuffleそれを取ります。次に、各タスクで、シャッフルされたセットの次の値に反復処理します。 Voila、繰り返しはありません。これにより、お客様のswitchケースではif/elseロジックが不要になります。

各ラウンドの終了時に、繰り返しインデックスを再シャッフルしてリセットします。いくつかのケースを繰り返すが他のケースは繰り返さないようにするには、それらのケースの複数のインスタンスをセットに追加します。リピートが許可されていても逐次的でない場合は、シャッフルされたセットを隣接するペアでチェックし、必要に応じて再シャッフルします。

+0

あなたの答えをたくさんありがとうございますが、私はよくそれを想像することはできません..私はObjective Cのコードでは新しいです –

+0

@OndřejVeverkaさて、[ObjCでシャッフルする方法はこちら](http://stackoverflow.com/a/) 56656/2166798)。残りは直感的でなければなりません。好奇心の外に、あなたがObjCを初めて使っているのであれば、代わりにスウィフトを学んでいない何らかの理由がありますか? – pjs

+0

アレイ学習の数時間後にありがとう、それは動作します! :) –

0

あなたのいずれかの場合にelse枝を打つ場合、あなたの新しい乱数に基づいて、タスクを実行しようとしないし、次にrandomへの呼び出しはへの応答を終了返しますrandomizeを呼び出しますクリック。これは、elseブランチの1つに当たったときに、現在のクリックに対して何も実行されていないことを意味します。

あなたのelseブランチでは、新しい乱数を取得し、それを使ってどのタスクを行うのかを判断する必要があります。ちょうどクリックに応答して行う必要があります。それをするために定義され...十分なヒントの私は願っています。

HTH

+0

ありがとうございました。 :)私はこのdocs.google.com/document/d/...と似ていますが、私はまだ死んでしまっています。 –

+0

リンクが完全ではありません。あなたはあなたが今試したことを示す補足文を質問に追加するか、新しい質問をよく聞くべきです。しかし、どちらかを実行する前に、デバッガを使用してコールを踏んだことがありますか?あなたは間違いなくその方法を見つけるべきです。 – CRD

関連する問題