Создаем игру Hangman. Часть 3. Взаимодействие с пользователем
Создаем игру Hangman. Часть 3. Взаимодействие с пользователем
Главная » Создаем игру Hangman. Часть 3. Взаимодействие с пользователем

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

Пользовательское взаимодействие с игрой включает в себя несколько аспектов, таких как определение победы или поражения и отсылка игрока к дальнейшему соответствующему событию. Также мы добавим в игру кнопку помощи. 

Как мы уже говорили в предыдущем уроке, в файле activity_game.xml представлены виселица и части тела человечка, которые при запуске игры должны быть скрыты. Они будут постепенно появляться при каждом ошибочном выборе игрока. 

Откроем файл GameActivity.java и добавим к импорту такие строки:

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v4.app.NavUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;

Далее внутри класса объявим 5 новых переменных:

//Изображения частей тела
 private ImageView[] bodyParts;
 //Количество частей тела
 private int numParts=6;
 //current part - будет добавлять часть тела при неправильном ответе
 private int currPart;
 //Количество символов в текущем слове
 private int numChars;
 //Количество правильно отвеченных букв
 private int numCorr;

С помощью переменной currPart мы будем приращивать по одной части тела каждый раз, когда пользователь будет ошибаться в выборе нужной буквы. Мы также прослеживаем количество символов в текущем слове и количество правильных ответов игрока для того, чтобы контролировать текущий прогресс пользователя в игре, и периодически проверять, выиграл или проиграл пользователь. 

В методе onCreate класса GameActivity, перед вызовом метода playGame настроим массив изображений из частей тела человечка и зададим в этом массив наши изображения. Эта часть кода также будет отвечать за то, в каком порядке будут появляться части тела человечка в том случае, когда игрок будет делать ошибочный выбор. Начинаем с головы и заканчиваем ногами:

bodyParts = new ImageView[numParts];
bodyParts[0] = (ImageView)findViewById(R.id.head);
bodyParts[1] = (ImageView)findViewById(R.id.body);
bodyParts[2] = (ImageView)findViewById(R.id.arm1);
bodyParts[3] = (ImageView)findViewById(R.id.arm2);
bodyParts[4] = (ImageView)findViewById(R.id.leg1);
bodyParts[5] = (ImageView)findViewById(R.id.leg2);

Немного усовершенствуем метод playGame. Добавим туда следующее:

currPart=0;
numChars=currWord.length();
numCorr=0;

Перед тем, как мы запустим игру, части тела нужно скрыть:

for(int p = 0; p < numParts; p++) {
 bodyParts[p].setVisibility(View.INVISIBLE);
 }

Теперь, при запуске приложения, оно должно выглядеть вот так:

Вид работающей игры

В файле letter.xml мы задавали нашим кнопками нажатие letterPressed. Теперь давайте добавим метод обработки этого нажатия в файл GameActivity.java:

 public void letterPressed(View view) {
 }

Когда пользователь будет нажимать по кнопкам для ответа. мы в методе letterPressed будем определять, какую букву выбрал игрок. Для этого добавим следующее:

String ltr=((TextView)view).getText().toString();

Далее, мы извлекаем из строки символ:

char letterChar = ltr.charAt(0);

Мы также делаем не активной кнопку выбранной буквы и обновляем фон изображения для того, чтобы показать игроку, что кнопка уже выбрана:

view.setEnabled(false);
view.setBackgroundResource(R.drawable.letter_down);

Следующим шагом мы создаем цикл по символам выбранного слова, в котором будет происходить проверка правильности выбора буквы пользователем:

boolean correct = false;
for(int k = 0; k < currWord.length(); k++) {
 if(currWord.charAt(k)==letterChar){
 correct = true;
 numCorr++;
 charViews[k].setTextColor(Color.BLACK);
 }
}

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

if (correct) {
 //Правильный ответ
 }
if (numCorr == numChars) {
 //Пользователь выиграл
 }

После завершения игры нужно сделать кнопки для выбора букв не активными. Для этого после метода letterPressed, создаем вспомогательный метод disableBtns:

public void disableBtns() {
 int numLetters = letters.getChildCount();
 for (int l = 0; l < numLetters; l++) {
 letters.getChildAt(l).setEnabled(false);
 }
 }

В это методе мы создаем цикл по элементам адаптера и отключаем все кнопки. Когда пользователь выигрывает игру, мы вызываем метод disableBtns и показываем AlertDialog (пройдите по ссылке, если хотите изучить AlertDialog отдельно). В диалоговом окне мы поздравляем игрока с победой и предлагаем сыграть еще. 

 if (numCorr == numChars) {
 //Отключаем кнопки
 disableBtns();

 //Показываем Alert Dialog
 AlertDialog.Builder winBuild = new AlertDialog.Builder(this);
 winBuild.setTitle("Ура!");
 winBuild.setMessage("Вы выиграли!\n\nПравильный ответ:\n\n"+currWord);
 winBuild.setPositiveButton("Играть еще",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int id) {
 GameActivity.this.playGame();
 }});

 winBuild.setNegativeButton("Выход",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int id) {
 GameActivity.this.finish();
 }});

 winBuild.show();
 }

