0 / 0 / 0
Регистрация: 08.03.2022
Сообщений: 3

Крестики нолики 5x5

24.07.2022, 18:31. Показов 617. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите закончить программу. Не понимаю ошибку в условиях на проверку по побочной диагонали.... все вроде корректно или я не нахожу чего то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// TicTacToe
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h> //библиотека для работы со строками(ввод-вывод)
 
#define SPACE ' ' //подстановка вместо слова SPACE символов ' '
 
using namespace std;
//матрица игрового поля 5х5 для игры в Х/О - глобальный двумерный массив символов
char Matrix[5][5] =
{
   SPACE,SPACE,SPACE,SPACE,SPACE,
   SPACE,SPACE,SPACE,SPACE,SPACE,
   SPACE,SPACE,SPACE,SPACE,SPACE,
   SPACE,SPACE,SPACE,SPACE,SPACE,
   SPACE,SPACE,SPACE,SPACE,SPACE
}; //заполнение массива пробелами
//прототип функции вывода игрового поля на экран
void Display();
//прототип функции хода игрока X/O
void Player_Move(char);
//прототип функции хода компьютера О
void PC_Move();
//прототип функции определения результата
char Check();
 
int main()
{
    system("chcp 1251");
    system("cls");
    srand(time(NULL));
    int Game = 0;  //хранит выбор варианта игры
    int Count = 0; //счетчик ходов игры
    char Winner = SPACE; //для определения победителя
    char Answer = SPACE; //для ответа на вопрос о продолжении игры
    //цикл повторной игры
    do
    {
        //заголовок игры
        cout << "---Игра в Крестики-Нолики!---" << endl;
        //меню игры
        cout << R"(Выберите тип игры:
1 - Одиночная игра(против компьютера)
2 - Мультиплеер(игра против игрока)
0 - Выход из игры
)";
        do //цикл проверки ввода типы игры
        {
            cin >> Game;
            if (Game < 0 || Game>2)cout << "Неверно выбран тип игры! Повторите ввод!" << endl;
        } while (Game < 0 || Game>2);
        if (Game == 0)break; //выход из игры(выход из цикла повторной игры)
        system("cls");
        if (Game == 1)cout << "Одиночная игра!" << endl;
        else cout << "Мультиплеер!" << endl;
        //цикл ходов 
        do
        {
            //действия для Х
            Display();                  //вывод игрового поля на экран перед ходом игрока Х
            Player_Move('X');           //ход игрока Х
            Count++;                    //увеличиваем общий счетчик ходов на 1
            if (Count >= 5)Winner = Check(); //проверка победы Х
            if (Winner != SPACE)break;     //если игра закончилась победой крестика, то выход из цикла ходов
            if (Count == 25)break;          //если игра закончилась по ходам(ничья)
            //действия для О
            if (Game == 1)PC_Move();       //если одиночная игра, то ход компьютера
            else                        //иначе ход второго игрока О
            {
                Display();              //вывод игрового поля на экран перед ходом игрока О
                Player_Move('O');       //ход игрока O
            }
            Count++;                    //увеличиваем общий счетчик ходов на 1
            if (Count >= 20)Winner = Check(); //проверка победы О
        } while (Winner == SPACE); //ходим пока не найден победитель
        Display(); //вывод на экран игрового поля по окончанию игры
        //определение результата игры
        if (Winner != SPACE)cout << Winner << " победил!!!" << endl;
        else cout << "Ничья!!!" << endl;
        //вопрос о повторной игре
        cout << "Сыграем ещё раз(Y/N)? "; cin >> Answer;
        if (Answer == 'Y' || Answer == 'y')
        {
            //подготовка к повторной игре
            //обнуляем счетчик ходов
            Count = 0;
            //сброс победителя
            Winner = SPACE;
            //очистка игрового поля
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    Matrix[i][j] = SPACE;
                }
            }
            //очистка экрана
            system("cls");
        }
        else Game = 0; //иначе выход из игры (можно написать: else break; )
    } while (Game != 0);
    //Вариант I
    //system("pause");
    //Вариант II
    //cout << "Выход..." << endl;
    //Sleep(1000);
    //Вариант III
    cout << "Для выхода нажмите любую клавишу..." << endl;
    //cin >> Answer; //запрос ввода любого символа, подтверждается Enter
    _getch(); //запрос нажатия любой клавиши
}
//реализация функции вывода игрового поля на экран
void Display()
{
    for (int i = 0; i < 5; i++) //построчный вывод поля
    {
        cout << " " << Matrix[i][0] << " | " << Matrix[i][1] << " | " << Matrix[i][2] << " | " << Matrix[i][3] << " | " << Matrix[i][4] << endl;
        if (i != 4)cout << "---|---|---|---|---" << endl; //после каждой строки кроме последней
    }
}
//реализация функции хода игрока X/O
void Player_Move(char Symbol) //Sysmbol - зранит символ игрока делающего ход(X/O)
{
    int x = 0, y = 0; //координаты ячейки поля
    do //цикл проверки пользовательского ввода
    {
        cout << "Куда поставить " << Symbol << " ?" << endl;
        cout << "Строка  номер: "; cin >> x;
        cout << "Столбец номер: "; cin >> y;
        x--; y--; //интерпритируем пользовательский ввод для работы с элементами массива по индексам
        if (x < 0 || x>4 || y < 0 || y>4)cout << "Такого поля не существует повторите ввод!" << endl;
        else
            if (Matrix[x][y] != SPACE)cout << "Поле уже занято! Выберите другое и повторите ввод!" << endl;
    } while (x < 0 || x>4 || y < 0 || y>4 || Matrix[x][y] != SPACE);
    Matrix[x][y] = Symbol; //в выбранную ячейку помещаем символ игрока, чей ход(для которого была вызвана функция)
}
//реализация функции хода компьютера О
void PC_Move()
//void PC_Move(char Symbol)
{
    int i = 0, j = 0; //индексы ячеек массива
    do//цикл проверки хода компьютера
    {
        //можно жобавить "искуственный интелект"
        i = rand() % 5; //генерация индекса от 0 до 4 включительно
        j = rand() % 5; //генерация индекса от 0 до 4 включительно
    } while (Matrix[i][j] != SPACE); //пока ячейка занята
    cout << "Ход компьютера: " << i + 1 << ";" << j + 1 << endl;
    Matrix[i][j] = 'O'; //помещаем в нужну ячейку O
    //Matrix[i][j] = Symbol;
}
//реализация функции определения результата
char Check()
{
        //проверка по строкам
        for (int i = 0; i < 5; i++)
        {
            //если все три ячейки одной строки имеют одинаковое содержимое и это не пробел, то вернуть это содержимое как победителя
            if (Matrix[i][0] == Matrix[i][1] && Matrix[i][1] == Matrix[i][2] && Matrix[i][2] == Matrix[i][3] && Matrix[i][3] == Matrix[i][4] && Matrix[i][0] != SPACE)return Matrix[i][0];
        }
        //проверка по столбцам
        for (int j = 0; j < 5; j++)
        {
            //если все три ячейки одного столбца имеют одинаковое содержимое и это не пробел, то вернуть это содержимое как победителя
            if (Matrix[0][j] == Matrix[1][j] && Matrix[1][j] == Matrix[2][j] && Matrix[2][j] == Matrix[3][j] && Matrix[3][j] == Matrix[4][j] && Matrix[0][j] != SPACE)return Matrix[0][j];
        }
        //проверка по главной диагонали
        if (Matrix[0][0] == Matrix[1][1] && Matrix[1][1] == Matrix[2][2] && Matrix[2][2] == Matrix[3][3] && Matrix[3][3] == Matrix[4][4])return Matrix[1][1];
        //проверка по побочной диагонали
        if (Matrix[0][4] == Matrix[1][3] && Matrix[1][3] == Matrix[2][2] && Matrix[2][2] == Matrix[3][1] && Matrix[3][1] == Matrix[4][0])return Matrix[1][1];
        //если победитель не найден вернем SPACE
        return SPACE;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.07.2022, 18:31
Ответы с готовыми решениями:

Крестики нолики
Здравствуйте. Никак не получается определить, кто победил, всегда выводит ничью. Почему? #include &lt;iostream&gt; #include...

Крестики-нолики
main.cpp #include &quot;KR.h&quot; using namespace std; int main() { RandomPlayer *r = new RandomPlayer('x'); ...

Крестики-нолики
Помогите пожалуйста создать игру крестики-нолики на 2 игроков, поле игры - массив 3х3. Нашла несколько вариантов кода, но как-то все...

3
 Аватар для Kuzia domovenok
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
24.07.2022, 21:51
return Matrix[1][1]; не с побочной диагонали
0
 Аватар для abit
502 / 457 / 140
Регистрация: 03.02.2013
Сообщений: 1,443
25.07.2022, 01:44
отличная задача! я впервые услышал про 5x5 крестики-нолики
для начала вот набросал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <iostream>
 
 
class CCNGame
{
    #define SPACE ' '
    #define KREST 'X'
    #define NOLL '0'
    #define size 5
    #define line 4
    
    char Matrix[size][size] =
    {
        SPACE,SPACE,SPACE,SPACE,SPACE,
        SPACE,SPACE,SPACE,SPACE,SPACE,
        SPACE,SPACE,SPACE,SPACE,SPACE,
        SPACE,SPACE,SPACE,SPACE,SPACE,
        SPACE,SPACE,SPACE,SPACE,SPACE
    };
    
    
    void getCost(void);
    bool MatrixCostAdd(const uint8_t&, const uint8_t&);
    
    
    public:
    
        char MatrixCost[size][size] =
    {
        0,0,0,0,0,
        0,0,0,0,0,
        0,0,0,0,0,
        0,0,0,0,0,
        0,0,0,0,0,
    };
    
    struct tHod
    {
        uint8_t x,y;
        char Who;
    };
    
      void print(void); // Выводит игровое поле
      void printC(void); // Выводит оценку клеток
      void Hod(tHod&);
      tHod FindHextHod(void);
};
 
void CCNGame::print(void)
{
  getCost();
  for (uint8_t i=0; i<size; i++)
  {
      for (uint8_t j=0; j<size; j++) std::cout<<Matrix[i][j]<<" | ";
      std::cout<<std::endl;
      std::cout<<"___________________"<<std::endl;
  }
  std::cout<<std::endl;
}
 
void CCNGame::printC(void)
{
  for (uint8_t i=0; i<size; i++)
  {
      for (uint8_t j=0; j<size; j++) std::cout<<(int)MatrixCost[i][j]<<" ";
      std::cout<<std::endl;
  }
}
 
bool CCNGame::MatrixCostAdd(const uint8_t& i, const uint8_t& j)
{
    
    switch (Matrix[i][j])
      {
         case SPACE:
            MatrixCost[i][j]++;
            break;
         case KREST:
            MatrixCost[i][j]=0;
            break;
         case NOLL:
            MatrixCost[i][j]=0;
      }
      return true;
}
 
void CCNGame::getCost(void)
{
    // очищаем старый расчёт
    for (uint8_t j=0; j<=size; j++)
    for (uint8_t i=0; i<=size; i++) MatrixCost[i][j]=0;
    
    // Горизонтали
    for (uint8_t j=0; j<=line; j++)
    for (uint8_t i=0; i<=line; i++) MatrixCostAdd(i,j);
    for (uint8_t j=1; j<line; j++)
    for (uint8_t i=1; i<line; i++) MatrixCostAdd(i,j);  
    
    
    // Вертикали
    for (uint8_t j=0; j<=line; j++)
    for (uint8_t i=0; i<=line; i++) MatrixCostAdd(i,j);
    for (uint8_t j=1; j<line; j++)
    for (uint8_t i=1; i<line; i++) MatrixCostAdd(i,j);
  
    // Диагонали
    for (uint8_t c=1; c<size; c++)
    {
       uint8_t i=c;
       uint8_t j=c;
       MatrixCostAdd(i-1,j-1); 
       MatrixCostAdd(i,j-1); 
       MatrixCostAdd(i-1,j); 
       MatrixCostAdd(i,j); 
    }
    
    for (uint8_t c=1; c<size; c++)
    {
       uint8_t i=c;
       uint8_t j=c;
       MatrixCostAdd(j-1,i-1); 
       MatrixCostAdd(j,i-1); 
       MatrixCostAdd(j-1,i); 
       MatrixCostAdd(j,i); 
    }
}
 
void CCNGame::Hod(tHod& _Hod)
{
    Matrix[_Hod.x][_Hod.y]=_Hod.Who;
    this->getCost();
}
 
CCNGame::tHod CCNGame::FindHextHod(void)
{
    CCNGame::tHod A;
    uint8_t MaxCount(0), x,y;
    for (uint8_t i=0; i<size; i++)
     for (uint8_t j=0; j<size; j++)
         if (MaxCount<MatrixCost[i][j]) {A.x=i; A.y=j; MaxCount=MatrixCost[i][j];}
    A.Who=NOLL;
    return A;
}
 
int main()
{
  CCNGame CNGame;
  while (1)
  {
  CNGame.print();
  CCNGame::tHod A;
  uint8_t i,j;
  std::cout<<" Your Turn:"<<std::endl;
  std::cin>>i>>j;
  A.x=(int)i-49;
  A.y=(int)j-49;
  A.Who=KREST;
  CNGame.Hod(A);
 
  A=CNGame.FindHextHod();
  CNGame.Hod(A);
  std::cout<<" Comp Turn ("<<(int)A.x<<","<<(int)A.y<<")"<<std::endl;
  }
  
  return 0;
}
но там есть как минимум три способа улучшить игру компьютера, плюс, конечно нужно добавить функцию выявления победителя
0
 Аватар для Nishen
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,806
25.07.2022, 04:50
Цитата Сообщение от abit Посмотреть сообщение
#define SPACE ' '
    #define KREST 'X'
    #define NOLL '0'
C++
1
2
3
4
5
enum class State {
    X,
    O,
    EMPTY,
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2022, 04:50
Помогаю со студенческими работами здесь

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

C++ Крестики нолики
Докончите программу, Реализуйте проверку на победу одного из игроков, минимум две комбинации для одного и для другого. #include...

Крестики нолики
Недавно начал изучать C++. Фактически это первый язык программирования который я осваиваю. Решил написать игру крестики нолики. Как...

Крестики нолики
Здравствуйте. Я сделал программу позволяющую играть в крестики-нолики. Можете помочь найти какие-либо ошибки или баги. Заранее...

крестики нолики
Я дошел до проверки или кто-то выиграл и тут мне немного не понравилось.Для того чтобы проверить есть ли победитель, я сравниваю элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
C++26: Индексирование пакетов и метапрограммиро­вание
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru