Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 13:33   #1
Кэр
Новичок
Джуниор
 
Регистрация: 19.05.2013
Сообщений: 2
По умолчанию игра в крестики-нолики на си. в чём ошибка?

играют 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 ' ';
}

Последний раз редактировалось Stilet; 19.05.2013 в 13:58.
Кэр вне форума Ответить с цитированием
Старый 19.05.2013, 13:43   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

почему ты решил что тут есть ошибки?

Код:
for(j=0; j<20; j++)  /* проверка строк 1 */
    if(matrix[i][j]==matrix[i][j+1] &&
тут ты вылезишь за пределы массива и во всех остальных случаях тоже.

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

Код:
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];
магические числа 0, 2 странные, тут тоже поди ошибка

Код:
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];
используй уже циклы, ЗЫ тут видно, что ты скопипастил код для крестиков-ноликов для поля 3х3 )

Последний раз редактировалось rrrFer; 19.05.2013 в 13:59.
rrrFer вне форума Ответить с цитированием
Старый 19.05.2013, 19:57   #3
Кэр
Новичок
Джуниор
 
Регистрация: 19.05.2013
Сообщений: 2
По умолчанию

а теперь что не так?
PHP код:
#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 ij;

  for(
i=0i<20i++)
    for(
j=0j<20j++) matrix[i][j] =  ' ';
}

/* Ход 1 игрока. */
void get_player_move(void)
{
  
int xy;

  
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 ij;

  
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=0t<20t++) {
    
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!=19printf("\n---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---\n");
  }
  
printf("\n");
}

/* Определение победителя. */
char check(void)
{
  
int i;

  for(
i=0i<20i++) 
  for(
j=0j<20j++)  /* проверка строк 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=0i<20i++) 
  for(
j=0j<20j++) /* проверка столбцов */
    
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 
' ';

Кэр вне форума Ответить с цитированием
Старый 19.05.2013, 20:51   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а теперь что не так?
Наводящий вопрос: а с чего Вы взяли, что что-то не так?
Было бы вежливо предоставить информацию о видимом поведении программы, если хотите услышать догадки о причинах этого поведения, не находите?..
Код:
for(j=0; j<20; j++)  /* проверка строк 1 */
    if(matrix[i][j]==matrix[i][j+1]
При j=19 имеем выход за пределы массива. Логическая ошибка.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра крестики нолики на PHP 777111 Помощь студентам 1 14.12.2011 00:53
нужна игра крестики -нолики ali_men Помощь студентам 2 30.04.2011 12:32
Игра крестики нолики Lacrim Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 27.05.2010 04:10
Игра крестики - нолики Linker88 Фриланс 23 28.05.2009 00:41