Крестики-нолики с выбираемым полем

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
SaintBob
Сообщения: 1
Зарегистрирован: 25 ноя 2015, 09:16

Всем привет форумчане,прошу помочь,в одном щекотливом деле!Как можно исправить данный код игры крестики нолики,чтобы можно было выбирать размер поля и,как сделать проверку ходов универсальную,а не как у меня!Кому не сложно помогите сделать такое!)Заранее спасибо!

Код: Выделить всё

#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 ' ';
}
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

ну например так:
(этот код не претендует на отсутствие ошибок в математической части)

Код: Выделить всё

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

#define Rows 3
#define Cols 3

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

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)
{
    memset(matrix, ' ', sizeof(matrix)); // так быстрее и красивее заполнить весь массив пробелами
}

/* Ход игрока. */
void get_player_move(void)
{
  do {
      unsigned int x = 0, y = 0; // лучше юзать в данном случае беззнаковый тип, чтобы не проверять на отрицательность
      int scanResult = 0;

      printf("Введите координаты X,Y Вашего хода: ");

      scanResult = scanf("%d%*c%d", &x, &y);
      --x; --y;

      if(
            0 == scanResult // а вдруг ввели не числа
         || y >= Rows        // проверим что не вылезли за границу массива
         || x >= Cols
         || ' ' != matrix[x][y]
        ) {
        char c = EOF;
        printf("Неверный ход, попытайтесь еще.\n");
        while ( (c = getchar()) != '\n' && c != EOF ); // надо очистить входной буфер для следующего scanf
      }
      else {
          matrix[x][y] = 'X';
          break;
      }
  } while(1);
}

/* Ход компьютера. */
void get_computer_move(void)
{
  unsigned int i = 0, j = 0;
  for(i=0; i<Rows; i++) {

    for(j=0; j<Cols; j++) { // в таких местах лучше расставлять фигурные скобочки для понятности кода
      if(matrix[i][j]==' ') break;
    }
    if(matrix[i][j]==' ') break;
  /* Второй break нужен для выхода из цикла по i */
  }

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

static void printLine(unsigned int y);
static void printLastLine();
/* Вывод матрицы на экран. */
void disp_matrix(void)
{
  unsigned int y = 0;
  for(; y < Rows; ++y) {
      printLine(y);
      printf("\n");
      if ( Rows-1 != y) printLastLine();
      printf("\n");
  }
}

static void printLine(unsigned int y) {

  unsigned int x = 0;
  for(; x < Cols; ++x) {
    printf( 
             " %c %s" // ' X |'
           , matrix[x][y]
           , Cols-1 != x ? "|" : ""
          );
  }
}

static void printLastLine() {
  unsigned int x = 0;
  for(; x < Cols; ++x) printf("---%s", Cols-1 != x ? "|" : "" );
}

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

  { // проверка строк
      unsigned int y = 0;
      for(; y < Rows; ++y) {
          unsigned int x = 0;
          const char c = matrix[x][y]; // запомним первый элемент строки
          ++x;                         // и сравним его с остальными
          for(; x < Cols; ++x) if ( c == matrix[x][y] ) return matrix[x][y];
      }
  }

  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  // А дальше по аналогии сам догадаешься !!!!!!!!!! ))))
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  for(i=0; i<Rows; 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 ' ';
}
Ответить