Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
214 / 161 / 52
Регистрация: 09.12.2017
Сообщений: 520
1

Условие победы в крестики нолики по вертикали

21.12.2018, 22:37. Показов 1806. Ответов 1

Добрый вечер.
Помогите найти условие победы в крестики нолики по вертикали.
Есть массив - игровое поле 3x3:
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
В данном случае, заметил я, индекс row растет на 1, а col остается прежним. Но не знаю, как это реализовать формулой.
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2018, 22:37
Ответы с готовыми решениями:

Автоматический перезапуск игры "Крестики - нолики" в случае победы или ничьей
Автоматический перезапуск игры в случае победы или ничьи(Крестики нолики)

Крестики нолики Qt функция победы
Всем доброго времени суток. На курсовой по ооп задали крестики нолики. Столкнулся с проблемой...

Проверка победы в крестики-нолики по диагонали
Не могу составить правильные условия победы по диагонали. При наличии 5 одинаковых символов по...

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

1
17 / 15 / 8
Регистрация: 27.05.2017
Сообщений: 118
21.12.2018, 23:56 2
Вот это работающий код игры крестики-нолики. Примитивный консольный вариант.
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//игра крестики нолики, можно выбрать любой размер поля, есть ничья
#include <iostream>
#include <conio.h>
#include <ctime>
 
using namespace std;
 
#define mapSize 3 //размер поля
#define NUL 0  // символ пустой клетки
#define P1 88  // символ крестика
#define P2 79  // символ нолика
 
 
const short int A = mapSize, B = mapSize;
short int X, Y, Nmove = 1;
char whoMove = NUL, win = NUL;
char MAP[A][B];
 
void allNull()
{
 for (int i = 0; i < A; i++)
  for (int j = 0; j < B; j++)
   MAP[i][j] = NUL;
}
 
void randomFirstMove()
{
 srand(time(0));
 if (rand() & 1)
  whoMove = P1;
 else
  whoMove = P2;
}
 
void line()
{
 for (int i = 0; i < A; i++)
  cout << "--";
 cout << "-" << endl;
}
 
void displayMap()
{
 cout << "Ход № " << Nmove << endl;
 cout << endl;
 
 cout << "\t X";
 for (int i = 0; i < A; i++)
  cout << " " << i + 1 << "  ";
 cout << endl;
 
 cout << "\tY";
 line();
 
 
 for (int i = 0; i < A; i++)
 {
  cout << "\t" << i + 1 << "| ";
  for (int j = 0; j < B; j++)
  {
   cout << MAP[i][j] << " | ";
  }
  cout << endl;
  cout << "\t ";
  line();
 }
 cout << endl << endl;
 X = Y = 0;
}
 
bool input()
{
 cout << "Ход игрока " << whoMove << endl;
 cout << "Введите координату X Y от 1 до " << A << ": ";
 if ((!(cin >> X) || !(cin >> Y)) || ((!(X < (A + 1) && X > 0) || !(Y < (B + 1) && Y > 0))) || (!(MAP[--Y][--X] == NUL)))
 {
  cin.clear(); while (cin.get() != '\n');
  return false;
 }
 else
  return true;
}
 
short int move()
{
 Nmove++;
 
 if (whoMove == P1)
 {
  MAP[Y][X] = P1;
  return P1;
 }
 
 if (whoMove == P2)
 {
  MAP[Y][X] = P2;
  return P2;
 }
}
 
void nextMove()
{
 whoMove == P1 ? whoMove = P2 : whoMove = P1;
}
 
