Практикум: пишем вместе простенькую игру на Java

Сегодня я решил поделиться с вами кодом небольшой консольной викторины на языке программирования Java. Викторина называется «угадай число». Разумеется, это больше учебный пример, хотя, по его образу и подобию можно создать и что-то более серьёзное. Но мы сегодня таких задач перед собой ставить не будем.

Игра, конечно, имеет недостатки. В первую очередь, это отсутствие визуального интерфейса. Также нельзя в поле ввода вставлять буквы и пробелы — код «выбросит» исключение. Но при желании это нетрудно исправить, что, в общем, станет для вас неплохой тренировкой в разработке несложных конструкций Java. Конечно, статья не подойдет для тех, кто совсем не знает программирования на Java. Но тот, кто делает в нем даже первые шаги, всё поймет.

Итак, что же нам нужно? В первую очередь, конечно, для работы необходима среда IDE. Я использовал Eclipse, хотя и в Net Beance мой код вполне корректно работал и редактировался.

Затем нам нужно обеспечить импорт необходимых библиотечных классов. В них есть всё, что нужно для обработки нашего кода.

import java.io.*;

import static java.lang.System.out;

Открываем среду IDE и создаём новый проект, в нём — новый класс с любым названием и обязательно с методом main, в теле которого и находится наша программа. В каждой программе Java должен быть метод статический метод main — он ничего не возвращает, только указывает на код, который нужно запустить.

public static void main(String[] args) 

throws NumberFormatException, IOException, 

IndexOutOfBoundsException{

// TODO Auto-generated method stub

Затем создаём две целочисленных переменных ? i и l. Одну (i) инициализируем. Это будет переменная счётчика. Дело в том, что мы решили дать пользователю ровно 5 попыток на угадывание числа. После каждого неверного шага к нашей переменной i будет прибавляться «единичка». А если юзер не угадает число в пятый раз, мы скажем ему, что он проиграл.

int i = 0;

int l;

Теперь создаём массив (массив — это набор каких-либо значений: цифр, символов, строк, переменных). Он всегда пронумерован от нуля и до последнего элемента. Мы зададим массив вручную и пропишем там все шаги пользователя. При этом мы должны предусмотреть и все его ошибки. Ну, или почти все.

String[]notNotice = {

"\nпервый раз", "\nвторой раз", "\nтретий раз", "\nчетвёртый раз", "Это была "

+ "последняя попытка, вы проиграли ", "Вы ввели слишком большое число, вы ошиблись",

"Вы ввели слишком малое число, вы ошиблись", "Вы ввели верное число и выиграли!", "Введите"

+ " число ", "Угадайте число до 100 и введите сюда ", "Вы проиграли", "Вы ввели отрицательное "

+ "число, Введите число", "Вы ввели отрицательное число, Введите число"};

Теперь мы создаём пользователю поле для ввода цифр. Для этого нам понадобится класс с буфером — BufferedReader. А точнее, его экземпляр. Там, где написано (notNotice[9]), мы увидим подставленную из массива фразу «Угадайте число до 100 и введите сюда». Экземпляр класса StringBuilder и его метод .append позволят нам снизить нагрузку в программе. Дело в том, что Java так устроена, что каждую строку превращает в массив, и если мы начнём их все объединять простым оператором «+», то машина выполнит много лишних операций.

  BufferedReader reader = new BufferedReader

(new InputStreamReader(System.in));

StringBuilder lr = new StringBuilder();

    lr.append(notNotice[9]);

    lr.append(" ");

    lr.append("\nУ вас только 5 попыток!");

Вывод сообщения с помощью метода  println .

       out.println(lr.toString());

Метод Integer.parseInt позволит нам прочесть цифры из строки (строка и цифры для Java — разные типы данных и без точного указания, что читать, среда разработки выдаст ошибку).

                    int s = Integer.parseInt(reader.readLine());

                                   Random r = new Random();

Следующий шаг — вывод случайного числа. Его мы сделаем с помощью метода  .nextInt . И хотя, объективно, метод этот всё же не случайными категориями оперирует (в компьютере вообще нет ничего случайного), «раскусить» его всё-таки трудно.        

          int x = r.nextInt(100)+1;

                        l=x;    

Отсюда начинается самая «любимая» программистами часть работы — задание условий и циклов для компьютера. То есть, объяснение, что же ему надо считать? К примеру, этот цикл while с рядом условий if объясняет, что пока число попыток неверного ввода не превысит пять, пользователю нужно объяснять, что он ввёл либо слишком большое, либо слишком малое число. Здесь ему запрещается вводить отрицательные числа и, собственно, ноль. Для него выводятся соответствующие фразы и просьба повторить попытку.

                        while(i<=5) {      

Если пользователь выиграл, ему выводится соответствующее сообщение и игра заканчивается   (break;).   

                      if(s==l)

                      {

                    out.println(notNotice[7]);

                    break;

                      }               

Ноль вводить нельзя. Зачтется ошибочная попытка.                                                         

                      if(s==0){

                           StringBuilder mr = new StringBuilder();

                          mr.append(notNotice[9]);

                          mr.append(notNotice[11]);

                             out.println(mr.toString());

                             int k = Integer.parseInt(reader.readLine());

                       i++;

                       s=k;

                                 }                                            

Предупреждение о вводе слишком большого числа.                                    

                         if(s>x){

                          StringBuilder mr = new StringBuilder();

                        mr.append(notNotice[5]);

                        mr.append(" ");

                        mr.append(notNotice[i]);

                        mr.append(" ");

                        mr.append(notNotice[8]);

                       out.println(mr.toString());

                           int z = Integer.parseInt(reader.readLine());

                     i++;

                     s=z;

                         }

Предупреждение о вводе слишком малого числа.                                      

                     if(s<x&&s>0){

                      StringBuilder mr = new StringBuilder();

                   mr.append(notNotice[6]);

                   mr.append(" ");

                   mr.append(notNotice[i]);

                   mr.append(" ");

                   mr.append(notNotice[8]);

                  out.println(mr.toString());

                   int m = Integer.parseInt(reader.readLine());

                     i++;

                     s=m;

                     }          

Отрицательные числа вводить нельзя. Снова попытка пропала.                                                  

                     if(s<0){

                      out.println(notNotice[12]);

                      int v = Integer.parseInt(reader.readLine());

                      s=v;

                      i++;

                     }

После пятого неверного ввода выводится сообщение о проигрыше и игра прекращается. Кто скажет мне, почему здесь, в условии, стоит цифра «4», а не «5»? Ну-ну?

Правильно! Отсчёт-то мы с нуля начинали!

                   if (i==4 && s!=l){  

                         StringBuilder mr = new StringBuilder();                          

                        mr.append(notNotice[4]);

                     mr.append("\n");

                              out.println(mr.toString());

                              break;

                                         }

                     }

Вот и всё. Остаётся добавить, что разобрав описанный мною код (а это несложно), вы уже сможете немного работать с Java. Желаю удачи!

Эдуард ТРОШИН

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

и я не понимал -- зачем писать класс, если есть указатели на функции.

На Jave нет указателей. Там только классы. Везде. Это современный язык. 

Плоховато. Но ничего.

...Совершенно ничего сложного. Не понимайте буквально, Майк. На оставшуюся часть учебника у меня ушло четыре дня и было это почти год назад. сейчас бы я не стал этим заниматься. А если вы попросите, я вам без ошибок начерчу гораздо более сложный код колышком на песке, без всякой "Вижуал Штудии". Я, просто сделал статейку для начинающих. Ничего более сложного они, всё равно не поймут. 

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

Вкратце, вот что требуют: Exceptions & Errors, checked, unchecked, equals() & hashCode() methods, Generics, Collections, Garbage collector, Threads. Объёмчик, брат ты мой!

Есть сервисы тренингов, вроде http://www.examlab.org/ - там на 60-65% я уже прохожу. Говорят, это нормальный балл. Но хочется хотя-бы 80, чтобы быть увереннее. 

Аватар пользователя mike

На Jave нет указателей.

Слыхал.

Я, просто сделал статейку для начинающих ... они, всё равно не поймут.

Не считайте людей дурнями. Я, к примеру, на Джаве никогда не писал, но понял всё в первом чтении. А тот код, что я вам кинул -- распаковщик. Но если мне занадобится Джава -- освою. Без всяких курсов. 

>На Jave нет указателей. Там только классы. Везде. Это современный язык.

Указателей в смысле C нет, но есть ссылки!

Ну и вдогонку:

В Java ОБЪЕКТНАЯ ССЫЛКА ВСЕГДА СОДЕРЖИТ ЗНАЧЕНИЕ, УКАЗЫВАЮЩЕЕ НА ОБЪЕКТ или значение null. В Java ссылка не может содержать значение, указывающее на другую ссылку!

ВСЕ ПАРАМЕТРЫ В JAVA ПЕРЕДАЮТСЯ ПО ЗНАЧЕНИЮ. - хотя с этим некоторые спорят, но это не важно. :-)

