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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 09:06   #1
SaintBob
Новичок
Джуниор
 
Регистрация: 25.11.2015
Сообщений: 2
По умолчанию Крестики-нолики с выбираемым полем(СИ)

Всем привет форумчане,прошу помочь,в одном щекотливом деле!Как можно исправить данный код игры крестики нолики,чтобы можно было выбирать размер поля и,как сделать проверку ходов универсальную,а не как у меня!Кому не сложно помогите сделать такое!)Заранее спасибо!
Код:
#include <stdio.h>
#include <stdlib.h>

char matrix[3][3];  /* матрица игры */

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;

  printf("Это игра в крестики-нолики.\n");
  printf("Вы будете играть против компьютера.\n");

  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<3; i++)
    for(j=0; j<3; j++) matrix[i][j] =  ' ';
}

/* Ход игрока. */
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';
}

/* Ход компьютера. */
void get_computer_move(void)
{
  int i, j;
  for(i=0; i<3; i++){
    for(j=0; j<3; j++)
      if(matrix[i][j]==' ') break;
    if(matrix[i][j]==' ') break;
  /* Второй break нужен для выхода из цикла по i */
  }

  if(i*j==9)  {
    printf("Конец игры\n");
    exit(0);
  }
  else
    matrix[i][j] = 'O';
}

/* Вывод матрицы на экран. */
void disp_matrix(void)
{
  int t;

  for(t=0; t<3; t++) {
    printf(" %c | %c | %c ",matrix[t][0],
            matrix[t][1], matrix [t][2]);
    if(t!=2) printf("\n---|---|---\n");
  }
  printf("\n");
}

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

  for(i=0; i<3; i++)  /* проверка строк */
    if(matrix[i][0]==matrix[i][1] &&
       matrix[i][0]==matrix[i][2]) return matrix[i][0];

  for(i=0; i<3; i++)  /* проверка столбцов */
    if(matrix[0][i]==matrix[1][i] &&
       matrix[0][i]==matrix[2][i]) return matrix[0][i];

  /* проверка диагоналей */
  if(matrix[0][0]==matrix[1][1] &&
     matrix[1][1]==matrix[2][2])
       return matrix[0][0];

  if(matrix[0][2]==matrix[1][1] &&
     matrix[1][1]==matrix[2][0])
       return matrix[0][2];

  return ' ';
}
SaintBob вне форума Ответить с цитированием
Старый 25.11.2015, 09:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

На счет выбора размеров поля:
Код:

#include <stdio.h>
#include <stdlib.h>

int n=0;
char **matrix;  /* матрица игры */
...
/* Инициализация матрицы игры. */
void init_matrix(void)
{
  int i, j;
  cout<<"Какова ширь?"; cin>>n;
  matrix=new int*[n];
  for(i=0; i<n; i++) { matrix[i]=new int[n];
    for(j=0; j<n; j++) matrix[i][j] =  ' ';
 }
}
И везде в циклах 3 на n поменять.

А вот проверку придется переписывать кардинально. Циклами проверять.

P.S. А, и по завершению программы matrix освобождать не забывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2015, 10:02   #3
SaintBob
Новичок
Джуниор
 
Регистрация: 25.11.2015
Сообщений: 2
По умолчанию

Если не сложно,можете проверку переписать, а то до меня самого не допрёт)Только на С а не С++)Заранее спасибо!
SaintBob вне форума Ответить с цитированием
Старый 25.11.2015, 11:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну в принципе могу предложить проверять координату:
Код:
bool check(int x,int y,char c){
 bool b[4]={1,1,1,1}; int i;
 for(i=0;i<n;i++) {
  //Проверяем по вертикали
  if(matrix[i][x]!=c) b[0]=false;
  //Проверяем по горизонтали
  if(matrix[y][i]!=c) b[1]=false;
  //Проверяем по диагонали
  if(((i+x)<n) && (matrix[i][i+x]!=c)) b[2]=false;
  if(((n-i+x)>0) && (matrix[i][n-i+x]!=c)) b[3]=false;
 }
 //Если хоть одна из проверок выстраивает в ряд - результат true
 return b[0] || b[1] || b[2] || b[3];
}
Примерно так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
крестики нолики) Тамерлан Абилов Паскаль, Turbo Pascal, PascalABC.NET 6 02.09.2013 21:25
Крестики нолики Anonim69 JavaScript, Ajax 8 08.12.2010 06:00
крестики-нолики {PatRioT} Паскаль, Turbo Pascal, PascalABC.NET 4 14.05.2009 13:24
Крестики-нолики mish@ Общие вопросы Delphi 6 07.05.2009 11:01