SaveText.Ru

a
  1. /*
  2. "Крестики - Нолики"
  3.  
  4. ПАЧНОУТЫ:
  5. 20.11.2018 - старт проекта и продумывание плана проекта
  6.  
  7. 21.11.2018 - интерфейс и режим игры против человека
  8.  
  9. 24.11.2018 - добавленна возможность играть партии подряд без перезапуска приложения, добавлен легкий и средний бот,
  10.                         можно выбрать кто ходит первым.
  11.  
  12. 25.11.2018 - добавлен сложный бот. начато продумывание реализации игры по локальной сети, дебаг и допиливание визуализации
  13.                         дописаны недостающие "n" и system("pause")
  14.                         так же мне помогли исправить ошибку которая происходила в случае ввода символов вместо интежер
  15.  
  16. 27.11.2018 - допил сложного бота (функция mnogohodovochka которая проверяет один из сценариев и не дает игроку выграть по нему)
  17. */
  18. /*
  19. ------ШПОРГААААЛКИ, ШПОРГААААЛОЧКИ!--------
  20.  
  21. рандом
  22. {
  23. #include <cstdlib> (библиотека для rand() и srand() )
  24. srand(time(nullptr)); (запихать в начало функции мейн, для нормального рандома)
  25. x=(rand() % *длинна промежутка* + *сдвиг относительно нуля*);
  26. }
  27.  
  28. консолечка
  29. {
  30. system("cls"); (отчистка консоли)
  31. system("pause"); (нажмите кнопку чтоб продолжить)
  32. }
  33.  
  34. описание логики ботов:
  35. бот всегда нолик
  36. игрок всегда крестик
  37. для атаки и защиты считывается состояние поля, и формируются строки 3 по горизонтали и вертикали, 2 накрест.
  38. крестик равен 10, нолик равен единице, если строка равняется 2- производится атака, если строка равняется 20 - производится защита
  39. в остальных случаях делается рандомный ход (средний бот) либо запускается алгоритм выйгршной стратегии - занять центр и углы
  40.  
  41. после того как я доделал код, стало ясно что можно было сделать несколько функций (атаки, защиты, случайного хода, очереди игрока)
  42. в таком случае код был бы в два раза короче.
  43. */
  44.  
  45. #include <iostream>
  46. #include <cstdlib> //для random
  47. #include <ctime> //опять-же для random (используем системное время для генерации действительно случайных чисел)
  48. using namespace std;
  49. short int fieldUp[9]; //информация о состоянии строк для ботов бот=1, человек= 10(да, это костыль, мне лень делать компактнее)
  50. char field[9]; //информация о игровом поле ('_'- пусто; 'x'- крестик; 'o'- нолик) эта переменная обязанна быть глобальной
  51. bool turn; //чья очередь ходить (в botGM;  bot - 1, человек - 0) а остальные переменные мне было лень прописывать каждый раз в функциях GM )))0)0)
  52. short int gameStatus; //статус игры (победа одной из сторон-0/1, ничья-2, игра в процессе-3)
  53. short int choice; //клетка которую выбрал игрок/бот для хода
  54. bool botAD; //произведенна ли атака/защита
  55.  
  56. short safe_input() {
  57.         short val = 0;
  58.         while (!(cin >> val)) {
  59.                 cin.clear();
  60.                 cin.ignore(numeric_limits<streamsize>::max(), 'n');
  61.                 cout << "Wrong input, only integers are expected!" << endl;
  62.         }
  63.         cin.clear();
  64.         cin.ignore(numeric_limits<streamsize>::max(), 'n');
  65.         return val;
  66.         //эту функцию я попросил написать отчима, она нужна для того чтоб в случае ввода не int программа не ошибалась.
  67.         // если вместо функции писать просто cin >> i; то в случае не пожохдящего ввода программа не правильно работала,
  68.         // а эта функция в случаее неверного ввода говорит об этом пользователю и запрашивает ввод вновь, пока он не введет int.
  69.         // это единственные семь строчек написанные не мной во всем коде.
  70. }
  71.  
  72. void fieldUpdate()
  73. //визуализация поля
  74. {
  75.         cout << field[6] << "|" << field[7] << "|" << field[8] << "      6|7|8" << "n"
  76.                 << field[3] << "|" << field[4] << "|" << field[5] << "      3|4|5" << "n"
  77.                 << field[0] << "|" << field[1] << "|" << field[2] << "      0|1|2" << "n" << endl;
  78. }
  79.  
  80. short int winner()
  81. //проверка условий победы (0- нолики, 1-крестики, 2-ничья, 3-игра еще не окончена) ужаснейший костыль, можно было-бы уместить это все в botMain() но мне лень                             
  82. {
  83.         if (((field[0] == 'x') && (field[1] == 'x') && (field[2] == 'x')) || ((field[3] == 'x') && (field[4] == 'x') && (field[5] == 'x'))
  84.                 || ((field[6] == 'x') && (field[7] == 'x') && (field[8] == 'x')) || ((field[0] == 'x') && (field[3] == 'x') && (field[6] == 'x'))
  85.                 || ((field[1] == 'x') && (field[4] == 'x') && (field[7] == 'x')) || ((field[2] == 'x') && (field[5] == 'x') && (field[8] == 'x'))
  86.                 || ((field[6] == 'x') && (field[4] == 'x') && (field[2] == 'x')) || ((field[8] == 'x') && (field[4] == 'x') && (field[0] == 'x')))
  87.         {
  88.                 return 1;//победа крестиков
  89.         }
  90.  
  91.         if (((field[0] == 'o') && (field[1] == 'o') && (field[2] == 'o')) || ((field[3] == 'o') && (field[4] == 'o') && (field[5] == 'o'))
  92.                 || ((field[6] == 'o') && (field[7] == 'o') && (field[8] == 'o')) || ((field[0] == 'o') && (field[3] == 'o') && (field[6] == 'o'))
  93.                 || ((field[1] == 'o') && (field[4] == 'o') && (field[7] == 'o')) || ((field[2] == 'o') && (field[5] == 'o') && (field[8] == 'o'))
  94.                 || ((field[6] == 'o') && (field[4] == 'o') && (field[2] == 'o')) || ((field[8] == 'o') && (field[4] == 'o') && (field[0] == 'o')))
  95.         {
  96.                 return 0;//победа ноликов
  97.         }
  98.  
  99.         short int checkup = 0;
  100.         for (short int i = 0; i < 9; i++)
  101.                 if (field[i] != '_')
  102.                 {
  103.                         checkup++;
  104.                 }
  105.         if (checkup == 9)
  106.         {
  107.                 return 2; //ничья
  108.         }
  109.         else
  110.         {
  111.                 return 3;//не все поля заполнены и пока никто не выйграл
  112.         }
  113. }
  114.  
  115. void fieldCheckUp()
  116. //"визуализация" поля для botMain() (да, это костыль... и что?  :D  )
  117. {
  118.         for (short int i = 0; i < 9; i++)
  119.         {
  120.                 switch (field[i])
  121.                 {
  122.                 case 'o': fieldUp[i] = 1;
  123.                         break;
  124.                 case 'x': fieldUp[i] = 10;
  125.                         break;
  126.                 case '_': fieldUp[i] = 0;
  127.                 }
  128.         }
  129.  
  130. }
  131.  
  132. void botAction(short int a, short int b, short int c)
  133. //вспомогательная функция вызывающаяся главной функцией бота для оказания защиты или атаки
  134. //в качетсве параметров вводится три клетки(две из которых заняты), функция находит свободную и заполняет ее
  135. {
  136.         if (field[a] == '_')
  137.         {
  138.                 field[a] = 'o';
  139.         }
  140.         if (field[b] == '_')
  141.         {
  142.                 field[b] = 'o';
  143.         }
  144.         if (field[c] == '_')
  145.         {
  146.                 field[c] = 'o';
  147.         }
  148. }

Share with your friends:

Распечатать