Аватар пользователя mike

Указателей в смысле C нет, но есть ссылки!

Логик, я это знаю, спасибо. :)

mike > Логик, я это знаю

Тады кратко и чётко ответь - чем указатель отличается от ссылки?

Можно на примере языка C.

Ответь так, чтобы Петро понял.

Аватар пользователя mike

чем указатель отличается от ссылки?

Логик, иди читай букварь. Ссылка -- это тоже указатель, но на объект, а не его адрес.

mike > Ссылка -- это тоже указатель, но на объект, а не его адрес.

Первое - в C нет ссылок.

Второе  - "Ссылка -- это тоже указатель, но на объект" - куда же указывает ссылка? - Что означает "на объект"?

Значение указателя есть адрес.

А значение ссылки?

В Java ОБЪЕКТНАЯ ССЫЛКА ВСЕГДА СОДЕРЖИТ ЗНАЧЕНИЕ, УКАЗЫВАЮЩЕЕ НА ОБЪЕКТ или значение null. В Java ссылка не может содержать значение, указывающее на другую ссылку!

А что такое, по вашему объект? Кирпич, что-ли? Объект сам по себе может быть кучей ссылок. Ну вы даёте.

А значение ссылки?

Ссылка в JAVA - это ПЕРЕМЕННАЯ с адресочком. Фишка в том, что делать с ней ничего нельзя. Нельзя сравнить, будет лажа, инкрементировать нельзя. Присваивать нельзя - адрес присвоится. Для работы с объектами есть специальные операторы. А напрямую работать можно только с примитивными типами. И тогда нужно явно указать, что эта переменная int m = 10;


Не считайте людей дурнями.

? Это код для начинающих. Ими нормально будет понят.

Я, к примеру, на Джаве никогда не писал, но понял всё в первом чтении.

Ну и что? Я тоже не заметил, как распечатал себе задания для Си++. Когда всё порешал и дошёл до указателей, тогда только и обратил внимание. Синтаксис похож. 

А тот код, что я вам кинул -- распаковщик. Но если мне занадобится Джава -- освою. Без всяких курсов. 

На здоровье. Я причём?

Страницы