Что нужно знать, чтобы написать игру "Змейка" - C (СИ)
Формулировка задачи:
Подскажите пожалуйста,хочу написать игру "змейка" кое-какие наработки уже есть,но пока весьма скудные. Что-нибудь можно почитать конкретно по созданию игр на Си?
Решение задачи: «Что нужно знать, чтобы написать игру "Змейка"»
textual
Листинг программы
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
const int KB_UP = 72;
const int KB_DOWN = 80;
const int KB_LEFT = 75;
const int KB_RIGHT = 77;
const int KB_EXIT = 27;
const int KB_NO = -1;
int getKey();
int getKey() {
int c;
if ( kbhit() ) {
c = getch();
if ( c == 224 )
c = getch();
switch ( c ) {
case KB_UP:
case KB_DOWN:
case KB_LEFT:
case KB_RIGHT:
case KB_EXIT:
return c;
default:
return KB_NO;
}
} else {
return KB_NO;
}
}
int main() {
double timer = 0;
double bcnt = 0.0;
double stepTime = 0.01;
double speed = 1;
int c;
int x = 10, y =10
int xdir = 0, ydir = 0;
while( 1 ) {
c = getKey();
if ( c == KB_EXIT ) return 0;
if ( c != KB_NO ) {
if ( c == KB_UP ) {
xdir = -1;
ydir = 0;
} else if ( c == KB_DOWN ) {
xdir = 1;
ydir = 0;
} else if ( c == KB_LEFT ) {
xdir = 0;
ydir = -1;
} else if ( c == KB_RIGHT ) {
xdir = 0;
ydir = 1;
}
}
Sleep( ( int ) ( stepTime * 1000.0 ) );
timer += stepTime;
bcnt += speed * stepTime;
while ( bcnt >= 1.0 ) {
x += xdir;
y += ydir;
system( "cls" );
bcnt -= 1.0;
for ( int xi = 0; xi < 25; xi++ ) {
if ( xi == x ) {
for ( int yi = 0; yi < 25; yi++ ) {
if ( yi == y ) {
printf( "#" );
break;
} else {
printf( " " );
}
}
printf( "\n" );
} else {
printf( "\n" );
}
}
}
/*
if ( timer >= 1.0 ) {
timer -= 1.0;
}
*/
}
system( "pause" );
return 0;
}
Объяснение кода листинга программы
- В начале кода объявлены константы для клавиш управления змейкой и ее движения.
- Далее определена функция
getKey(), которая считывает нажатие клавиши и возвращает ее код. - В функции
main()инициализированы переменные: двойные переменныеtimerиbcntдля отслеживания времени и количества съеденных блоков,stepTimeдля регулирования скорости игры,speedдля управления скоростью змейки, а также переменныеx,y,xdirиydirдля управления движением змейки. - В основном цикле игры в бесконечном цикле считывается нажатие клавиши. Если нажата клавиша управления змейкой, то направление движения змейки меняется.
- Каждый шаг игры (изменение положения змейки) происходит после задержки, регулируемой
stepTime. - После каждого шага игры обновляется счетчик съеденных блоков
bcntи отображается текущее состояние игры (положение змейки и съеденные блоки). - Если
timerдостигает 1.0, то происходит регенерация яблока (не реализована в данном коде). - В конце игры выводится сообщение
Press any key to continue....