class Game{//最为关键的游戏类
public:
void MainBody();
void GameInitialize();
void MapObstacle(Obstacle Ob[],int x);
void GraphicEnd();
void Keywaiting();
bool Continue();
void PressAnyKey();
};
void Game::GameInitialize(){
ScreenLayOut P;
SuperCol Brush;
int midx,midy,i;
P.GraphicStart();
P.ErrorDetect();
midx=getmaxx()/2;midy=getmaxy()/2;
Brush.bar2(midx-20*fudu,midy-15*fudu,midx+20*fudu,midy+15*fudu,LIGHTBLUE);
Brush.bar2(midx-19*fudu,midy-14*fudu,midx+19*fudu,midy+14*fudu,BLACK);
Brush.printword(midx-16*fudu, midy-19*fudu+5, "Snake",1,0,0,LIGHTGREEN);
Brush.printword(midx-2*fudu,midy-17*fudu+10,"Made by:EmilMatthew 05/1/16 ",0,0,1,BROWN);
}
void Game::MapObstacle(Obstacle Ob[],int x){
SuperCol Brush;
int i=0;
int midx=getmaxx()/2,midy=getmaxy()/2;
for(i=0;i<x;i++){
if(Ob[i].flag){
Brush.bar2(midx-19*fudu+Ob[i].x*fudu,midy-14*fudu+Ob[i].y*fudu,
midx-18*fudu+Ob[i].x*fudu,midy-13*fudu+Ob[i].y*fudu,LIGHTBLUE);
}
}
}
void Game::Keywaiting(){
gotoxy(5,10);
printf ("Pause");
while(bioskey(1)==0){;}
gotoxy(5,10);
printf(" ");
}
void Game::PressAnyKey(){
gotoxy(5,10);
printf("Press any key to continue...\n");
}
bool Game::Continue(){
// clrscr();
char tmp;
gotoxy(5,10);
printf(" ");
gotoxy(8,11);
printf("Oh ,you failure\n");
gotoxy(8,12);
printf("Try Again?(y/n)\n");
gotoxy(8,13);
scanf("%c",&tmp);
if(tmp=='y')return true;
else return false;
}
void Game::MainBody(){
//Declare Object or Variables
ScreenLayOut Test;
Drawhead sDh;
Drawbody sDb;
Cleantail sCt;
DrawBean dou;
Obstacle stock[5];
Bean douzi;
int key=0,index=0;
bool Gotbean=false,check;
bool KeyPressed=false;//如果按键过快,将出现不改变
Direction tmdir=Right;
//Set Start Data;
Snake w(1,0,Right,NULL);
Snake b2(2,0,Right,&w);
Snake b1(3,0,Right,&b2);
Snake h(4,0,Right,&b1);
Snake tb1[300];//(0,0,Right,NULL);
Snake tb2(0,0,Right,NULL);
randomize();
stock[0].flag=true;
stock[0].x=random(22)+5;
stock[0].y=random(26)+1;
douzi.flag=true;
Score=0;
MapObstacle(stock,1);
//Draw First Snake.
sDh.Draw(h.getx(),h.gety());
sDb.Draw(b1.getx(),b1.gety());
sDb.Draw(b2.getx(),b2.gety());
//Generate Bean.
h.MakeNewBean(stock,5,douzi);//this interface is not a good one,as I thought
dou.Draw(douzi.x,douzi.y);
while(GameStatur==Gaming){
while(bioskey(1)==0&&GameStatur==Gaming){
if(Gotbean){
//1Insert
h.Insert(&tb1[index]);
sDb.Draw(tb1[index].getx(),tb1[index].gety());
index++;
sDh.Draw(h.getx(),h.gety());
Gotbean=false;
//Not so perfect.
//Add random make bean code etc.
// w.SetTail();
h.MakeNewBean(stock,1,douzi);
dou.Draw(douzi.x,douzi.y);
}
else{
//2bian li
//At first ,you use this:*tb=&h,of course it just stands for h,
//can't work as your thought.
tb2=h;//If you use tb1=h,there will be an error ,because of the shallow copy
h.Bianlidir();
h.setdir(tmdir);
sDh.Draw(h.getx(),h.gety());
sDb.Draw(tb2.getx(),tb2.gety());
sCt.Draw(w.getx(),w.gety());
}
Delay2(0.15,SecPerFrame);
//Collision Check
//Eat self
if(h.EatSelf())
{ cout<<"Eat self"<<endl;
PressAnyKey();
GameStatur=Failure;
break;
}
//Collision with wall
if(h.HitWall())
{ cout<<"Hit Wall"<<endl;
PressAnyKey();
GameStatur=Failure;
break; //Attention here
}
//Collision with obstacle
if(h.HitBrack(stock,1))
{ cout<<"HitBrack"<<endl;
PressAnyKey();
GameStatur=Failure;
break;
}
if(h.GotBean(douzi)){
Gotbean=true;
}
KeyPressed=false;
}
//Check key
key=bioskey(0);
if(!KeyPressed)
{switch(key){
case KeyUp: if(tmdir!=Down){
tmdir=Up;
}
break;
case KeyDown:if(tmdir!=Up){
tmdir=Down; }
break;
case KeyLeft:if(tmdir!=Right){
tmdir=Left;}
break;
case KeyRight:if(tmdir!=Left){
tmdir=Right;}
break;
case KeyEnter:
//small KeyWaiting
Keywaiting();
break;
case KeyEsc:
GameStatur=Exit;
break;
default:
break;
}
KeyPressed=true;
}
}
if(GameStatur==Failure)
{
check=Continue();
if(check)GameStatur=Gaming;
else GameStatur=Exit;
}
}
void Game::GraphicEnd(){
ScreenLayOut P;
P.GraphicEnd();
}
void main(void){
//ScreenLayOut Gg;
Game Director;
while(GameStatur==Gaming){
Director.GameInitialize();
if(GameStatur!=Exit)Director.MainBody();
Director.GraphicEnd();
}
getch();
}
void Delay2(double Times,float SecPerFrame){
bool Running=true;
double Tmptime=(double)clock()/(double)CLOCKS_PER_SEC;
double caculate=0,delaying=SecPerFrame;
while(Running&&caculate<Times){
if((Tmptime+delaying)<((double)clock()/(double)CLOCKS_PER_SEC))
{Tmptime=(double)clock()/(double)CLOCKS_PER_SEC;
caculate+=delaying;
}
}
}