tabyla_rasa: (Agata2012)
Все еще пишу "земейку". Ниже пртиведу код. В нем закрыла функцию, которая после окончания игры и при условии что игрок хочет начать игру заново - запускает все заново. Ибо если ее открыть то при попадании змейки в состояние смерти (встретилась с барьером или попала на саму себя) игра уже не спрашивает хочет игрок продолжить или нет - тупо запускает все с начала.

Спасите мой мозг-)))


using namespace std;

#define DIR_RIGHT 1
#define DIR_LEFT -1
#define DIR_UP 2
#define DIR_DOWN -2

char a[50][50]; //razmer polya v kotorom igra
int co_x[50], co_y[50], foodx, foody; //koordinaty zmeiki i edy
const int height = 16, width = 46; // visota i shirina
int num = 2; //num - dlina zmeiki
int direction=1;//iznachalno dvizhenie nachitaetsa napravo
int score = 0;// podschet ochkov nachinaetsa s nulua


void gotoxy (int column, int line) //peremeschaem kursor na zadannyu pozitsiu
{

COORD coord;
coord.X = column;
coord.Y = line;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

void menu ()
{
char s;
gotoxy (19, 7);
cout <<"SNAKE is the best game!\n\n";
gotoxy (17, 8);
cout<<"FOR STARTING GAME PRESS 'ENTER'\n\t";
getch();
}

void init_field ()

{

// initsializiruem igrovoe pole
for (int i = 0; i <= height; ++i)
for (int j = 0; j <= width; ++j)
a[i][j] = (i == 0 || j == 0 || i == height || j == width ? '#' : ' '); //opredelyaem granitsy

// initsializiruem strukturu zmeiki
num = 2;

co_x[0] = 1;
co_y[0] = 1;
co_x[1] = 2;
co_y[1] = 1;

a[1][1] = '$';
a[1][2] = '$';

// dlya prodolzheniya igry, esli polzovatel vibral nachat zanovo, to osnovine dannie dolzhni nachatsa s pervih harakteristik
foodx=0;
foody=0;
direction =1;
score=0;
}

void generate_food () // generiruem edy
{

foody = (rand() % 15)+1;
foodx = (rand() % 45)+1;

gotoxy(foodx, foody);
cout << "*";

}

void draw_field () //vistraivaem polya
{

int i,j;

system("cls"); //clean screen

for (i = 0; i <= height; ++i)
{
for (j = 0; j <= width; ++j)
cout << a[i][j];
cout << "\n";
}

cout << "\n";

// generatsia edy
generate_food();
}

bool isFoodField ()// eda na igrovom pole
{

if (co_x[num]==foodx && co_y[num]==foody)
{
foodx=NULL;
foody=NULL;
score++;
return true;
}

return false;
}

bool dead () //pri kakih ysloviah zmeika mertva
{

int i;

// esli vrezalas v konets polya
if (co_x[num-1] == width)
return true;
if (co_x[num-1] == 0)
return true;
if (co_y[num-1] == height)
return true;
if (co_y[num-1] == 0)
return true;

// esli popala sama na sebya
for (i = 0; i < num-3; ++i)
if (co_x[i] == co_x[num-1] && co_y[i] == co_y[num-1])
return true;

return false;
}

void move () //jsnovnie operatsii pri dvizhenii
{
char input;
int temp_dir = direction;
int speed=300;
char ending[]="GAME OVER!";

do {

if (kbhit()) input = getch(); //proveryaem nazhatie klavishi na konsole
else input = 0;//v buffer otkladivaem znachenie nazhatoi klavishi

switch (input)//globalnoe znachenie napravleniya i ignor protivopolozhnogo
{
case 'P':
if (direction==DIR_UP) // esli daem dvizhenie naverh
break;// nichego ne poluchaetsa
temp_dir=DIR_DOWN; // idti tolko vniz
break;
case 'H':
if (direction==DIR_DOWN) break;
temp_dir=DIR_UP;
break;
case 'K':
if (direction==DIR_RIGHT) break;
temp_dir= DIR_LEFT;
break;
case 'M':
if (direction==DIR_LEFT) break;
temp_dir= DIR_RIGHT;
break;
default:
break;
}

direction=temp_dir;

switch (temp_dir) // dvizhenie ot golovi po ukazannomy napravleniu
{
case DIR_RIGHT:
co_x[num] = co_x[num-1]+1;
co_y[num] = co_y[num-1];
break;
case DIR_LEFT:
co_x[num] = co_x[num-1]-1;
co_y[num] = co_y[num-1];
break;
case DIR_UP:
co_y[num] = co_y[num-1]-1;
co_x[num] = co_x[num-1];
break;
case DIR_DOWN:
co_y[num] = co_y[num-1]+1;
co_x[num] = co_x[num-1];
break;
default:
break;
}

// esli zmeika sela edy, to razmer i skorost uvelochivautsa i schet menyaetsa - poyavlaetsa novaya eda
if (isFoodField())
{
gotoxy (co_x[num], co_y[num]);
cout << "$";
++num;// razmer
speed=speed-5;//schet
generate_food();//novaya eda
}

else
{
gotoxy (co_x[0],co_y[0]);
cout << ' ';

for (int i = 0; i < num; i++)
{
co_x[i] = co_x[i+1];
co_y[i] = co_y[i+1];
}

gotoxy (co_x[num], co_y[num]);
cout << "$";
}

// esli usloviya smerti ispolnilis to konets igre
if(dead())

{
int y=1;

for (int i=0; i<11; i++)
{
gotoxy (i+10, 7);
cout << ending[i];
}
cout <<"Start new game? y-1/n-other\n\n";
// вот это вот вызывает траблы
/* if (y == 1)
{
init_field ();
draw_field();
move();
}

else
{
ExitProcess(0);
}*/
break;
}

// oboznachenie scheta i koordinat edy na ekrane
gotoxy(1,18);
cout <<"Score : "<< score <<"\n\n";

gotoxy(0,22);
cout << foodx;
gotoxy(0,23);
cout << foody;

Sleep(speed);

} while (input!=27);

}


int main()
{
menu ();
init_field ();
draw_field();
move();
return 0;
}
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.