Тема: Виправити помилки у програмі
Потрібно виправити управління:
-Заборонити рух у зворотний бік;
-Зробити управління стрілочками;
Якщо є які небуть ідеї, буду радий їх побачити.
#include <stdlib.h>
#include <dos.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;
} snake[100];
//Початок програми
main()
{
char h=1;
int y1,x1;
char keypress;
//Коло перезапуску гри
do
{
food=3; level=1; score=0; speed=150;
rand();
setup_level();
//Головне коло гри
do
{
delay(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 ;
}