Нечестные крестики-нолики - 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 не указано, то программа выводит сообщение об ошибке и завершается