Урок 20. Улучшаем нашу игру (часть 1)

Мы собираемся добавить некоторые функции, которые внесут разнообразие в нашу математическую игру, используя полученные на предыдущих уроках знания о методах и циклах. Давайте озвучим эти изменения:

  • Мы сделаем так, чтобы вопрос менялся каждый раз после попытки пользователя дать ответ;
  • Числа для нового вопроса будут подбираться случайным образом и основываться на сложности вопроса;
  • Внесем отображение очков и их обновление. Количество полученных очков будет зависеть от сложности вопроса;
  • Если игрок отвечает на вопрос неверно, то счетчик очков обнуляется и сложность возвращается к самому простому уровню.

 

Улучшаем графический интерфейс

Начнем с изменения графического интерфейса для включения озвученных изменений в наше приложение. Мы добавим один TextView для отображения очков и еще один TextView для отображения уровня сложности. Открывайте ваш проект с математической игрой и следуйте по пунктам:

  • Откройте файл activity_game.xml. Добавим новый TextView в самом низу интерфейса для отображения очков;
  • Перетащите элемент TextView из палитры элементов и разместите его внизу слева под тремя кнопками, расположенными там нами ранее:

Textview android studio

  • Теперь поменяем id этого элемента, чтобы получить доступ к нашему новому TextView из нашего кода Java. Убедитесь, что выбран именно тот TextView, который вы только что добавили, щелкнув по нему. Теперь в окне Property поменяйте текст в поле id на textScore:

property id textview

  • А свойство text поменяйте на «Score: »:

property text textview

  • Теперь добавьте еще один TextView элемент – справа от того, что мы добавили в предыдущих шагах. Придайте свойству id – textLevel, а свойству text – Level: :

new element textview

  • Сохраните проект.

Вносим изменения в код

Произведем несколько модификаций в существующем коде. После чего рассмотрим реализацию новых методов более подробно:

  • Открываем файл java;
  • Теперь уже нам нужно учитывать область видимости переменных и объектов, которые представляют наши графические элементы. Например, и textObjectPartA и textObjectPartB должны быть доступны методам, которые мы будем сейчас реализовывать. Для этого требуется перенести их объявление, так же как мы сделали с кнопками в предыдущих уроках, за пределы метода onCreate так, чтобы они стали доступны в классе GameActivity. Посмотрите на следующий код – переменные и объекты объявлены сразу же после начала класса GameActivity. Добавленные и перемещенные объявления выделены. Обратите внимание, что мы сразу же добавили объявления для наших новых двух TextView. Кроме того, мы объявили две переменные типа int, с помощью которых будем манипулировать отображение информации об очках и уровне сложности:
public class GameActivity extends AppCompatActivity implements View.OnClickListener{

    int correctAnswer;
    Button buttonObjectChoice1;
    Button buttonObjectChoice2;
    Button buttonObjectChoice3;
    TextView textObjectPartA;
    TextView textObjectPartB;
    TextView textObjectScore;
    TextView textObjectLevel;
    int currentScore = 0;
    int currentLevel = 1;

 

  • Весь код, который присваивает текст нашим объектам классов Button и TextView и код, который инициализирует часть нашего вопроса и присваивает значения для неправильных ответов будет изменён, поэтому удалите показанную ниже часть кода в своём проекте:
    //далее инициализируем переменные
    int partA = 9;
    int partB = 9;
    correctAnswer = partA * partB;
    int wrongAnswer1 = correctAnswer - 1;
    int wrongAnswer2 = correctAnswer + 1;
  • Этот кусок кода тоже необходимо удалить:
//Используем метод(функцию) setText, который описан в классах Button и TextView
//для вывода на графический интерфейс значений переменных.
textObjectPartA.setText("" + partA);
textObjectPartB.setText("" + partB);
//на данный момент нам не важно, какая кнопка будет
//показывать правильный ответ,
//а какой неправильный.
buttonObjectChoice1.setText("" + correctAnswer);
buttonObjectChoice2.setText("" + wrongAnswer1);
buttonObjectChoice3.setText("" + wrongAnswer2);

     

  • Для ясности, ниже показано, как должен выглядеть весь метод onCreate в данный момент. Жирным выделены требуемые для добавления два новых объекта, ссылающиеся на недавно добавленные элементы TextView:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //следующая строка загружает наш графический интерфейс на экран девайса
    setContentView(R.layout.activity_game);

/*Здесь мы создаём объекты, основанные на классе TextView и Button соответственно,
 а также связываем эти объекты к соответствующим элементам
 графического интерфейса, созданного нами ранее*/
    textObjectPartA =  (TextView)findViewById(R.id.textPartA);
    textObjectPartB =  (TextView)findViewById(R.id.textPartB);
    textObjectScore = (TextView)findViewById(R.id.textScore);
    textObjectLevel = (TextView)findViewById(R.id.textLevel);
    buttonObjectChoice1 =  (Button)findViewById(R.id.buttonChoice1);
    buttonObjectChoice2 =  (Button)findViewById(R.id.buttonChoice2);
    buttonObjectChoice3 =  (Button)findViewById(R.id.buttonChoice3);

    buttonObjectChoice1.setOnClickListener(this);
    buttonObjectChoice2.setOnClickListener(this);
    buttonObjectChoice3.setOnClickListener(this);

}//метод onCreate заканчивается здесь
  • Теперь удалим еще немного кода, который теперь нам не понадобится потому что мы собираемся сделать его более эффективным. Так, в методе onClick, в каждом case’е нашего switch’а удалите if и else операторы. Наш метод onClick сейчас должен выглядеть следующим образом:
@Override
public void onClick(View view) {

    //объявим новую переменную типа int, которую будем использовать в каждом case
    int answerGiven=0;

    switch (view.getId()) {
        case R.id.buttonChoice1:
            //присваиваем переменной answerGiven значение, содержащееся в buttonObjectChoice1
            answerGiven = Integer.parseInt("" + buttonObjectChoice1.getText());
            break;

        case R.id.buttonChoice2:
            //то же самое, что и предыдущий case, только используем следующую кнопку
            answerGiven = Integer.parseInt("" + buttonObjectChoice2.getText());
            break;

        case R.id.buttonChoice3:
            //то же самое, что и предыдущий case, только используем следующую кнопку
            answerGiven = Integer.parseInt("" + buttonObjectChoice3.getText());
            break;

    }
}
  • Сохраните проект.

 
Никаких новых действий, которые могут быть вам непонятны мы не провели. Но если есть вопросы, добро пожаловать в комментарии. Создание методов будет достаточно громоздким по содержанию информации, поэтому мы разбили на части этот урок. Далее перейдём непосредственно к методам. Как должен выглядеть код в проекте на данный момент можете подсмотреть в исходниках, которые доступны для скачивания ниже.

Скачать исходники