Добавлен: 09.01.2024
Просмотров: 112
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Функция is_square_up ()
/*Функция проверки того, что на текущем ходу был сформирован квадрат из текущих клеток и клеток, находящихся над ними
Параметры функции:
1)Указатель на узел дерева
2)Номер строки первой клетки
3)Номер столбца первой клетки
4)Номер строки второй клетки
5)Номер столбца второй клетки
Принцип работы:
1)Если у первой клетки есть связь с верхней, то переменная flag_first=true
2)Если у второй клетки есть связь с верхней, то переменная flag_second=true
3)Если клетки соеденены с верхними, то проверяем связь верхних клеток между собой
*/
bool is_square_up(Tree_node* PNode, int string_first, int column_first, int string_second, int column_second) {
bool flag_first = false;
bool flag_second = false;
bool flag_up = false;
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first][i] ==
(string_first - 1) * 10 + column_first) {
flag_first = true;
}
if (PNode->connections[string_second][column_second][i] ==
(string_second - 1) * 10 + column_second) {
flag_second = true;
}
}
if (flag_second == true && flag_first == true) {
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first - 1][column_first][i] ==
(string_second - 1) * 10 + column_second) {
flag_up = true;
}
}
}
return flag_up;
}
Функция is_square_down ()
/*Функция проверки того, что на текущем ходу был сформирован квадрат из текущих клеток и клеток, находящихся под ними
Параметры функции:
1)Указатель на узел дерева
2)Номер строки первой клетки
3)Номер столбца первой клетки
4)Номер строки второй клетки
5)Номер столбца второй клетки
Принцип работы:
1)Если у первой клетки есть связь с нижней, то переменная flag_first=true
2)Если у второй клетки есть связь с нижней, то переменная flag_second=true
3)Если клетки соеденены с нижними, то проверяем связь нижних клеток между собой
*/
bool is_square_down(Tree_node* PNode, int string_first, int column_first, int string_second, int column_second) {
bool flag_first = false;
bool flag_second = false;
bool flag_down = false;
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first][i] ==
(string_first + 1) * 10 + column_first) {
flag_first = true;
}
if (PNode->connections[string_second][column_second][i] ==
(string_second + 1) * 10 + column_second) {
flag_second = true;
}
}
if (flag_second == true && flag_first == true) {
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first + 1][column_first][i] ==
(string_second + 1) * 10 + column_second) {
flag_down = true;
}
}
}
return flag_down;
}
Функция is_square_right ()
/*Функция проверки того, что на текущем ходу был сформирован квадрат из текущих клеток и клеток, находящихся справа
Параметры функции:
1)Указатель на узел дерева
2)Номер строки первой клетки
3)Номер столбца первой клетки
4)Номер строки второй клетки
5)Номер столбца второй клетки
Принцип работы:
1)Если у первой клетки есть связь с правой, то переменная flag_first=true
2)Если у второй клетки есть связь с правой, то переменная flag_second=true
3)Если клетки соеденены с правыми, то проверяем связь правых клеток между собой
*/
bool is_square_right(Tree_node* PNode, int string_first, int column_first, int string_second, int column_second) {
bool flag_first = false;
bool flag_second = false;
bool flag_right = false;
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first][i] ==
string_first * 10 + column_first + 1) {
flag_first = true;
}
if (PNode->connections[string_second][column_second][i] ==
string_second * 10 + column_second + 1) {
flag_second = true;
}
}
if (flag_second == true && flag_first == true) {
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first + 1][i] ==
string_second * 10 + column_second + 1) {
flag_right = true;
}
}
}
return flag_right;
}
Функция is_square_left ()
/*Функция проверки того, что на текущем ходу был сформирован квадрат из текущих клеток и клеток, находящихся слева
Параметры функции:
1)Указатель на узел дерева
2)Номер строки первой клетки
3)Номер столбца первой клетки
4)Номер строки второй клетки
5)Номер столбца второй клетки
Принцип работы:
1)Если у первой клетки есть связь с левой, то переменная flag_first=true
2)Если у второй клетки есть связь с левой, то переменная flag_second=true
3)Если клетки соеденены с леваыми, то проверяем связь левых клеток между собой
*/
bool is_square_left(Tree_node* PNode, int string_first, int column_first, int string_second, int column_second) {
bool flag_first = false;
bool flag_second = false;
bool flag_left = false;
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first][i] ==
string_first * 10 + column_first - 1) {
flag_first = true;
}
if (PNode->connections[string_second][column_second][i] ==
string_second * 10 + column_second - 1) {
flag_second = true;
}
}
if (flag_second == true && flag_first == true) {
for (int i = 0; i < 4; i++) {
if (PNode->connections[string_first][column_first - 1][i] ==
string_second * 10 + column_second - 1) {
flag_left = true;
}
}
}
return flag_left;
}
Функция is_square ()
/*Функция проверки того, что на текущем ходу был сформирован квадрат
Параметры функции:
1)Указатель на узел дерева
2)Номер строки первой клетки
3)Номер столбца первой клетки
4)Номер строки второй клетки
5)Номер столбца второй клетки
Принцип работы:
1)Смотрим номер строки.Если клетки расположены на одной строке:
1.1)Если она последняя,то вызываем функцию is_square_up()
1.2)Если она первая,то вызываем функцию is_square_down()
1.3)Если строка не крайняя,то вызывем функции is_square_up() и is_square_down()
2)Смотрим номер столбца. Если клетки в одном столбце:
2.1)Если он последний,то вызываем функцию is_square_left()
2.2)Если он первый,то вызываем функцию is_square_right()
2.3)Если столбец не крайний, то вызывем функции is_square_left() и is_square_right()
*/
void is_square(Tree_node* PNode, int string_first, int column_first, int string_second, int column_second) {
bool flag = false;
if (string_first == string_second) {
if (string_first == 9) {
flag = is_square_up(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) {PNode->is_square = true;}
}
if (string_first == 0) {
flag = is_square_down(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
}
if (string_first > 0 && string_first < 9) {
flag = is_square_up(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
flag = is_square_down(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
}
}
if (column_first == column_second) {
if (column_first == 9) {
flag = is_square_left(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
}
if (column_first == 0) {
flag = is_square_right(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
}
if (column_first > 0 && column_first < 9) {
flag = is_square_left(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
flag = is_square_right(PNode, string_first, column_first,
string_second, column_second);
if (flag == true) { PNode->is_square = true; }
}
}
}
Функция generation_move()
/*Функция генерации хода
Параметры функии:
1)Указатель на узел дерева
2)Значение целого типа: 1, если нужно сгенерировать ход для компьютера,
2 - для человека.
Принцип работы:
1)Просматриваем все значения клеток текущего игрового поля
2)Если значение равно переданному, то рассматриваем его позицию.
3)В зависимости от позиции равссматриваем соседнии клетки
4)Ели узел был добвлен, проверяем был ли собрана квадрат на данном ходу
*/
void generation_move(Tree_node* PNode, const int value) {
bool flag;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (PNode->field[i][j] == value) {
if (i == 0 && j == 0) {
flag=check_cell(PNode, i, j, value, 's', 1);
if (flag == true) {is_square(PNode->child[PNode->
count_child-1], i, j,
i, j + 1);}
flag=check_cell(PNode, i, j, value, 'c', 1);
if (flag == true) {is_square(PNode->child[PNode->
count_child-1], i, j,
i+1, j );}
}
if (i == 0 && j == 9) {
flag=check_cell(PNode, i, j, value, 's', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child-1], i, j,
i, j - 1);}
flag=check_cell(PNode, i, j, value, 'c', 1);
if (flag == true) { is_square(PNode->child[PNode->
count_child-1], i, j, i + 1, j);}
}
if (i == 9 && j == 0) {
flag=check_cell(PNode, i, j, value, 'c', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i, j, i - 1, j);}
flag=check_cell(PNode, i, j, value, 's', 1);
if (flag == true) { is_square(PNode->child[PNode-> count_child - 1], i,
j, i, j + 1);}
}
if (i == 9 && j == 9) {
flag=check_cell(PNode, i, j, value, 'c', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i, j, i - 1, j);}
check_cell(PNode, i, j, value, 's', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i, j, i, j - 1); }
}
if (i == 0 && j > 0 && j < 9) {
flag=check_cell(PNode, i, j, value, 's', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i, j, i, j - 1); }
flag=check_cell(PNode, i, j, value, 's', 1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i,
j, i, j + 1); }
flag=check_cell(PNode, i, j, value, 'c', 1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i,
j, i + 1, j); }
}
if (i == 9 && j > 0 && j < 9) {
flag=check_cell(PNode, i, j, value, 's', -1);
if (flag == true) { is_square(PNode->child[PNode-> count_child - 1], i,
j, i, j - 1); }
flag=check_cell(PNode, i, j, value, 's', 1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i,
j, i, j + 1); }
flag=check_cell(PNode, i, j, value, 'c', -1);
if (flag == true) { is_square(PNode->child[PNode->
count_child - 1], i,
j, i - 1, j); }
}
if (j == 0 && i != 0 && i != 9) {
flag=check_cell(PNode, i, j, value, 'c', -1);
if (flag == true) { is_square(PNode->child[PNode->