Рандомная выборка кнопок

228
22 сентября 2018, 21:50

Игра "крестики- нулики". Создал 9 кнопок, разместил в массиве, чтобы объявить и раздать id. Не могу додуматься , как сделать, чтобы после моего нажатия на кнопку (чтобы ввести Х), на другой случайной кнопке появился нулик. Понимаю, что нужно использовать Math.random().Только как... Простой вопрос, стыдно задавать, прошу о напутствии пожалуйста.

  public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button button[]= new Button[9];
Button b1pl,b2pl;
private Integer allid[]={
        R.id.button1,
        R.id.button2,
        R.id.button3,
        R.id.button4,
        R.id.button5,
        R.id.button6,
        R.id.button7,
        R.id.button8,
        R.id.button9};
boolean first= true;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b2pl = (Button) findViewById(R.id.b2pl);
    b2pl.setOnClickListener(this);
    b1pl = (Button) findViewById(R.id.b1pl);
    b1pl.setOnClickListener(this);
  for (int i=0;i<allid.length;i++){
      button[i]=findViewById(allid[i]);
      button[i].setOnClickListener(this);
  }
}

@SuppressLint("ResourceAsColor")
@Override
public void onClick(View view) {
    Button current = new Button(this);
    current.setTextSize(24);
    switch (view.getId()){
        case R.id.b1pl:
            if (first){
                current.setTypeface(null,Typeface.BOLD);
                current.setTextColor(R.color.colorPrimaryDark);
                current.setText("X");
            }
            else {
                current.setText("0");
                current.setTextColor(R.color.colorPrimaryDark);
            }
            first=!first;
    }
}
}
Answer 1

Конкретно по вашему вопросу могу посоветовать следующее:

Создать свой собственный класс MyButton с, например, такими функциями:

psfi BLANK = 0;
psfi CROSS = 1;
psfi ZERO = 2;
int state;
void setState(int state){
    String text = "";
    switch (state){
        case CROSS: text="X"; break;
        case ZERO: text="0"; break;
    }
    this.setText(text);
    this.state = state;
}
int getState(){
    return state;
}

В активити нужно добавить все кнопки в ArrayList<MyButton> buttons

и получать случайную пустую таким методом:

MyButton getRandomButton(){
   int random = 0;
   do {
       random = new Random().nextInt(buttons.size());
   } while (buttons.get(random).getState() != MyButton.BLANK);
   return buttons.get(random);
}

где нужно:

getRandomButton().setState(MyButton.CROSS);
Answer 2

В данной реализации, полагаю, вам нужно хранить id кнопок в некотором списке. Каждый раз, когда пользователь нажимет на любую кнопку - вы удаляете ее id из этого списка, генерируете случайное число от 0 до N(длина списка), ищите этот элемент, устанавливаете значение нолика в эту случайную ячейку, удаляете id этой кнопки из общего листа. По-правде сказать, играть с таким компьютером будет скучно) Советую вам задуматься не о рандоме, а о реализации компьютера. Кристики нолики игра простая - она ограничена M кол-во вариантов.

Опять-таки общие советы новичкам. Почитайте про binding (исчезнет необходимости писать findViewById). Пишите код по ООП (не все в одном методе). Ваша задача научиться и охватить как можно больше, а не написать крестики-нолики - помните это! Удачи.

READ ALSO
Не работает overflow: hidden

Не работает overflow: hidden

Хай! не работает свойство overflow: hidden в меню примера

249
Как сделать не стандартный css слайдер?

Как сделать не стандартный css слайдер?

Хочу сделать слайдер с radio button, чтобы зеленые слайды вверху перемещались на определенное расстояние влево, за экраном есть еще слайды, и чтобы...

249
Как прикрепить текст к низу с расширением вверх?

Как прикрепить текст к низу с расширением вверх?

Ка сделать чтобы было как на картинке, чтобы в зависимости от высоты 2-ого снизу поля, 3-е снизу меняло свою позицию

224
javascript создание модели данных

javascript создание модели данных

Вопрос общий, о том как правильно делать

238