Ошибка в игре "Крестики-нолики" на 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() выводит текущее состояние игровой доски на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д