short int whoWin()
{
 //алгоритмы для вычисления победной комбинации на любом поле
 
 short int a = 0;
 for (int i = 0; i < A; i++)
 {
  for (int j = 0; j < B - 1; j++)
   if ((MAP[i][j] == MAP[i][j + 1]) && (MAP[i][j] != NUL))
    a++;
  if (a == B - 1)
  {
   win = whoMove;
   return i + 1;//столбцы
  }
  else
   a = 0;
 }
 
 a = 0;
 
 for (int i = 0; i < A; i++)
 {
  for (int j = 0; j < B - 1; j++)
   if ((MAP[j][i] == MAP[j + 1][i]) && (MAP[j][i] != NUL))
    a++;
  if (a == B - 1)
  {
   win = whoMove;
   return i + 4;//строки
  }
  else
   a = 0;
 }
 
 
 for (int i = 0, j = A - 1; i < A; i++, j--)
  if ((MAP[i][j] == MAP[i + 1][j - 1]) && (MAP[i][j] != NUL))
   a++;
 if (a == B - 1)
 {
  win = whoMove;
  return 7;
 }
 else
  a = 0;
 
 for (int i = 0, j = 1; i < A; i++, j++)
  if ((MAP[i][i] == MAP[j][j]) && (MAP[i][i] != NUL))
   a++;
 if (a == B - 1)
 {
  win = whoMove;
  return 8;
 }
 else
  a = 0;
 
 
 
}
 
void winner()
{
 system("cls");
 displayMap();
 
 if (win != NUL)
  cout << "Выиграл игрок " << win << "!\n";
 
 else
  cout << "Ничья!\n";
}
 
int main()
{
 setlocale(0, "Russian");
 
 allNull();
 randomFirstMove();
 
 do
 {
  system("cls");
  displayMap();
 
  while (!input())
  { system("cls");
   displayMap(); }
  move();
  whoWin();
  nextMove();
 } while ((win == NUL) && (Nmove < A*A+1));
 
 
 winner();
 
 
 _getch();
 return 0;
}
И среди всего этого есть та самая часть кода которая задает условия победы в игре. Работает для всех исходов.
Думаю в ней есть ответ на ваш вопрос!
Листинг этой функции:
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
short int whoWin()
{
 //алгоритмы для вычисления победной комбинации на любом поле
 short int a = 0;
 for (int i = 0; i < A; i++)
 {
  for (int j = 0; j < B - 1; j++)
   if ((MAP[i][j] == MAP[i][j + 1]) && (MAP[i][j] != NUL))
    a++;
  if (a == B - 1)
  {
   win = whoMove;
   return i + 1;//столбцы
  }
  else
   a = 0;
 }
 
 a = 0;
 
 for (int i = 0; i < A; i++)
 {
  for (int j = 0; j < B - 1; j++)
   if ((MAP[j][i] == MAP[j + 1][i]) && (MAP[j][i] != NUL))
    a++;
  if (a == B - 1)
  {
   win = whoMove;
   return i + 4;//строки
  }
  else
   a = 0;
 }
 
 
 for (int i = 0, j = A - 1; i < A; i++, j--)
  if ((MAP[i][j] == MAP[i + 1][j - 1]) && (MAP[i][j] != NUL))
   a++;
 if (a == B - 1)
 {
  win = whoMove;
  return 7;
 }
 else
  a = 0;
 
 for (int i = 0, j = 1; i < A; i++, j++)
  if ((MAP[i][i] == MAP[j][j]) && (MAP[i][i] != NUL))
   a++;
 if (a == B - 1)
 {
  win = whoMove;
  return 8;
 }
 else
  a = 0;
 
 
 
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2018, 23:56

Программа для проверки победы в игре крестики нолики
Текст задачи на одном из обучающих курсов: &quot;Методу GetGameResult передается поле, представленное...

Игра по сети в «Го» («крестики-нолики» на безразмерном (большом) поле. Для победы необходимо выстроить пять в
Игра по сети в «Го» («крестики-нолики» на безразмерном (большом) поле. Для победы необходимо...

Написать алгоритм расчета победы в сетевой игре "Крестики-нолики"
День добрый уважаемые форумчане. В качестве упражнения делаю маленькую игрушку- крестики-нолики по...

Определение победы в игре "Крестики-нолики"
p = new int { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0,...


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

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

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