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

–  void worm() – вывод червя указанной длины и цвета.

Принцип работы:элементы тела червя выводятся по координатам, содержащимся в массиве wormArray[][] с помощью функций gotoXY() и printf(). Длина червя принимается параметром

–  voidgotoXY() – перевод курсора в положение X,Yи придание цветового атрибута фону выводимых символов.

6.  Вывод

В ходе выполнения контрольной работы я научился использовать двумерный массив для реализации алгоритма анимации движения на экране консоли, пользоваться функциями kbhit(), getch(), gotoXY(), Sleep().

7.  Пример работы программы


8.  Приложение. Текст программы

#include <stdio.h>

#include <time.h>

#include <conio.h>

#include <windows.h>

#define ESC 27

#define ENTER 13

#define LEFT 75

#define UP 72

#define RIGHT 77

#define DOWN 80

#define MAX_SIZE 45

#define RESTART_CODE -1                                // код перезапуска игры

#define CONTINUE_CODE 1                                // код продолжения

#define EXIT_SUCCESS 0                                 // код нормального выхода

#define EXIT_DEBUG_EVENT 5                             // отладочный код выхода

void newGame    ( );                                   // новая игра

void newPrize   ( );                                   // вывод приза

int  crawling   ( int [] [2] , int* , int , int   );     // управление процессом игры

int  wormBuilt  ( int [] [2] , int* , int , int   );

void worm       ( int [] [2] , int* , int        );

void gotoXY     ( int       , int  , int        );

enum Color {                                           // перечисление цветов вывода

Black = 0,

Blue = 1,

Green = 2,

Cyan = 3,

Red = 4,

Magenta = 5,

Brown = 6,

LightGray = 7,

DarkGray = 8,

LightBlue = 9,

LightGreen = 10,

LightCyan = 11,

LightRed = 12,

LightMagenta = 13,

Yellow = 14,

White = 15

};

struct PRIZE

{

Int    x;

int    y;

char   face;

unsigned int  color;

int    wormColor;

} prize;

int main ( )

{

SetCursorPos ( 600 , 0 ) ;

SetConsoleTitleA( "SNAKE the control work by vk.com/KIVINEW" ) ;

newGame ( ) ;

return 0 ;

}

void newGame  ( )                                      // новая игра

{

gotoXY ( 0 , 0 , White );                      // установим цвет фона белым     

int quiteCode ;                                 // переменная-признак

do

{

system ( "cls" ) ;

int lenght = MAX_SIZE - 41 ;              // длина червя

int wormArray [ MAX_SIZE ] [ 2 ] = { 40 , 12 } ; // начальные координаты червя

prize . color = LightGreen ;              // начальный цвет червя

newPrize ( ) ;

int dX, dY ;

dY = 0 ;

dX = rand ( ) % 3 - 1 ;

if ( dX == 0 ) dY = 1 ;

/* crawling() возвращает код выхода RESTART_CODE или EXIT_SUCCESS в переменную-признак. В аргументах массив с элементами тела червя, длина червя и сдвиги по осям Х и У.  */

quiteCode = crawling ( wormArray , &lenght , dX , dY ) ;

if ( quiteCode == EXIT_SUCCESS ) return ;  // выход из игры

} while ( quiteCode == RESTART_CODE ) ;           // циклический вызов новой игры

printf ( "\n\t%d" , quiteCode ) ;

_getch ( ) ;

return ;

}

void newPrize ( )                                      // сгенерировать случайные координаты

{

srand ( ( unsigned int ) time ( NULL ) ) ;

rand ( ) ;                                      // для сбивания первого неслучайного значения

int x , y , face , color ;

x = rand ( ) % 78 + 1 ;

y = rand ( ) % 23 + 1 ;

face = ' ' ;                                    // это символ которым обозначен на поле приз

color = rand ( ) % 7 + 8 ;

prize . wormColor = prize . color;

prize . color = color ;

prize . x = x ;                                 // присвоить свойства приза ...

prize . y = y ;                                 // ... полям структуры prize

prize . face = face ;

gotoXY ( x , y , color ) ;                       // ... а тут эти свойства ...

printf ( "%c" , face ) ;                         // ... используются для вывода приза

return ;

}

int crawling  ( int wormArray [] [2] , int *lenght , int dX , int dY ) // управление процессом игры

{

do                                             // бесконечный цикл

{

int resultCode;

while (!_kbhit())

{

resultCode = wormBuilt ( wormArray , lenght , dX , dY ) ; //     ОСНОВНОЙ

if ( resultCode == RESTART_CODE ) return RESTART_CODE;   //     РАБОЧИЙ

if ( resultCode == EXIT_SUCCESS ) return EXIT_SUCCESS;   //     ЦИКЛ  

Sleep ( 70 ) ;

}

char pressedKey = _getch ( ) ;

switch ( pressedKey )

{