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

Майк, неужто тебе интересно?

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

Mike >Не совсем так. То, что до точки -- это ссылка. Например, можно написать: (*m).b = 2; Здесь указатель выполняет роль ссылки.

mike, (*m) - это ВЫРАЖЕНИЕ!!! - оно не может быть ССЫЛКОЙ!!!!

О, мама - мия.

НЕТ в языке С ССЫЛОК, НЕТУ!!!

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

Полез таки в Википедию и MSDN.

http://ru.wikipedia.org/wiki/Ссылка_(C++)

Да, ссылок в С нет. В С++ есть. Зачем - не знаю, по мне так - рюшешки.. 

В pure С на ссылочную конструкцию типа int n; int &k = n; компилятор будет матерится.

А в Паскале в таком случае ссылки в таком их понимании есть, ибо конструкция 

var

A : Word;

B: Word absolute A;

валидна и это работает так же, как в C++. 

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

НЕТ в языке С ССЫЛОК, НЕТУ!!!

Готовых, как в С++? Ишь, чего захотели. Готовых, увы, нет. Но организовать их легко. Сорри, сегодня дофига работы, но подумайте сами, что запрещает после создания (именно создания, а не объявления) композитного объекта через амперсанд присвоить его адрес нескольким указателям и далее обращаться к членам объекта через (*hehe).member или (*haha).member,  или просто к объекту. Итак, с алиасами понятно? Или ещё нет? А для танкистов подскажу, что простой ругаемый всеми Си позволяет свернуть (*hehe) в, например, ssylka или в ssylka&. Что языковыми средствами C++ и сделано, плюс ограничены кой-какие вольности обращения с ними. :) Поэтому ссылки -- это указатели, но кастрированные. Не надо думать, что ссылки -- это Бог весть что.

Сорри, сегодня дофига работы

Да уж, коньяк остыл с весны, я уж не говорю про многолетней выдержки проект - долгострой с обзором мангала:-)

Не надо думать, что ссылки -- это Бог весть что.

Да, никто и не думает, кроме вас. Много ли вы думаете, поднося ложку ко рту? Она есть - и всё тут! Пустой разговор, кому это нужно...

> Много ли вы думаете, поднося ложку ко рту? Она есть - и всё тут!

Ссылок в языке С нет. Ложек в японской кухне нет!

savely > Да, ссылок в С нет. В С++ есть. Зачем - не знаю, по мне так - рюшешки.


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

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

Пустой разговор, кому это нужно...

Мне, чтобы причесаться. Ссылок нет, но их легко сделать. Логик пусть пишет, что хочет. На то он и Логик -- цепляться к словам. А насчёт коньяка с мангалом -- попозже, сейчас реально загружен. Подрядился на халтурку, надо добить.

А насчёт коньяка с мангалом -- попозже

Понятно, что никогда:-) 

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

Понятно, что никогда:-)

Зачем же так. Встретимся! Сейчас реально не могу -- даже на врачей забил. Возможно, зря.

Страницы