Нечестные крестики-нолики - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Суть в том, что при игре всё время ходят или "нолики" или "крестики". Хотя в ходе "разработки" всё нормально было. Не пойму, чо так
#include<stdio.h>
#include<Windows.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    system("color F0");
    
    const int N=3;
    int i, j;
    int x, y, k, digit;
    char A[N][N], c, z;
    char  string[100], string1[100];
    z = '0';
    c = 'X';
    char a[] = "НОЛИКИ  ";
    char b[] = "КРЕСТИКИ";
    char s[] = "        ";
    
    printf("        Игра Крестики-Нолики\n");
    printf("Имя первого игрока: \n");
    fgets( string, 100, stdin ); 
    printf("Имя второго игрока: \n");
    fgets(string1, 100, stdin);
    printf("Игроки: \n %s та \n%s (нажмите Enter)", string, string1);
    getchar();
    
    printf("За кого играет игрок 1? Введите цифру.\n");
    printf("0: 1 \nX: 2\n");
    printf("Цифра: ");
    scanf("%i", &digit);
    
    for (i = 0; i < N; i++)
{
    for (j = 0; j < N; j++)
    {
      A[i][j] = '?';
      printf("%c ", A[i][j]);
      
   }
printf("\n");
}
 
    for(i=0;i<9;i++)
    {
        if ((!(i % 2)) && (digit == 1)) strncpy(s, a, sizeof(s));
        if ((i % 2) && (digit == 2)) strncpy(s, a, sizeof(s));
        if ((!(i % 2)) && (digit == 2)) strncpy(s, b, sizeof(s));
        if ((i % 2) && (digit == 1)) strncpy(s, b, sizeof(s));
        
        printf("Ход игрока %s\n", s);
        printf("Строка: ");
        scanf("%i", &x);
        printf("Столбик: ");
        scanf("%i", &y);
        x--;
        y--;
        if (A[x][y] != '?') {
        printf("\n Эта позиция занята!\n");
        }
        
        if ((!(i % 2)) && (digit == 1)) A[x][y] = z;
        if ((i % 2) && (digit == 2)) A[x][y] = z;
        if ((!(i % 2)) && (digit == 2)) A[x][y] = c;
        if ((i % 2) && (digit == 1)) A[x][y] = c;
        k = 0;
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                printf("%c ", A[i][j]);
            }
            printf("\n");
        }
 
        if (((A[0][0] == '0') && (A[1][0] == '0') && (A[2][0] == '0')) ||
            ((A[0][1] == '0') && (A[1][1] == '0') && (A[2][1] == '0')) ||
            ((A[0][2] == '0') && (A[1][2] == '0') && (A[2][2] == '0')) ||
            ((A[0][0] == '0') && (A[0][1] == '0') && (A[0][2] == '0')) ||
            ((A[1][0] == '0') && (A[1][1] == '0') && (A[1][2] == '0')) ||
            ((A[2][0] == '0') && (A[2][1] == '0') && (A[2][2] == '0')) ||
            ((A[0][0] == '0') && (A[1][1] == '0') && (A[2][2] == '0')) ||
            ((A[2][0] == '0') && (A[1][1] == '0') && (A[0][2] == '0')) ||
            ((A[0][0] == 'X') && (A[1][0] == 'X') && (A[2][0] == 'X')) ||
            ((A[0][1] == 'X') && (A[1][1] == 'X') && (A[2][1] == 'X')) ||
            ((A[0][2] == 'X') && (A[1][2] == 'X') && (A[2][2] == 'X')) ||
            ((A[0][0] == 'X') && (A[0][1] == 'X') && (A[0][2] == 'X')) ||
            ((A[1][0] == 'X') && (A[1][1] == 'X') && (A[1][2] == 'X')) ||
            ((A[2][0] == 'X') && (A[2][1] == 'X') && (A[2][2] == 'X')) ||
            ((A[0][0] == 'X') && (A[1][1] == 'X') && (A[2][2] == 'X')) ||
            ((A[2][0] == 'X') && (A[1][1] == 'X') && (A[0][2] == 'X')))
            {
                k++;
                printf("Конец игры\n");
                
                if ((A[x][y] == z) && (digit == 1)) printf("Игрок %s победил!\n", string);
                if ((A[x][y] == z) && (digit == 2)) printf("Игрок %s победил!\n", string1);
                if ((A[x][y] == c) && (digit == 1)) printf("Игрок %s победил!\n", string1);
                if ((A[x][y] == c) && (digit == 2)) printf("Игрок %s победил!\n", string);
                break;
            }
    }
    
    if (!(k))
    printf("Ничья!");
    
    system("PAUSE");
    return 0;
}

Решение задачи: «Нечестные крестики-нолики»

textual
Листинг программы
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                printf("%c ", A[i][j]);
            }
            printf("\n");
        }

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

  1. Объявляется два вложенных цикла for для прохода по всем элементам матрицы (N на N)
  2. В каждой итерации внутреннего цикла выводится символ матрицы A[i][j] с помощью функции printf
  3. После каждой итерации внутреннего цикла происходит перевод строки с помощью функции printf
  4. Внешний цикл выполняется N раз, где N - размер матрицы
  5. Значение N берется из аргумента командной строки при запуске программы
  6. Если N не указано, то программа выводит сообщение об ошибке и завершается

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


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

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

7   голосов , оценка 4.143 из 5