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

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

Притом. Подход у нас разный. Но статья ваша полезная.

Вот напишите утилиту, которая бы плевала в трей, буде на сайте новое появилось. :)

Вот напишите утилиту, которая бы плевала в трей, буде на сайте новое появилось. :)

На Jave - не смогу. На PHP, по-моему, пару строчек всего. Ковырял даже такое задание когда-то...

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

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

Это ты где выгуглил?  Вот простой пример:

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

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

 На PHP, по-моему, пару строчек всего. Ковырял даже такое задание когда-то...

И всё забыли?.. 

Первое - в С нет ссылок, но есть указатели.

Второе - в С++ есть и ссылки  и указатели, но ссылки НЕ могут иметь значение null, а указатели могут иметь значение null

Третье - в Java нет указателей, но есть ссылки, которые могут, в отличии от ссылок в С++, иметь значения null.

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

mike, определись - ГДЕ ЗДЕСЬ ССЫЛКА?:

a - ссылка?

p - ссылка?

p.a - ссылка?

Третье - в Java нет указателей, но есть ссылки, которые могут, в отличии от ссылок в С++, иметь значения null.

Присвоение ссылке null означает, что объект по ссылке рано или поздно будет затерт Garbage Collector. Я же писал, нельзя со ссылкой работать, как с указателем. С ней нельзя действий выполнять - ссылке конкретных ячеек не даётся. В Java с памятью работать напрямую нельзя. Там только динамически выделенный адрес с маркерами.  

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

mike, определись - ГДЕ ЗДЕСЬ ССЫЛКА?

Не "определись", а тыкниЛогикаголовой:

p -- ссылка.

m -- указатель.

В Jave c памятью напрямую нельзя работать.

Поэтому на Джаве не пишу. Приходится работать с буферами, когда данные одного типа представлены другим типом, например, флоаты вордами, да ещё и задом наперёд.

Поэтому на Джаве не пишу. Приходится работать с буферами, когда данные одного типа представлены другим типом, например, флоаты вордами, да ещё и задом наперёд. 

Для подобного в Java есть классы - обёртки с нужными либами и методами. Хотя, конечно, сложности будут. 

И всё забыли?.. 

Код где-то в Сети есть. Готовый. Ну да, подзабыл. У PHP - другая философия, там нестрогая типизация и куча своих заморочек. Вообще, "не канают" скриптовые языки. 

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

Вот напишите утилиту, которая бы плевала в трей, буде на сайте новое появилось. :)

На Jave - не смогу. На PHP, по-моему, пару строчек всего. Ковырял даже такое задание когда-то...

Посылать что-то в трей Винды - и на PHP? Это как?

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

Страницы