Практикум: пишем вместе простенькую игру на 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!

Читайте также

 

Комментарии

Страницы

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

Или не про тот трей речь?

Про тот, про тот. :)

Петро > Присвоение ссылке null означает, что объект по ссылке рано или поздно будет затерт Garbage Collector.

Петро, ты, НАВЕРНОЕ, хотел сказать, что: Присвоение ссылке null означает, что объект НА КОТОРЫЙ ссылалась(был доступен по этой ссылке) ЭТА ссылка, рано или поздно будет затерт Garbage Collector.

Я так понял?

Mike>p -- ссылка. m -- указатель.

Итак:

struct my
{
int a;
int b;
};
struct my p;
p.a = 1; // доступ по ссылке

p - НЕ ЕСТЬ ССЫЛКА, p - есть имя переменной структурного типа.

В С НЕТ ССЫЛОК!

mike > Вот простой пример:

struct my
{
int a;
int b;
};
struct my p;
struct my &m;
p.a = 1; // доступ по ссылке
m->b = 2; // доступ по указателю

---------------

mike, похоже вместо строки:

struct my &m;

надо писать строку:

struct my *m;

Не так ли?

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

mike, похоже вместо строки:

struct my &m;

надо писать строку:

struct my *m; Не так ли?

Да, верно, спросонья бес попутал, спасибо за поправку. Но это ничего не меняет. m -- указатель, т.е. адрес, хранящий адрес объекта, а не сам объект. К указателю применима арифметика. Например, при инкременте указателя хранимый адрес сместится на размер объекта. А вот p -- это адрес объекта, т.е. то, что в народе называют ссылкой. Его модифицировать нельзя. Тебе нравится его считать именем? Пожалуйста.

Присвоение ссылке null означает, что объект НА КОТОРЫЙ ссылалась(был доступен по этой ссылке) ЭТА ссылка, рано или поздно будет затерт Garbage Collector.

Ой Логик, это будет уже сложно:-) Ссылок на объект может быть несколько и присваивая им нулл мы снижаем ссылочную релевантность объекта и вероятность, что коллектор его зачистит повышается.

Хотя, коллектор может и не сработать сразу, если все потоки будут заняты, поскольку он имеет в системе самый низкий приоритет. Поэтому, желательно контролировать ситуацию, чтобы не перегрузить память. Есть специальные инструменты для этого. Это один из важных вопросов в Javа.  

Но в целом я хотел сказать, что со ссылками мало что можно делать, не вызывая самих объектов. Как там, не кипит?:-)

mike > К указателю применима арифметика. Например, при инкременте указателя хранимый адрес сместится на размер объекта.

Указатели НЕ обсуждаем - это типа ясно. :-)

>А вот p -- это адрес объекта, т.е. то, что в народе называют ссылкой. Его модифицировать нельзя. Тебе нравится его считать именем? Пожалуйста.

В народе, говоришь. Smile

Нет, в С нет ссылок. - а имена есть. :-)

Петро > Ой Логик, это будет уже сложно:

Петро, твоё предложение: "Присвоение ссылке null означает, что объект по ссылке рано или поздно будет затерт Garbage Collector."

Если его прочитать по русски, то вот это - "означает, что объект по ссылке" - если ссылке ПРИСВОИТЬ значение null, то об ОБЪЕКТЕ ПО ССЫЛКЕ речь то вести уже НЕЛЬЗЯ, ибо ссылка, ПОСЛЕ присвоения ей значения null, УЖЕ никуда НЕ ведёт!

Поэтому по русски правильно писать именно так:

Присвоение ссылке null означает, что объект, НА КОТОРЫЙ ссылалась(был доступен по этой ссылке) ЭТА ссылка, рано или поздно будет затерт Garbage Collector.


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

в С нет ссылок. - а имена есть. :-)

Не совсем так. То, что до точки -- это ссылка. Например, можно написать:

(*m).b = 2;

Здесь указатель выполняет роль ссылки.

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

Майк, неужто тебе интересно? Я вообще не знаю термина "ссылка", кроме как в Web. И мне это не мешает жить. 

В языках типа Java - ну пусть там будет "ссылка". Довольно абстрактная вещь, называй как угодно... 

Страницы