Далее нужно проверить случай, когда пользователь ответил неправильно, но все еще имеет шанс для дальнейшего ответа. Внутри блока else if мы показываем очередную часть тела и увеличиваем количество неправильных ответов на 1:

if (correct) {
 //Правильный ответ

 } else if (currPart < numParts) {
 //Какой либо ответ не правильный
 bodyParts[currPart].setVisibility(View.VISIBLE);
 currPart++;
 }

Теперь, после блока else ifнужно настроить действие программы на случай, если игрок ответил неправильно и проиграл. Также как и в предыдущем случае победы, отключаем все кнопки и показываем игроку Alert Dialog с сообщением о том, что он продул, показываем здесь, какой ответ был правильным и предлагаем сыграть еще:

else{
 //Игрок проиграл
 disableBtns();

 //Показываем Alert Dialog
 AlertDialog.Builder loseBuild = new AlertDialog.Builder(this);
 loseBuild.setTitle("Ой");
 loseBuild.setMessage("Вы проиграли!\n\nПравильный ответ:\n\n"+currWord);
 loseBuild.setPositiveButton("Играть еще",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int id) {
 GameActivity.this.playGame();
 }});

 loseBuild.setNegativeButton("Выход",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int id) {
 GameActivity.this.finish();
 }});

 loseBuild.show();
 }

На этом настройка взаимодействия пользователя с игрой окончена. Осталось только немного подправить интерфейс и можно играть!

Последний штрих урока посвящен настройке панели action bar приложения. Мы добавим в нее кнопку помощи игроку. В файле GameActivity.java внутри метода onCreate добавьте строку:

getActionBar().setDisplayHomeAsUpEnabled(true);

Она позволит возвращаться назад в MainActivity. Напомню, что в файле манифеста мы определили MainActivity.java, как родительский класс для GameActivity.java. Это означаем, что при выходе с GameActivity.java пользователь будет попадать в MainActivity.java

Давайте немного отредактируем меню нашего приложения (вспоминаем урок по работе с меню приложения). Открываем файл menu_main.xml и добавим туда следующее:

<item
 android:id="@+id/action_help"
 android:icon="@drawable/android_hangman_help"
 android:showAsAction="ifRoom"
 android:title="Помощь"/>

Таким образом мы добавили на панель приложения кнопку помощи пользователю. 

Возвращаемся опять в файл GameActivity.java. Установим на этот экран в панель управления action bar меню с кнопкой помощи, добавив следующий метод:

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
 getMenuInflater().inflate(R.menu.menu_main, menu);
 return true;
 }

Добавим ниже еще один метод, который описывает, что будет происходить при нажатии пользователем на кнопки "назад", "помощь":

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
 switch (item.getItemId()) {
 case android.R.id.home:
 NavUtils.navigateUpFromSameTask(this);
 return true;
 case R.id.action_help:
 showHelp();
 return true;
 }

 return super.onOptionsItemSelected(item);
 }

Мы видим ругательство на строку showHelp(). Не обращайте внимания, ниже мы это исправим.

Для использования кнопки помощи необходимо добавить еще одну переменную вверху класса GameActivity.java:

private AlertDialog helpAlert;

И на конец, опишем вспомогательный метод для кнопки помощи (исправим то само ругательство, о котором упоминалось выше):

public void showHelp() {
 AlertDialog.Builder helpBuild = new AlertDialog.Builder(this);
 
 helpBuild.setTitle("Помощь");
 helpBuild.setMessage("Угадайте слово, выбирая буквы.\n\n"
 + "У вас есть только 6 попыток!");
 helpBuild.setPositiveButton("OK",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int id) {
 helpAlert.dismiss();
 }});
 helpAlert = helpBuild.create();
 
 helpBuild.show();
 }

Что же, поздравляю с завершением работы над созданием собственной версии популярной игры Hangman! Тестируйте игру на эмуляторе/устройстве с версией Android 4+. В процессе создания игры мы научились делать массу мелких и крупных полезных вещей, что не останется для вас незамеченным и может не радовать. Вы можете даже улучшить эту игру внедрением своих оригинальных новшеств, например, добавлением для отгадывания нескольких массивов слов с разных областей знания. 

Оригинал урока. Там же справа можно скачать все исходники к приложению.

Категория: Уроки программирования | Просмотров: 610 | Добавил: Oleg | Теги: создаем игру, Hangman, Программирование, Android игры | Рейтинг: 0.0/0
Всего комментариев: 0
avatar