Использование двумерного массива для реализации алгоритма анимации движения на экране консоли, страница 3

case ESC:

system ("cls");

return EXIT_SUCCESS;

break;

case ENTER:

return RESTART_CODE ;

break;

case LEFT:

if ( dX != 1 )                        // Если не двигаемся вправо,

{

dX = -1 ;                         // смещение по оси Х влево.

dY = 0 ;

}

break;

case RIGHT:

if ( dX != -1 )                       // Если не двигаемся влево,

{

dX = 1 ;                          // смещение по оси Х вправо.

dY = 0 ;

}

break;

case UP:

if ( dY != 1 )                        // Если не двигаемся вниз,

{

dY = -1 ;                         // то двигаемся вверх.

dX = 0 ;

}

break;

case DOWN:

if ( dY != -1 )                       // Если не двигаемся вверх,

{

dY = 1 ;                          // то двигаемся вниз.

dX = 0 ;

}

break;

}

} while ( TRUE ) ;                              // бесконечный цикл

return EXIT_DEBUG_EVENT;

}

int wormBuilt ( int wormArray [] [2] , int *lenght , int dX , int dY ) // изменение массива с

// координатами тела червя ...

{                                                     // ... и проверки на столкновения

int tmpX , tmpY ;                                                                

tmpX = wormArray [ 0 ] [ 0 ] + dX ;              // сохраняем координаты головы червя

tmpY = wormArray [ 0 ] [ 1 ] + dY ;              // и прибавляем смещение

int i ;

// проверка на столкновение головы с другими элементами

// его тела, —1 чтобы не сталкиваться с невидимой частью хвоста

for ( i = 4 ; i < *lenght - 1 ; i++ )

{

if (tmpX == wormArray[i][0])              // если координата Х совпала –

{                                        // проверяем

if (tmpY == wormArray[i][1])       // координату У, если она

{                                 // тоже совпала, то ...

worm ( wormArray , lenght , LightRed + 8 ) ;

worm ( wormArray , lenght , White + 8 ) ;// затираем червяка белым цветом

*lenght -= 3;               // уменьшаем длину тела и ...

worm ( wormArray , lenght , LightRed + 8 ) ;                                                     return CONTINUE_CODE;       // ... играем дальше

}

}

}

if ( tmpX < 1 || tmpX > 78 || tmpY < 1 || tmpY > 23 ) // проверка на выход за границы поля

{

--*lenght ;                              // уменьшаем длину тела червяка

worm ( wormArray , lenght , LightRed + 8 ) ;

if ( *lenght < 3 )                        // если длина стала минимальной ...

{

if ( _getch ( ) == ESC ) return EXIT_SUCCESS;

return RESTART_CODE;               // играем заново,

}                                        // а если нет...

return CONTINUE_CODE ;                    // ... то движемся дальше

}

if ( tmpX == prize . x )                         // проверка координат головы

{                                              // на совпадение с координатами фруктов

if ( tmpY == prize . y )

{

++ *lenght ;

worm ( wormArray , lenght , prize . color +8) ;

Sleep ( 70 ) ;

if ( *lenght > MAX_SIZE )          // увеличиваем длину червя и проверяем

{                                 // её на превышение максимума.

return RESTART_CODE;        // если длина максимальна, перезапускаем игру

}

newPrize ( );                     // создаем новый приз

}

}

for ( i = *lenght - 1 ; i > 0 ; i-- )            // сдвигаем элементы червя на один вправо

{

wormArray [i] [0] = wormArray [i - 1] [0] ;

wormArray [i] [1] = wormArray [i - 1] [1] ;

}

wormArray [0] [0] = tmpX ;                       // восстанавливаем координаты головы

wormArray [0] [1] = tmpY ;

worm ( wormArray , lenght , prize . wormColor ) ; // вывод тела червя цветом найденного приза

return CONTINUE_CODE;

}

void worm ( int wormArray [] [2] , int *lenght , int wormColor ) // вывод червя

{

int i ;

for ( i = 0 ; i < *lenght - 1 ; i++ )

{

int x , y ;

x = wormArray [i] [0] ;

y = wormArray [i] [1] ;

gotoXY ( x , y , wormColor - 8 ) ;

printf ( "%c", 32 ) ;

}

int tailX , tailY;                              // хвостовой элемент, затирающий след

tailX = wormArray [i] [0] ;

tailY = wormArray [i] [1] ;

gotoXY ( tailX , tailY , White ) ;

printf ( "%c" , 32 );

return ;

}

void gotoXY ( int x , int y , int back )                 // перевод курсора в положение X,Y

{

HANDLE console = GetStdHandle ( STD_OUTPUT_HANDLE ) ;

COORD coord ;

coord . X = x ;

coord . Y = y ;                                          

SetConsoleCursorPosition ( console , coord ) ;       // позиция курсора

SetConsoleTextAttribute ( console , (WORD) ( back << 4 ) ) ; // цвет фона | цвет символов

return;

}