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

Ссылки ввели в С++ для возврата из функции больше одного параметра.

Ага. Типа в C нельзя вернуть указатель на композитную переменную.

ИМХО в С++ ссылки юзают только для удобства. Например, дабы оперировать с любыми глобалами того же типа, что и ссылки в аргументах функции. Писанины меньше, и компилятор предостережёт от неправедных действий.

Страницы