Главная » Создаем игру 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+. В процессе создания игры мы научились делать массу мелких и крупных полезных вещей, что не останется для вас незамеченным и может не радовать. Вы можете даже улучшить эту игру внедрением своих оригинальных новшеств, например, добавлением для отгадывания нескольких массивов слов с разных областей знания. Оригинал урока. Там же справа можно скачать все исходники к приложению. | |
|
Всего комментариев: 0 | |