Нечестные крестики-нолики - 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"); }
Объяснение кода листинга программы
- Объявляется два вложенных цикла for для прохода по всем элементам матрицы (N на N)
- В каждой итерации внутреннего цикла выводится символ матрицы A[i][j] с помощью функции printf
- После каждой итерации внутреннего цикла происходит перевод строки с помощью функции printf
- Внешний цикл выполняется N раз, где N - размер матрицы
- Значение N берется из аргумента командной строки при запуске программы
- Если N не указано, то программа выводит сообщение об ошибке и завершается
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д