Translate

вторник, 22 мая 2012 г.

Пишем игру "виселица" на android. Завершение..

  Это завершающая статья о программировании интеллектуальной игры на 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);
        }
Совершенно аналогичным образом поступаем с массивом правильных букв.


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

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...