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

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

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

Помогите закончить программу. Не понимаю ошибку в условиях на проверку по побочной диагонали.... все вроде корректно или я не нахожу чего то
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2022, 18:31
Ответы с готовыми решениями:

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

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

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

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

3
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,026
Записей в блоге: 1
24.07.2022, 21:51 2
return Matrix[1][1]; не с побочной диагонали
0
299 / 293 / 88
Регистрация: 03.02.2013
Сообщений: 846
25.07.2022, 01:44 3
отличная задача! я впервые услышал про 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
1158 / 821 / 357
Регистрация: 26.02.2015
Сообщений: 3,700
25.07.2022, 04:50 4
Цитата Сообщение от abit Посмотреть сообщение
#define SPACE ' '
    #define KREST 'X'
    #define NOLL '0'
C++
1
2
3
4
5
enum class State {
    X,
    O,
    EMPTY,
};
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2022, 04:50
Помогаю со студенческими работами здесь

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

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

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

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

Крестики-нолики
Добрый вечер. Хочу попробовать написать свои крестики-нолики. Игру еще не дописал, но уже появилась...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru