2014-09-26 6 views
0

Я изучаю разработку Android и пытаюсь создать простую игру для игры в Монти Холл.Создание двух одинаковых случайных чисел, а другое -

В принципе, у вас есть три двери на выбор, а одна дверь имеет машину за ней, а у каждого из двух других есть коза за ней.

Я сделал цикл while с условием, чтобы три случайных числа не были равны 0 (что означает коза) или не будет иметь больше, чем на переменной со значением 1 (автомобиль).

Но когда я запускаю программу и перехожу к этой операции, она застрянет на черном экране без ошибки , как будто она находится в бесконечном цикле.

Правильно ли логика в цикле do while?

public class Game extends Activity{ 

    ImageView image1, image2, image3; 

    int[] images={R.drawable.gaot1, R.drawable.eleanormustang};  
    Random r = new Random(); 

    int i1 = 0; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.gameactivity); 
     picClicked(); 
    } 

    public void picClicked() { 
     do { 
      i1 = r.nextInt(2 - 0) + 0; 
      i2 = r.nextInt(2 - 0) + 0; 
      i3 = r.nextInt(2 - 0) + 0; 
     } while ((i1 & i2 &i3) ==0 || ((i1 & i2) & (i1 & i3) & (i2 & i3)) ==1); 

     image1 = (ImageView) findViewById(R.id.ImageView1); 
     image2 = (ImageView) findViewById(R.id.ImageView2); 
     image3 = (ImageView) findViewById(R.id.ImageView3); 

     image1.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //image1.setImageResource(R.drawable.gaot1); 
       image1.setImageResource(images[i1]); 
      } 
     }); 

     image2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       image2.setImageResource(images[i2]); 
      } 
     }); 

     image3.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       image3.setImageResource(images[i3]); 
      } 
     }); 
    } 

} 
+3

Почему бы не создать случайное число от 1 до 3, а затем назначить эту дверь машине, а две другие козе? Это полностью исключает цикл while и делает логику намного легче отслеживать и отлаживать. –

+0

@JasonMArcher Ya, знаю, что это имеет смысл :) – AMS91

+0

Иногда получение кода, отформатированного на веб-сайте, может быть сложным. Но здесь, на SO, вам просто нужен 4-сегментный отступ. :) – JasonMArcher

ответ

3

Вы не хотите генерировать три случайных числа. Подумайте об этом так: вам нужно одно случайное число, указывающее, какая дверь за вами стоит, а затем вы используете это случайное число для генерации i1, i2, i3.

Так

int door = r.nextInt(3); 
i1 = (door==0 ? 1 : 0); 
i2 = (door==1 ? 1 : 0); 
i3 = (door==2 ? 1 : 0); 

будет делать это без необходимости какой-либо петли.

+0

Я не мог предложить его лучше, +1 –

+1

WOW !!! Я даже не был близок, чувствую себя глупо. Спасибо за помощь человеку, оцените его. – AMS91

+0

@ AMS91 Спасибо! Пожалуйста, нажмите на галочку, чтобы принять ответ, если он был полезен (вы также получаете очки репутации). –

0

Как ответ на chiastic-security, ваш подход плох. Однако это сработало бы, за исключением того, что вы также допустили логическую ошибку. Ваше условие while проверяет, является ли побитовое И i1, i2 и i3 равным 0 или 1. Это всегда, когда числа равны 0 или 1. Вместо этого вы можете повторить цикл, если сумма не равна 1.

do{ 
    ... 
} while (i1 + i2 + i3 != 1); // so only (1,0,0), (0,1,0), or (0,0,1) passes 
Смежные вопросы