Непонятная ошибка в двоичном массиве - 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 Пожалуйста, уточните, если нужно более подробное объяснение или если есть дополнительные вопросы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д