Непонятная ошибка в двоичном массиве - C (СИ)
Формулировка задачи:
Здравствуйте. Изучаю Си для себя. Разработал следующую программу: на экран выводится двоичный массив 10*10, по краю ограничен "стенкой". В каком-то месте располагается символ Х. При введении 'a' 's' 'd' 'w' символ Х перемещается в разные стороны, если упирается в стенку, то остается на месте.
Проблема заключается в функции moveDown. При вводе 's' символ Х сразу перемещается в самый низ к стенке. Хотя три остальные функции работают правильно. Не пойму, в чем проблема. Всю голову сломал. Функции практически идентичные, делались путем Ctrl+C Ctrl+V.
Причем, если использовать следующий костыль
то все работает правильно. В чем может быть причина?
#include <stdio.h>
#include <windows.h>
#define X 10
#define Y 10
void masShow(int mas[][Y], int x, int y); \\ выводит массив на экран
void moveRight(int mas[][Y], int x, int y); \\ смещение Х вправо
void moveLeft(int mas[][Y], int x, int y); \\ смещение Х влево
void moveUp(int mas[][Y], int x, int y); \\ смещение Х вверх
void moveDown(int mas[][Y], int x, int y); \\ смещение Х вниз
int main()
{
int button;
int mas[X][Y]={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0}, \\ 0 - стенка; 1 - пробел; 2 - Х
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,2,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
masShow(mas,X,Y);
while((button=getchar())!='q') \\ для завершения программы ввести q
{
switch(button)
{
case 'd':
moveRight(mas,X,Y);
masShow(mas,X,Y);
break;
case 'a':
moveLeft(mas,X,Y);
masShow(mas,X,Y);
break;
case 'w':
moveUp(mas,X,Y);
masShow(mas,X,Y);
break;
case 's':
moveDown(mas,X,Y);
masShow(mas,X,Y);
break;
}
}
getchar();
return 0;
}
void masShow(int mas[][Y], int x, int y)
{
int a,b;
system("cls");
for(a=0; a<x; a++)
{
for(b=0; b<y; b++)
{
if(mas[a][b]==0)
printf("#");
if(mas[a][b]==1)
printf(" ");
if(mas[a][b]==2)
printf("X");
}
printf("\n");
}
}
void moveRight(int mas[][Y], int x, int y)
{
int a,b;
for(a=0; a<x; a++)
{
for(b=0; b<y; b++)
{
if((mas[a][b]==2)&&(b<Y-2))
{
mas[a][b]=1;
mas[a][b+1]=2;
break;
}
}
}
}
void moveLeft(int mas[][Y], int x, int y)
{
int a,b;
for(a=0; a<x; a++)
{
for(b=0; b<y; b++)
{
if((mas[a][b]==2)&&(b>1))
{
mas[a][b]=1;
mas[a][b-1]=2;
break;
}
}
}
}
void moveDown(int mas[][Y], int x, int y)
{
int a,b;
for(a=0; a<x; a++)
{
for(b=0; b<y; b++)
{
if((mas[a][b]==2)&&(a<X-2))
{
mas[a][b]=1;
mas[a+1][b]=2;
break;
}
}
}
}
void moveUp(int mas[][Y], int x, int y)
{
int a,b;
for(a=0; a<x; a++)
{
for(b=0; b<y; b++)
{
if((mas[a][b]==2)&&(a>1))
{
mas[a][b]=1;
mas[a-1][b]=2;
break;
}
}
}
}mas[a][b]=1;
a=a+1;
mas[a][b]=2;
break;Решение задачи: «Непонятная ошибка в двоичном массиве»
textual
Листинг программы
if((mas[a][b]==2)&&(a<X-2))
Объяснение кода листинга программы
В представленном коде выполняется проверка условия для двоичного массива. В данном случае, проверяется, что элемент массива с индексами a и b равен 2, а значение переменной a меньше X-2.
Код можно оформить в виде списка следующим образом:
- Объявление переменных:
- mas[a][b] - элемент двоичного массива с индексами
aиb - X - размер массива
- mas[a][b] - элемент двоичного массива с индексами
- Проверка условия:
- mas[a][b] == 2 - проверка, что элемент массива равен 2
- a < X-2 - проверка, что значение переменной
aменьше размера массива минус 2 Вот как это может выглядеть в виде списка:
- Объявление переменных:
- mas[a][b] - элемент двоичного массива с индексами
aиb - X - размер массива
- mas[a][b] - элемент двоичного массива с индексами
- Проверка условия:
- mas[a][b] == 2 - проверка, что элемент массива равен 2
- a < X-2 - проверка, что значение переменной
aменьше размера массива минус 2 Пожалуйста, уточните, если нужно более подробное объяснение или если есть дополнительные вопросы.