Ошибка в игре "Крестики-нолики" на 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;
}

Объяснение кода листинга программы

  1. Объявлены переменные: 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;
  2. В функции main() объявлен бесконечный цикл do-while, который выполняется до тех пор, пока в игре не появится победитель (переменная done не примет значение ' ').
  3. В начале каждого хода в игре, выводится текущая игровая доска с помощью функции disp_matrix().
  4. Игроки по очереди делают ходы, вводя координаты своего хода с помощью функций get_player_move() и get_player2_move().
  5. После каждого хода проверяется наличие победителя с помощью функции check(). Если победитель есть, то цикл прерывается и выводится сообщение о победе.
  6. Если после хода победитель не появился, то снова выводится текущая игровая доска и предлагается сделать следующий ход.
  7. В конце программы, независимо от того, кто выиграл, выводится финальная позиция на доске с помощью функции disp_matrix().
  8. Функция check() проверяет игру на предмет наличия победителя по горизонтали, вертикали и диагонали. Если все клетки на одной линии заняты одним символом, то этот символ и есть победитель.
  9. Функция initmatrix() инициализирует игровую доску, заполняя все ее клетки символом ''.
  10. Функция get_player_move() и get_player2_move() используются для получения координат хода от игроков.
  11. Функция disp_matrix() выводит текущее состояние игровой доски на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы