Это завершающая статья о программировании интеллектуальной игры на android. Осталось:
-вывод слова и количества жизней
-написать методы проверки букв
-программное рисование индикаторов правильности/неправильности выбранных букв (крестики и квадратики)
-вывод сообщений пользователю о конце игры
-загрузка нового слова
Сначала напишем метод начала новой игры и поместим его в конструктор класса:
-вывод слова и количества жизней
-написать методы проверки букв
-программное рисование индикаторов правильности/неправильности выбранных букв (крестики и квадратики)
-вывод сообщений пользователю о конце игры
-загрузка нового слова
Сначала напишем метод начала новой игры и поместим его в конструктор класса:
String word;//слово
String[] words={"ОДИН","ДВА","ТРИ","ЧЕТЫРЕ"};//база слов
String right_letters;//строка правильно угаданных букв
String wrong_letters;//строка неправильных выбранных букв
int word_length;//длина слова
int lives;
private void newWord() {
lives=10;//Даем юзеру 10 жизней
word=words[(int) (System.currentTimeMillis()%words.length)];//определяем слово случайным извлечением из базы
last_click_time=System.currentTimeMillis();
invalidate();//насильственно перерисовываем компонент( выполняем onDraw() ) - крайне важный метод
//делаем все буквы слова неизвестными
for (int i=0;i<MAX_LETTERS_ON_THE_WORD;i++){
bool[i]=false;
}
//Очевидно))
word_length=word.length();
right_letters="";
wrong_letters="";
} Теперь отобразим слово и количество жизней в onDraw():
double word_length_in_pixels=word_length*letter_size*k*c;//k и c - специальные поля класса, которые используются для определения длины слова. k-отношение кегля слова к кеглю обычных букв, c-отношение длины буквы к ее высоте static final int MAX_LETTERS_ON_THE_WORD=1000; boolean[] bool=new boolean[MAX_LETTERS_ON_THE_WORD];//индикатор известности/неизвестности буквы с конкретным порядковым номером в слове. Вместо неизвестных букв должны отображаться знаки вопроса
String new_word="";//Начинаем формировать слово, которое нужно вывести
paint.setTextSize((float) (letter_size*k));//Задаем его кегль
//Формируем слово побуквенно. Если очередная буква неизвестна, заменим ее знаком вопроса
for (int i=0;i<word_length;i++){
if(bool[i]==false){
new_word+="?";
}
else{
new_word+=word.charAt(i)+"";
}
}
//Обрадуем пользователя сообщением об успехе, если все буквы были им найдены
if(new_word.indexOf("?")==-1){
YouWin();
newWord();
}
//Пишем сообщение о количестве жизней и угадываемое слово
canvas.drawText(new_word, (float)(width/2-word_length_in_pixels/2), (float)(off_const*height/2), paint);
canvas.drawText("Lives: "+lives, (float)(width/2-word_length_in_pixels/2), (float)(off_const*height/1.2), paint);
Метод checkLetter():
private void checkLetter(String letter) {
boolean good_try;//индикатор того, правильная ли выбрана буква
if(word.indexOf(letter)!=-1){//если такая буква в слове есть
good_try=true;
//пройдемся по всему слову. Если буква слова совпадает с данной, изменим булевой флаг в массиве
for (int i=0;i<word_length;i++){
if(word.charAt(i)==letter.charAt(0)){
bool[i]=true;
}
}
}
else{
good_try=false;//попытка не удалась
}
//резюмируем ход игрока. Заносим букву в список правильных или неправильных
if(!good_try){
if(wrong_letters.indexOf(letter)==-1){
lives--;
wrong_letters+=letter;
}
}
else{
right_letters+=letter;
}
//Если жизней не осталось, пишем о проигрыше и начинаем игру по-новой
if(lives==0){
YouLose();
newWord();
}
//перерисовать
invalidate();
}
private void YouLose() {
Toast.makeText(context, "You have lost. Word is "+word, Toast.LENGTH_LONG).show();
}
private void YouWin() {
Toast.makeText(context, "You have won. Word is "+word, Toast.LENGTH_LONG).show();
}
Осталось только отрисовать индикаторы правильных и неправильных букв
//Границы рисования марки
double x1;
double y1;
double x2;
double y2;
for (int i=0;i<wrong_letters.length();i++){//обходим все неправильные буквы
int order=0;
//определяем порядок буквы в алфавите
for (int j=0;j<alphabet.length();j++){
if(alphabet.charAt(j)==wrong_letters.charAt(i)){
order=j;
}
}
int x;
int y;
//находим координаты ячейки буквы
x=order%rows;
y=(int) Math.floor((double)(order)/(double)(rows));
x1= (double)(x)*width/(double)(rows);
y1= (double)(y)*red_height/(double)(columns)+off_const*height;
x2= (double)(x+1)*width/(double)(rows);
y2= (double)(y+1)*red_height/(double)(columns)+off_const*height;
//Задаем параметры для креста
paint.setColor(wrong_color);//цвет (свойство класса)
paint.setStrokeWidth(mark_wigth);//толщина (свойство класса)
canvas.drawLine((float)(x1), (float)(y1), (float)(x2), (float)(y2), paint);
canvas.drawLine((float)(x1), (float)(y2), (float)(x2), (float)(y1), paint);
}
Совершенно аналогичным образом поступаем с массивом правильных букв.Скачать исходник игры
Комментариев нет:
Отправить комментарий