Ошибка в игре "Крестики-нолики" на 5 ячеек - C (СИ)
Формулировка задачи:
играют 2 игрока,поле 20 на 20. выигрывает тот, кто первым выстраивает пять крестиков (ноликов) подряд по горизонтали, вертикали или диагонали. помогите, пожалуйста, найти ошибки.
#include <stdio.h>
#include <stdlib.h>
char matrix[20][20]; /* матрица игры */
char check(void);
void init_matrix(void);
void get_player_move(void);
void get_computer_move(void);
void disp_matrix(void);
int main(void)
{
char done;
done = ' ';
init_matrix();
do {
disp_matrix();
get_player_move();
done = check(); /* проверка, есть ли победитель */
if(done!= ' ') break; /* есть победитель */
get_computer_move();
done = check(); /* проверка, есть ли победитель */
} while(done== ' ');
if(done=='X') printf("победил первый игрок!\n");
else printf("победил второй игрок!\n");
disp_matrix(); /* показ финальной позиции */
return 0;
}
/* Создание матрицы игры. */
void init_matrix(void)
{
int i, j;
for(i=0; i<20; i++)
for(j=0; j<20; j++) matrix[i][j] = ' ';
}
/* Ход 1 игрока. */
void get_player_move(void)
{
int x, y;
printf("Введите координаты X,Y Вашего хода: ");
scanf("%d%*c%d", &x, &y);
x--; y--;
if(matrix[x][y]!= ' '){
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else matrix[x][y] = 'X';
}
/* Ход 2 игрока. */
void get_player_move(void)
{
int i, j;
printf("Введите координаты i,j Вашего хода: ");
scanf("%d%*c%d", &x, &y);
i--; j--;
if(matrix[i][j]!= ' '){
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else matrix[x][y] = 'X';
}
if(i*j==400) {
printf("Конец игры\n");
exit(0);
}
else
matrix[i][j] = 'O';
}
/* Вывод матрицы на экран. */
void disp_matrix(void)
{
int t;
for(t=0; t<20; t++) {
printf(" %c | %c | %c ",matrix[t][0],
matrix[t][1], matrix [t][2]),
matrix[t][3], matrix [t][4]),
matrix[t][5], matrix [t][6]),
matrix[t][7], matrix [t][8]),
matrix[t][9], matrix [t][10]),
matrix[t][11], matrix [t][12]),
matrix[t][13], matrix [t][14]),
matrix[t][15], matrix [t][16]),
matrix[t][17], matrix [t][18]),
matrix[t][19];
if(t!=19) printf("\n---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---\n");
}
printf("\n");
}
/* Определение победителя. */
char check(void)
{
int i;
for(i=0; i<20; i++)
for(j=0; j<20; j++) /* проверка строк 1 */
if(matrix[i][j]==matrix[i][j+1] &&
matrix[i][j]==matrix[i][j+2] &&
matrix[i][j]==matrix[i][j+3] &&
matrix[i][j]==matrix[i][j+4] ) return matrix[i][j];
for(i=0; i<20; i++)
for(j=0; j<20; j++) /* проверка столбцов */
if(matrix[i][j]==matrix[i+1][j] &&
matrix[i][j]==matrix[i+2][j] &&
matrix[i][j]==matrix[i+3][j] &&
matrix[i][j]==matrix[i+4][j]) return matrix[i][j];
/* проверка диагоналей */
if(matrix[i][j]==matrix[i+1][j+1] &&
matrix[i+1][j+1]==matrix[i+2][j+2]&&
matrix[i+2][j+2]==matrix[i+3][j+3]&&
matrix[i+3][j+3]==matrix[i+4][j+4])
return matrix[i][j];
if(matrix[i][j+4]==matrix[i+1][j+3] &&
matrix[i+1][j+3]==matrix[i+2][j+2])&&
matrix[i+2][j+2]==matrix[i+3][j+1])&&
matrix[i+3][j+1]==matrix[i+4][j])
return matrix[0][2];
return ' ';
}
исправлено немного. помогите, пожалуйста, ещё найти ошибки
#include <stdio.h>
#include <stdlib.h>
char matrix[20][20]; /* матрица игры */
char check(void); /* просматривает строки, столбцы и диагонали в поиске 5 одинаковых символов подряд (Проверить, есть ли победители) */
void init_matrix(void); /* Инициализация игрового поля */
void get_player_move(void); /* Ход игрока */
void disp_matrix(void); /* Вывести игровое поле на экран */
int main(void)
{
{ char done; /* тут добавила { */
done = ' ';
init_matrix();
do {
disp_matrix();
get_player_move();
done = check(); /* проверка, есть ли победитель */
if(done!= ' ') break; /* есть победитель */
done = check(); /* проверка, есть ли победитель */
} while(done== ' ');
if(done=='X') printf("победил первый игрок!\n");
else printf("победил второй игрок!\n");
disp_matrix(); /* показ финальной позиции */
return 0;
}
/* Создание матрицы игры. */
void init_matrix(void)
{
int i, j;
for(i=0; i<20; i++)
for(j=0; j<20; j++) matrix[i][j] = ' ';
}
/* Ход 1 игрока. */
void get_player_move(void)
{
int x, y;
printf("Введите координаты X,Y Вашего хода: ");
scanf("%d%*c%d", &x, &y);
x--; y--;
if(matrix[x][y]!= ' '){
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else matrix[x][y] = 'X';
}
/* Ход 2 игрока. */
void get_player_move(void)
{
int i, j;
printf("Введите координаты i,j Вашего хода: ");
scanf("%d%*c%d", &x, &y);
i--; j--;
if(matrix[i][j]!= ' '){
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else matrix[i][j] = 'O';
}
/*if(i*j==400) {
printf("Конец игры\n");
exit(0);
}
else
matrix[i][j] = 'O';*/
}
/* Вывод матрицы на экран. */
void disp_matrix(void)
{
int t;
for(t=0; t<20; t++) {
printf(" %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c",
matrix[t][0], matrix[t][1], matrix [t][2], matrix[t][3],
matrix [t][4], matrix[t][5], matrix [t][6], matrix[t][7],
matrix [t][8], matrix[t][9], matrix [t][10], matrix[t][11],
matrix [t][12], matrix[t][13], matrix [t][14], matrix[t][15],
matrix [t][16], matrix[t][17], matrix [t][18], matrix[t][19]);
if(t!=19) printf("\n---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---\n");
}
printf("\n");
}
/* Определение победителя. */
char check(void)
{
int i;
for(i=0; i<20; i++)
for(j=0; j<20; j++) /* проверка строк 1 */
if(matrix[i][j]==matrix[i][j+1] &&
matrix[i][j]==matrix[i][j+2] &&
matrix[i][j]==matrix[i][j+3] &&
matrix[i][j]==matrix[i][j+4] ) return matrix[i][j];
for(i=0; i<20; i++)
for(j=0; j<20; j++) /* проверка столбцов */
if(matrix[i][j]==matrix[i+1][j] &&
matrix[i][j]==matrix[i+2][j] &&
matrix[i][j]==matrix[i+3][j] &&
matrix[i][j]==matrix[i+4][j]) return matrix[i][j];
/* проверка диагоналей */
if(matrix[i][j]==matrix[i+1][j+1] &&
matrix[i+1][j+1]==matrix[i+2][j+2]&&
matrix[i+2][j+2]==matrix[i+3][j+3]&&
matrix[i+3][j+3]==matrix[i+4][j+4])
return matrix[i][j];
if(matrix[i][j+4]==matrix[i+1][j+3] &&
matrix[i+1][j+3]==matrix[i+2][j+2])&&
matrix[i+2][j+2]==matrix[i+3][j+1])&&
matrix[i+3][j+1]==matrix[i+4][j])
return matrix[i][j+4];
return ' ';
}Решение задачи: «Ошибка в игре "Крестики-нолики" на 5 ячеек»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
char m[8][8]; /* матрица игры */
char check(void)
{
for(int i=0; i<8; i++)
for(int j=0; j<8; j++) /* проверка строк 1 */
if(m[i][j]==m[i][j+1] &&
m[i][j]==m[i][j+2] &&
m[i][j]==m[i][j+3] &&
m[i][j]==m[i][j+4]) return m[i][j];
for(int i=0; i<8; i++)
for(int j=0; j<8; j++) /* проверка столбцов */
if(m[i][j]==m[i+1][j] &&
m[i][j]==m[i+2][j] &&
m[i][j]==m[i+3][j] &&
m[i][j]==m[i+4][j]) return m[i][j];
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
/* проверка диагоналей */
if(m[i][j]==m[i+1][j+1] &&
m[i+1][j+1]==m[i+2][j+2]&&
m[i+2][j+2]==m[i+3][j+3]&&
m[i+3][j+3]==m[i+4][j+4])
return m[i][j];
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
if(m[i][j+4]==m[i+1][j+3] &&
m[i+1][j+3]==m[i+2][j+2]&&
m[i+2][j+2]==m[i+3][j+1]&&
m[i+3][j+1]==m[i+4][j])
return m[0][2];
return '_';
}
void init_matrix(void)
{
int i, j;
for(i=0; i<8; i++)
for(j=0; j<8; j++) m[i][j] = ' ';
};
void get_player_move(void)
{
int i, j;
printf("Введите координаты X,Y Вашего хода: ");
scanf("%d%*c%d", &i, &j);
//i--; j--;
if(m[i][j]!= ' ')
{
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else m[i][j] = 'X';
};
void get_player2_move(void)
{
int i, j;
printf("Введите координаты X,Y Вашего хода: ");
scanf("%d%*c%d", &i, &j);
//i--; j--;
if(m[i][j]!= ' ')
{
printf("Неверный ход, попытайтесь еще.\n");
get_player2_move();
}
else m[i][j] = 'O';
};
//void get_computer_move(void);
void disp_matrix(void)
{
int t;
for(t=0; t<8; t++) {
printf(" %c | %c | %c | %c | %c | %c | %c | %c |",
m[t][1], m[t][1], m [t][2], m[t][3],m [t][4],
m[t][5], m [t][6], m[t][7], m [t][8]);
if(t!=7) printf("\n---|---|---|---|---|---|---|---|\n");
}
printf("\n");
}
int main(void)
{
char done;
done = ' ';
init_matrix();
do {
disp_matrix();
get_player_move();
disp_matrix();
get_player2_move();
done = check(); /* проверка, есть ли победитель */
if(done!= ' ') break; /* есть победитель */
//get_computer_move();
done = check(); /* проверка, есть ли победитель */
} while(done== ' ');
if(done=='X') printf("победил первый игрок!\n");
else printf("победил второй игрок!\n");
disp_matrix(); /* показ финальной позиции */
return 0;
}
Объяснение кода листинга программы
- Объявлены переменные: char m[8][8]; char check(void); void init_matrix(void); void get_player_move(void); void get_player2_move(void); void disp_matrix(void); int main(void); char done;
- В функции main() объявлен бесконечный цикл do-while, который выполняется до тех пор, пока в игре не появится победитель (переменная done не примет значение ' ').
- В начале каждого хода в игре, выводится текущая игровая доска с помощью функции disp_matrix().
- Игроки по очереди делают ходы, вводя координаты своего хода с помощью функций get_player_move() и get_player2_move().
- После каждого хода проверяется наличие победителя с помощью функции check(). Если победитель есть, то цикл прерывается и выводится сообщение о победе.
- Если после хода победитель не появился, то снова выводится текущая игровая доска и предлагается сделать следующий ход.
- В конце программы, независимо от того, кто выиграл, выводится финальная позиция на доске с помощью функции disp_matrix().
- Функция check() проверяет игру на предмет наличия победителя по горизонтали, вертикали и диагонали. Если все клетки на одной линии заняты одним символом, то этот символ и есть победитель.
- Функция initmatrix() инициализирует игровую доску, заполняя все ее клетки символом ''.
- Функция get_player_move() и get_player2_move() используются для получения координат хода от игроков.
- Функция disp_matrix() выводит текущее состояние игровой доски на экран.