Нужно исправить управление:
-Запретить движение в обратную сторону;
-Сделать управление стрелочками;
Если есть какие нибуть идеи, буду очень рад их увидеть.
Код:
#include <stdlib.h> //для рандомной расстановки
#include <windows.h>//для задержки
#include <stdio.h>
#include <conio.h>
//Прототипы
void draw_line(int x, int y);
void show_score();
void move();
void setup_level();
//Глобальные переменные
const int maxy=15, maxx=77;
const int snake_start_x=33,snake_start_y=7;
const char up_key='w', down_key='s', left_key='a', right_key='d';
int score, sl, speed, food, i, level, firstpress, high_score=0;
char food_field[maxy][maxx];
char direction = right_key;
struct snake_segment {
int y,x;
char h=1;
} snake[100];
//Начало программы
main()
{
int y1,x1;
char keypress;
//Круг рестарта игры
do
{
food=3; level=1; score=0; speed=150;
rand();
setup_level();
//Главный круг игры
do
{
Sleep(speed);
//Изменение направления
if (kbhit())
{
keypress=getch();
direction=keypress;
}
move();
//Пустой последний сегмент змеи
gotoxy(snake[0].x,snake[0].y);
cprintf(" ");
//удаляем его из масива
for (i=1;i<=sl;i++)
snake[i-1]=snake[i];
//Перекрашиваем змея в зелёный
textcolor(LIGHTGREEN);
for (i=0;i<=sl;i++)
{
gotoxy(snake[i].x,snake[i].y);
cprintf("0");
}
//Голова змеи
textcolor(DARKGRAY);
y1=wherey();
x1=wherex();
gotoxy(x1-1,y1); cprintf("%c",h);
for (i=0;i<=sl;i++)
if(keypress==up_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==down_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==left_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==right_key){gotoxy(x1-1,y1); cprintf("%c",h);}
//Делаем курсор невидимым
_setcursortype(_NOCURSOR);
//Пауза перед каждым уровнем
if (firstpress) { while(!kbhit()); firstpress = 0; }
/*Определение врезания в стены*/
if ((snake[sl-1].y>maxy+2)||(snake[sl-1].y<=2)||
(snake[sl-1].x>maxx+1)||(snake[sl-1].x<=1)||
/*Врезания в камни */
(food_field[snake[sl-1].y-3][snake[sl-1].x-2]=='X'))
keypress='x'; //конец игры
//врезания ззмеии самой в себя
for (i=0;i<sl-1;i++)
if ( (snake[sl-1].y)==(snake[i].y) &&
(snake[sl-1].x)==(snake[i].x))
{
keypress='x'; //Конец игры
}
//Обнаружение еды
if (food_field[snake[sl-1].y-3][snake[sl-1].x-2]=='*')
{
//увеличение очков и длины змеи
score+=sl+food; show_score(); sl++;
//Переход на следующий уровень
if (sl==(level+3)*2)
{
score+=level*1; food+=1; level++;// увеличения уровня и количества еды
if ((level%2==0)&&(speed>1)) speed-10;// увеличения скорости каждые два уровня
setup_level(); //Установки уровня
}
}
} while (keypress!='x'); //Конец игрового цикла
if (score > high_score) high_score = score;
show_score();
gotoxy(30,7); textcolor(LIGHTRED); cprintf("G A M E O V E R");
gotoxy(30,10); textcolor(YELLOW); cprintf("Another Game (y/n)? ");
do keypress=getch(); while((keypress!='y')&&(keypress!='n'));
} while (keypress=='y'); //перезапуск игрвого цикла
return 0;
}
void setup_level() //Функция установки уровня
{
int y,x,i;
//Настройка глобальных переменных для нового уровня
sl=level+4; direction=right_key;
firstpress=1;
//Зполнение поля символами ' '
for(y=0;y<maxy;y++)
for(x=0;x<maxx;x++)
food_field[y][x]= ' ';
//Заполнение поля камнями и едой
for(i=0;i<food*2;i++)
{
y= rand()%maxy;
x= rand()%maxx;
if(i<food)
food_field[y][x]='X';
else
food_field[y][x]='*';
}
//Создание массива длины sl
for(i=0;i<sl;i++)
{
snake[i].y=snake_start_y;
snake[i].x=snake_start_x+i;
}
//Обрисовка поля
draw_line(1,2);
for(y=0;y<maxy;y++)
{
gotoxy(1,y+3);
textcolor(LIGHTBLUE); cprintf("|");
textcolor(BROWN);
for(x=0;x<maxx;x++)
cprintf("%c",food_field[y][x]);
textcolor(LIGHTBLUE);
cprintf("|");
}
draw_line(1,maxy+3);
show_score();
gotoxy(2,maxy+6);
textcolor(LIGHTRED);
cprintf("Left: %c,Right: %c, Up: %c, Down: %c, Exit: x. Any key to start.",
left_key,right_key,up_key,down_key);
textcolor(GREEN);
gotoxy(32,1);
cprintf("~~~SNAKE GAME~~~");
return;
}
void draw_line(int x, int y) //Функция создания линии из =
{
gotoxy(x,y); textcolor(LIGHTBLUE);
for (x=0;x<maxx+2;x++) cprintf("=");
return;
}
void show_score() //Функция вывода очков на экран
{
textcolor(LIGHTCYAN);
gotoxy(2,maxy+4);
cprintf("Level: %05d",level);
gotoxy(40,maxy+4);
textcolor(LIGHTGREEN);
cprintf("Score: %05d",score);
gotoxy(60,maxy+4);
textcolor(LIGHTMAGENTA);
cprintf("High Score: %05d",high_score);
return;
}
void move() //Функция передвижения
{
switch(direction)
{
case(right_key): snake[sl].y=snake[sl-1].y;
snake[sl].x=snake[sl-1].x+1;
break;
case(left_key) : snake[sl].y=snake[sl-1].y;
snake[sl].x=snake[sl-1].x-1;
break;
case(up_key) : snake[sl].y=snake[sl-1].y-1;
snake[sl].x=snake[sl-1].x;
break;
case(down_key) : snake[sl].y=snake[sl-1].y+1;
snake[sl].x=snake[sl-1].x;
break;
}
return ;
}