Расшифруем игру.

Hi!

Сам Анкур. Я недавно вошел в мир программирования. Но во время кодирования я заметил одну вещь: многие из них знают теорию, но не могут применить ее в своих программах. Если вы один из них, эта серия блогов для вас.

Эта серия статей в основном направлена ​​на то, чтобы помочь людям понять и применить логику к своему коду, создавая игры. Верно! Игры! Хотя эти игры очень легко кодировать, они наверняка помогут вам понять логику и ее применение. Я буду кодировать все свои игры на трех разных языках программирования: Java, Python и C ++. Но что касается содержания, я буду писать код на Java. Наконец, я буду давать подсказки для каждого нового шага, который собираюсь кодировать. Пойдем!

Как следует из названия, моей первой игрой будет MasterMind. Цель игры - найти порядок, в котором цветные камешки хранятся, скрытые от вас, путем оценки количества белых флажков (камешек присутствует, но не в одном месте) и черных флажков (камешек присутствует и находится в том же месте). и предсказывая следующий ход. Подробные правила и игровой процесс можно найти на этом сайте.

Во-первых, нам нужно случайным образом выбрать три камешка из списка, скажем, семи. Для простоты я буду использовать VIBGYOR of the Rainbow (фиолетовый, индиго, синий, зеленый, желтый, оранжевый и красный). Запомните эту последовательность, так как она будет использоваться неоднократно. Итак, из VIBGYOR компьютер должен выбрать 3 цвета. Для этого мы можем сделать следующее:

Random random = new Random(); //for random numbers
Scanner s = new Scanner(System.in); //for inputs
char colors[] = new char[]{‘V’,’I’,’B’,’G’,’Y’,’O’,’R’};
char c1 = colours[random.nextInt(7)];
char c2 = colours[random.nextInt(7)];
char c3 = colours[random.nextInt(7)];

Кажется, просто! Мы просто создали набор цветов, а затем случайным образом выбрали три разных цвета. Вы можете найти лазейку? Основная проблема в том, что цвета НЕ МОГУТ повторяться (это правило). Таким образом, мы можем получить последовательность вроде «VGG», которая неверна. Для решения этой проблемы можно написать следующий код:

String compSequence=“”;
for(int i = 0;i < 3;i++){
   int z;
   do{
      z = r.nextInt(7);
   }while(colors[z]==’_’);
   compSequence += colors[z];
   colors[z]=’_’;
}

Хм, что это за хлам! Сначала мы сделали массив цветов. Затем, используя цикл for, мы добавили цвета в нашу строку compSequence . Наконец, мы удалили использованные цвета, присвоив _ этому индексу. Если цвет удален, то есть символ в массиве с этим индексом равен _, тогда найдите другой случайный индекс, пока не будет найден цвет.

Теперь важная часть! Пользовательский ввод. Нам нужно сделать ввод 10 раз. Поскольку количество итераций фиксировано, цикл for является предпочтительным. Затем нам нужно инициализировать переменные черного и белого флагов. Это можно сделать следующим образом:

for(int i = 0; i<10; i++){
   int black=0, white=0;

Теперь нам нужно ввести данные пользователя. Но что, если пользователь случайно нажмет Enter, прежде чем что-либо набрать. BufferedReader вызовет ошибку. Поэтому я использовал класс Scanner (разницу смотрите здесь). Следующий фрагмент кода сделает это:

String input=””;
do{
   System.out.print(“Chance “+(i+1)+”: “);
   input = s.nextLine().toUpperCase();
   //s is the scanner object (see above)
}while(input==“” || input.length() != 3);

Здесь, если ввод не задан или задан ввод, содержащий количество символов, НЕ РАВНО 3 (поскольку имеется 3 цвета), пользователь вынужден повторно ввести ввод. Кроме того, мы переводим символы в строке input в верхний регистр.

Следует отметить, что многие программисты используют if вместо while. Это неверно, так как пользователь может снова совершить ту же ошибку снова. Цикл while будет повторяться до тех пор, пока ограничения не будут согласованы. Но оператор if попросит пользователя повторно ввести ввод только один раз. Если пользователь сделает еще одну ошибку, она будет проигнорирована. Для пояснения просто замените do-while оператором if- и дважды сделайте ошибку, когда появится запрос на ввод. На изображениях ниже представлены соответствующие результаты.

Теперь идет черный и белый флаги. Нам нужно вывести количество черных и белых флагов. Но перед отображением их нужно посчитать. Для этого нам нужно просмотреть обе строки и сравнить каждый символ одной строки с символом другой, то есть проверить, совпадают ли цвета. Если два сравниваемых цвета одинаковы и если их индексы также совпадают, увеличьте количество черных флагов или увеличьте количество белых флагов. Смотри ниже:

for(int j = 0;j < 3;j++){
   for(int k=0; k < 3;k++){ 
      if(compSequence.charAt(j) == input.charAt(k)){
         if( j == k ) black++;
         else white++;
}}}

Мы использовали вложенные циклы для. Затем мы сравнили каждый символ compSequence с символом input. Если то же самое, проверьте индексы и соответственно увеличьте соответствующий флаг.

Другая проблема заключается в том, что пользователь может намеренно вводить ввод с повторяющимися цветами. Это нормально, если он хочет проверить только два цвета. Но если повторяющийся цвет совпадает с одним из цветов в compSequence, черный и / или белый флаги складываются 2 раза. Это потому, что сравниваемые цвета будут одинаковыми 2 раза. Можете ли вы решить эту ошибку? Я оставлю это тебе.

Если не смогли, не волнуйтесь. Код для устранения указанной выше ошибки приведен по ссылке внизу.

Последняя вещь! Что, если пользователь получит правильную строку с вероятностью 10? Верно! Остановите цикл. Это можно сделать, разорвав цикл:

if(black == 3)
   break;

Но что, если он этого не сделает? Затем просто выведите на экран черно-белые флажки.

Примечание: сбросьте черные и белые переменные, иначе они будут продолжать добавлять.

   System.out.println(“Black pebbles: “+black+” White Pebbles: “+white);
   black=0;
   white=0;
}

Вау! Такая простая игра, но нужно так много объяснять. Но ты сделал это! Вот ссылка на полный код с исправленными ошибками. А теперь поиграйте с ней и пришлите мне лучший клон этой игры. Вы также можете попробовать сделать что-то вроде этого. Не забудьте нажать эту кнопку 50 раз, если вам понравился этот блог.

Увидимся! Давайте скоро сделаем еще один ...