Блок 1. Раздел 1. Тема 2

Делаем текстовую игру
в вопросы и ответы

Давайте сразу сделаем небольшую текстовую игру. Мы просто распечатаем вопрос, считаем число с клавиатуры, и сравним его с правильным ответом. В дальнейших темах мы разберем подробнее каждое из действий, а пока что познакомимся с ними в целом на полезном примере.
Сначала напишем псевдокод нашей будущей программы. Псевдокод - упрощенный код, который послужит для понимания происходящего. Если программа "не видна" во всех деталях сразу, советую писать сначала псевдокод - так легче понять, что происходит, чтобы потом уже перевести все в настоящий Java код.
Программа 
начало 
          распечатай строчку "Привет!" 
          распечатай строчку "Сколько будет 2*2?" 
          считай число х с клавиатуры 
          если х равен 4, то 
                    распечатай строчку "Умён!" 
          иначе 
                    распечатай строчку "Бывает.." 
конец 
Как видите, псевдокод понятен интуитивно. Компьютер будет просто исполнять команду за командой, и сначала поприветствует пользователя, спросит его вопрос, считает число с ответом, сравнит, правильный ли ответ. Если правильный, то похвалит, а если нет, то нет.

Теперь прочтите соответствующий код на Java. Кстати // означает комментарий - он не включен в код самой программы и служит только для пояснения.
package javaapplication_book_1_1_2_text;

// импортируем стандартный класс Scanner, 
// он будет нужен для считывания числа с клавиатуры
import java.util.Scanner;

// Сначала стандартная шапка с именем класса и проекта
public class JavaApplication_book_1_1_2_text {

    public static void main(String[] args) {        
// говорим "Привет" и спрашиваем вопрос       
// лучше поначалу на английском, русский нужно задавать в настройках проекта
        System.out.println ("Hello!"); 
        System.out.println ("What is 2*2?");
        
// Создаем свой Сканер и называем его myscan
// Scanner - класс, в котором написано все для считывания (сканирования) с клавиатуры
// подробнее расскажем в следующих уроках, пока что можем пользоваться myscan.
        Scanner myscan = new Scanner (System.in); // new значит "создать новый" Scanner 
        
// int сокращение от integer - целое число.
// Заведем целое число и назовем его x
// приравняем его в начале к нулю.
        int x = 0; // число с именем и типом называется "переменная"
        
// запустим сканер клавиатуры myscan
// scan.nextInt () - означает запустить функцию nextInt для чтения "следующего int",
        x = scan.nextInt (); // приравнять переменную x значению scan.nextInt ()
        
// Блок if-else, то есть "если верно условие, то делай { ...} иначе делай {...}
// в скобках {  } указывается код, который выполнится в первом или втором случае
// Заметьте разницу: x = 4 значит изменить значение переменной x на 4
// При этом x== 4 значит сравнить значение x с четверкой
        if (x == 4) { // если ответ правильный, то распечатать похвалу
            System.out.println ("Good!");
        }else { // иначе распечатать, что пользователь ошибся
            System.out.println ("Bad..");
        } // конец else
        
    } // конец main

} // конец класса и так как больше в программе кода нет, то и программы тоже
Сравните псевдокод и Java код. По сути они одинаковые, хоть Java код и выглядит значительно сложнее. Просто в Java много специфических обозначений - они нужны, чтобы программа точно знала, что ей делать, ведь обычная русская речь бывает неоднозначной, сложной для понимания машиной.

Конечно, если вы видите код на Java в первый раз, то слишком много нового - не волнуйтесь, каждое из введенных понятий мы разберем в следующих темах. Сейчас хотелось просто сразу показать "боевую" программу, делающую что-то полезное.

Еще в Java нам нужны "действующие лица" - объекты. В данном случае нам пригодился объект класса Scanner, который мы сами назвали myscan. То есть мы говорим "создать myscan - некоторый Сканер, который будет читать текст с клавиатуры". Это сделано в следующей строчке кода:
Scanner myscan = new Scanner (System.in);
эта строчка читается как "Сканер myscan объявляется и будет равен новый-new Сканер с параметром System.in" . Именно этот System.in и указывает, что мы читаем с клавиатуры. System.in - поток ввода с клавиатуры. Кроме этого в скобках можно было указать чтение из файла или по каналу связи через интернет.
Аналогично мы создали переменную x, чтобы хранить целое число. Сначала мы положили его равным нулю:
int x = 0; // объявить целое число с именем x и приравнять его в начале к нулю
Затем изменяем его значение - приравниваем тому, что вернет нам функция "считать с клавиатуры целое число" myscan.nextInt() , принадлежащая нашего сканеру под названием myscan:
x = scan.nextInt (); // приравнять переменную x значению scan.nextInt ()
Результат работы функции myscan.nextInt() будет подставлен прямо в код в место вызова функции. То есть вместо myscan.nextInt() будет стоять 4, если пользователь ввел 4, или другое число, если пользователь ввел что-то другое. Именно это нам нужно проверить в блоке сравнения if-else:
if (x == 4) { // если верно, что x равен 4, то распечатать похвалу
            System.out.println ("Good!");
}else { // иначе распечатать, что пользователь ошибся
            System.out.println ("Bad..");
} // конец else
В результате получилась наша первая полезная программа - она проверяет, все ли знают, сколько будет дважды два :)

В следующих темах мы подробнее разберем каждый из использованных инструментов - как создавать переменные и проводить с ними вычисления, как устроен Scanner, как работать с блоком if-else и многие другие.

А сейчас ответьте на пару вопросов для лучшего понимания пройденного.
Вопрос 1. Что нужно изменить в этом коде, чтобы программы спрашивала и проверяла не сколько будет дважды-два, а скажем 5 умножить на 6?
Нужно поменять строчку с вопросом во второй распечатке System.out.println ("What is 5*6?") . Также в операторе if нужно поставить сравнение с новым правильным ответом:
if (x == 30) {...}
Вопрос 2. Как бы вы сделали программу, которая спрашивает сначала спрашивает и проверяет первый вопрос, а потом еще и второй?
В дальнейшем мы пройдем, что можно сделать функцию - выделить блок кода, назвать его каким-то именем и затем просто запустить несколько раз. Но пока что самое простое решение - скопировать тот код, что есть в main дважды, и во второй раз поменять вопрос в System.out.println, а также правильное значение в if. На деле, если просто скопировать и вставить, то компилятор сразу скажет вам, что у вас уже есть Сканер myscan, и вам нельзя объявлять одно и то же дважды. Просто не копируйте строчку с объявлением myscan - пусть он останется объявлен один раз. То же самое и с целочисленной переменной x. Ее значение можно менять присваиванием, но вот объявлять переменную с тем же именем заново нельзя. Поэтому строчку с объявлением новой переменной x пишем только один раз:
int x = 0;
а вот изменение значения уже существующей переменной на новое
x = myscan.nextInt ();
как и если бы нам просто нужно было присвоить x другому числу:
x = 200;
можно делать сколько угодно раз. Не волнуйтесь, если что-то пока непонятно - этим вопросам посвящены сразу несколько следующих тем.
Переходите в следующие темы - мы рассмотрим подробнее переменные, Scanner, if-else и многое другое.
В следующей теме расскажем как вычислять полезные вещи с помощью переменных