1. 程式人生 > >c++課程設計之貪食蛇

c++課程設計之貪食蛇

這個程式是windows環境下完成的,為了更好的做出動畫效果,定義了gotoxy函式,主要用了三個 類Game_Map,Snake,和Snake_Game類,在第一次遊戲時需要在選單中初始化玩家資料,用了vector來儲存蛇身。

//Windows環境下c++貪食蛇 

#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <ctime>

using namespace std;

void gotoxy(int x,int y){          //定義Windows座標函式 
 COORD pos = {x,y};	
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);	
 SetConsoleCursorPosition(hOut,pos);
}

enum {                             //列舉型別用來表示按鍵 
 Up = 72,Down = 80,Left = 75,Right = 77,Enter = 13,Esc = 27	
};

class Snake_Body{                   //蛇的身體節點資料型別  
  public:
   int x;	
   int y;
   char body;	
};

class Player_Data{                  //玩家資訊資料型別 
  public:	
   char grade[10];
   char name[10];  
   int score;	
};

int Snake_Speed = 100;             //全域性變數蛇的速度 
char Snake_HeadShape = '#';        //蛇頭圖形 
char Snake_BodyShape = '*';        //蛇身圖形 
char Snake_PointShape[3] = "*#";   //選單指標圖形 

class Game_Map{                  //遊戲地圖類
  public:
   Game_Map();	
   void Creat_Map();
   void Show_Logo(int );
   void Creat_Food();
   void Creat_Food(Snake_Body *,int );
   int Stop_Menu();
   friend class Snake;
  private:
   int i,Map_Long,Map_Wide;
   char Map_Node; 
   Snake_Body Food;	
};

Game_Map::Game_Map(){              //初始化地圖和食物
  Map_Long = 60;
  Map_Wide = 24;
  Map_Node = ' ';
  Food.body = '$';
  srand(time(NULL));               //初始化隨機數種子 
  Creat_Map();
  Creat_Food();		
}

void Game_Map::Creat_Map(){        //畫出地圖
  int x = 2,y = 0,n = 0;	
  while(n<162)
  {	 
   gotoxy(x,y);
   cout<< Map_Node;  
   if(x<Map_Long&&y==0)
   {
    x++;
    Map_Node = '-';
   }
   if(x==Map_Long&&y<Map_Wide)
   {
   	y++;
   	Map_Node = '|';
   } 
   if(y==Map_Wide&&x>1)
   {
   	x--;
    Map_Node = '-';
   } 
   if(x==1&&y>0)
   {
   	 y--;
   	 Map_Node = '|';
   } 
   Sleep(10);
   n++;	
  }
  for(i = 1;i!=19;i++)
  {
    gotoxy(Map_Long+i,5);
	cout<< "_";	
  }
  gotoxy(65,2);	
  cout<< "SCORE";                  //初始化分數顯示欄 
  gotoxy(66,4);
  cout<< '0';
}

void Game_Map::Show_Logo(int n){   //遊戲中動畫(笑臉)
  int x = Map_Long+3,y = 10;
  if(n==1)
  {	
   gotoxy(x,y);	
   cout<< " *********** ";
   gotoxy(x,y+1);	
   cout<< "*           *";
   gotoxy(x,y+2);
   cout<< "*  !     !  *";
   gotoxy(x,y+3);
   cout<< "*           *";
   gotoxy(x,y+4);
   cout<< "*   !!!!!   *";
   gotoxy(x,y+5);
   cout<< " *********** ";
   gotoxy(x,y+7);
   cout<< " Very Careful! "; 
  }
  else if(n==2)
  {
   gotoxy(x,y);	
   cout<< " *********** ";
   gotoxy(x,y+1);	
   cout<< "*           *";
   gotoxy(x,y+2);
   cout<< "*  ?     ?  *";
   gotoxy(x,y+3);
   cout<< "*           *";
   gotoxy(x,y+4);
   cout<< "*   ?????   *";
   gotoxy(x,y+5);
   cout<< " *********** ";	
   gotoxy(x,y+7);
   cout<< " Be Careful! ";
  }
}

void Game_Map::Creat_Food(){       //初始化食物
   Flag: 
	Food.x = rand()%57+2;
    Food.y = rand()%22+1;
    if(Food.x==7&&Food.y==3)
     goto Flag;
    if(Food.x==8&&Food.y==3)
     goto Flag;
    if(Food.x==9&&Food.y==3)
     goto Flag;
	gotoxy(Food.x,Food.y);
    cout<< Food.body;
}
                                   //隨機產生食物且不與蛇身衝突 
void Game_Map::Creat_Food(Snake_Body *s,int length){
  flag:
    Food.x = rand()%57+2;
    Food.y = rand()%22+1;
	for(i = 0;i!=length-1;i++)
  {
	if(Food.x==s[i].x&&Food.y==s[i].y)
	goto flag; 	
  } 
   gotoxy(Food.x,Food.y);
   cout<< Food.body;			
}

int Game_Map::Stop_Menu(){           //暫停選單 
   int x = Map_Long+6,y = 20; 
   gotoxy(Map_Long+1,y-2);
   cout<< "__________________"; 	
   gotoxy(x,y);
   cout<< "! Continue";
   gotoxy(x,y+1);
   cout<< "! Exit Game"; 
   gotoxy(x-3,y);
   cout<< Snake_PointShape;
   while(true)
  {
   Flag:switch(getch())
   {
    case Up:
      if(y>20)
      {
	    y--;	
        gotoxy(x-3,y+1);
	    cout<< "  ";
	    gotoxy(x-3,y);
	    cout<< Snake_PointShape;	
      }   
      else goto Flag;
      break;
	case Down:
	  if(y<21)
      {
       y++;	
	   gotoxy(x-3,y-1);
	   cout<< "  ";
	   gotoxy(x-3,y);
	   cout<< Snake_PointShape;
      }
      else goto Flag;
      break;
	case Enter:
	  gotoxy(Map_Long+1,y-2);
      cout<< "                   ";	
	  gotoxy(x-3,y);
      cout<< "              ";
      gotoxy(x-3,y+1);
      cout<< "              ";		
	  switch(y)
	  {
	   case 20:
	   	 return 1;
	   case 21:
		 return 0; 	
	  } break;
    }
  }
}

class Snake{                       //貪食蛇類
  public:	
    Snake();
    void Console();	
    void Move_Up();
    void Move_Down();
    void Move_Left(); 
    void Move_Right();
    void Add_Body();
    void Snake_Dead();
    int Show_Score();
    friend class Game_Map;
    friend class Snake_Game;
  private:	  
    int Head_X,Head_Y,Length;
	int i,Move_Flag,Dead_Flag; 
	vector<Snake_Body> snake;      //用動態陣列儲存蛇身  
	Snake_Body aBody;
    Game_Map map; 	
};

Snake::Snake(){                    //初始化蛇
  int i;	
   Head_X = 6;	
   Head_Y = 3;
   Length = 3;
   Dead_Flag = 1;
   aBody.body = ' '; 
   snake.resize(Length);           //初始化動態陣列(蛇身)長度 
   snake[0].body = Snake_HeadShape;
   for(i = 1;i<Length-1;i++)
   {	
    snake[i].body = Snake_BodyShape;		
   }
   snake[Length-1].body = ' ';
   snake[0].x = Head_X;                    
   snake[0].y = Head_Y;    
   while(snake[0].x<Head_X+4)
   {
   	for(i = Length-1;i!=0;i--)
    {
     snake[i].x = snake[i-1].x;
     snake[i].y = snake[i-1].y;
    }
    snake[0].x++;
    for(i = 0;i<Length;i++)
    {
	  gotoxy(snake[i].x,snake[i].y);
      cout<< snake[i].body;
    }
   }
}

void Snake::Console(){             //蛇身控制主函式 
   while(true)
   {
    Flag:
	switch(getch())
	{
     case Up:if(Move_Flag!=2)Move_Up();
	            else Move_Down();
				if(Dead_Flag==0)
				return;
				goto Flag;break;	
     case Down:if(Move_Flag!=1)Move_Down();
	            else Move_Up();
				if(Dead_Flag==0)
				return;
				goto Flag;break;	
     case Left:if(Move_Flag!=4)Move_Left();
                else Move_Right();
				if(Dead_Flag==0)
				return;
				goto Flag;break;
	 case Right:if(Move_Flag!=3)Move_Right();
	            else Move_Left();
				if(Dead_Flag==0)
				return;
				goto Flag;break;
	 case Esc:Dead_Flag = map.Stop_Menu();
	    if(Dead_Flag==0)
			return;
		else goto Flag;
		    break; 
	 default: switch(Move_Flag)
	 {
	  case 1:Move_Up();break;
	  case 2:Move_Down();break;
	  case 3:Move_Left();break;
	  case 4:Move_Right();break; 
	  default:goto Flag;	
	 }								
    } 
   }	
}
   
void Snake::Move_Up(){             //蛇身向上移動
   Move_Flag = 1; 
   while(true)
   {
	if(kbhit()!=0)
   	{
      return ;
	}
    if(snake[0].x==map.Food.x&&snake[0].y==map.Food.y)
	{	                           //判斷是否吃到食物 
	  Add_Body();                 
	  Show_Score();                //實時顯示分數 
	  Snake_Body s[Length];     
	  for(i = 0;i!=Length;i++)
	  {
	  	s[i] = snake[i];
	  }
	  map.Creat_Food(s,Length);	
	}
	Snake_Dead();                  //死亡判斷 
	if(Dead_Flag==0)
	 return;
    for(int i = Length-1;i>0;i--)
    {
  	 snake[i].x = snake[i-1].x;
     snake[i].y = snake[i-1].y;
    }
     snake[0].y--;
     Sleep(Snake_Speed);
    for(int i = 0;i<Length;i++)
    {
     gotoxy(snake[i].x,snake[i].y);
     cout<< snake[i].body;
    }
	if(snake[0].x==2||map.Map_Long-snake[0].x==1)
  	map.Show_Logo(1);
  	else
  	map.Show_Logo(2);    
   }		
}

void Snake::Move_Down(){          //蛇身向下移動
  Move_Flag = 2;
  while(true)
   {
	if(kbhit()!=0)
   	{
      return;
	}
	if(snake[0].x==map.Food.x&&snake[0].y==map.Food.y)
	{	                         
	  Add_Body();
	  Show_Score();
	  Snake_Body s[Length];
	  for(i = 0;i!=Length;i++)
	  {
	  	s[i] = snake[i];
	  }
	  map.Creat_Food(s,Length);	
	}
	Snake_Dead();
	if(Dead_Flag==0)
	 return;
    for(int i = Length-1;i>0;i--)
    {
  	 snake[i].x = snake[i-1].x;
     snake[i].y = snake[i-1].y;
    }
     snake[0].y++;
     Sleep(Snake_Speed);
    for(int i = 0;i<Length;i++)
    {
     gotoxy(snake[i].x,snake[i].y);
     cout<< snake[i].body;
    }   
	if(snake[0].x==2||map.Map_Long-snake[0].x==1)
  	map.Show_Logo(1);
  	else
  	map.Show_Logo(2); 
   }
}

void Snake::Move_Left(){           //蛇身向左移動
  Move_Flag = 3;
  while(true)
   {
	if(kbhit()!=0)
   	{
      return;
	}
	if(snake[0].x==map.Food.x&&snake[0].y==map.Food.y)
	{	
	  Add_Body();
	  Show_Score();
	  Snake_Body s[Length];
	  for(i = 0;i!=Length;i++)
	  {
	  	s[i] = snake[i];
	  }
	  map.Creat_Food(s,Length);	
	}
    Snake_Dead();
    if(Dead_Flag==0)
	 return;
    for(int i = Length-1;i>0;i--)
    {
  	 snake[i].x = snake[i-1].x;
     snake[i].y = snake[i-1].y;
    }
     snake[0].x--;
     Sleep(Snake_Speed);
    for(int i = 0;i<Length;i++)
    {
     gotoxy(snake[i].x,snake[i].y);
     cout<< snake[i].body;
    }
	if(snake[0].y==1||map.Map_Wide-snake[0].y==1)    
	map.Show_Logo(1);
	else
	map.Show_Logo(2);
   }
}

void Snake::Move_Right(){          //蛇身向右移動    
  Move_Flag = 4;
  while(true)
   {
	if(kbhit()!=0)
   	{
      return ;
	}
	if(snake[0].x==map.Food.x&&snake[0].y==map.Food.y)
	{	
	  Add_Body();
	  Show_Score();
	  Snake_Body s[Length];
	  for(i = 0;i!=Length;i++)
	  {
	  	s[i] = snake[i];
	  }
	  map.Creat_Food(s,Length);	
	}
	Snake_Dead();
	if(Dead_Flag==0)
	 return;
    for(int i = Length-1;i>0;i--)
    {
  	 snake[i].x = snake[i-1].x;
     snake[i].y = snake[i-1].y;
    }
     snake[0].x++;
     Sleep(Snake_Speed);
    for(int i = 0;i<Length;i++)
    {
     gotoxy(snake[i].x,snake[i].y);
     cout<< snake[i].body;
    }  
	if(snake[0].y==1||map.Map_Wide-snake[0].y==1)    
	map.Show_Logo(1);
	else
	map.Show_Logo(2);  
   } 
}	

void Snake::Add_Body(){            //增加蛇身
  snake[Length-1].body = Snake_BodyShape; 
  Length++;
  snake.push_back(aBody);		
}

void Snake::Snake_Dead(){
  int i = 1;
  if(snake[0].x==map.Map_Long||snake[0].y==map.Map_Wide||snake[0].x==1||snake[0].y==0)
  {
    Dead_Flag = 0;	
  }
  while(snake[i].body!=' ')
  {
    if(snake[i].x==snake[0].x&&snake[i].y==snake[0].y)	
    Dead_Flag = 0;
  	i++; 
  }		
}

int Snake::Show_Score(){           //顯示分數
  gotoxy(65,2);	 
  cout<< "SCORE";
  gotoxy(66,4);
  cout<< Length-3;
  return Length-3;	
}

class Snake_Game{                  //貪食蛇遊戲類 
  public:
   Snake_Game();
   void Start_Game();
   void Start_Snake();
   void Game_Menu();
   void Game_Setting();
   void Color_Select();
   void Grade_Select();
   void Snake_Select();
   void SnakeGame_Logo(int );
   void GameOver_Logo();
   void Show_Top();
   void Read_Data();
   void Init_Data();
   void Handle_Data(int &);
   void Game_How(); 
  private:
   int i,Player_Score,Menu_X,Menu_Y; 
   Player_Data *p,player[4];
   fstream DataFile;
};

Snake_Game::Snake_Game(){          //初始化遊?
  p = NULL;
  Menu_X = 0;
  Menu_Y = 0;
  Read_Data();
  SnakeGame_Logo(15);
}
 
void Snake_Game::Start_Game(){     //建立蛇物件開始遊戲                
	Snake _snake;
    _snake.Console();
    system("cls");
    GameOver_Logo();                  
    Player_Score = _snake.Show_Score();
    Handle_Data(Player_Score);
}
	
void Snake_Game::Start_Snake(){
   system("cls");
   Start_Game();	
}

void Snake_Game::SnakeGame_Logo(int speed){         //開始動畫與主選單                     
  i = 0,Menu_X = 1,Menu_Y = 0;
 while(i<197)
 {	 
   if(Menu_X<77&&Menu_Y==0)
   { 
     Menu_X++;
	 gotoxy(Menu_X,Menu_Y);
     cout<< '~';	 
   }
   if(Menu_X==77&&Menu_Y<24)
   {
    	
   	gotoxy(Menu_X,Menu_Y);
    cout<< '|';	Menu_Y++;
  } 
   if(Menu_Y==24&&Menu_X>1)
   { 	
   	gotoxy(Menu_X,Menu_Y);
    cout<< '~';
	Menu_X--;	
   } 
   if(Menu_X==1&&Menu_Y>0)
   { 
     Menu_Y--;
   	 gotoxy(Menu_X,Menu_Y);
     cout<< '|'; 
   } 
   Sleep(speed);
   	i++;
 }
   Menu_X = 60,Menu_Y = 2; 
   while(Menu_X>4)
  {
   gotoxy(Menu_X,Menu_Y);
   cout<< "*********** \n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< "*********** \n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< "** \n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< "** \n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< "*********** \n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< "*********** \n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< "         ** \n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< "         ** \n";
   gotoxy(Menu_X,Menu_Y+8);
   cout<< "*********** \n";
   gotoxy(Menu_X,Menu_Y+9);
   cout<< "*********** \n";
   Sleep(speed);
   Menu_X--;	
  }
  Menu_X = 18,Menu_Y = 2;
  while(Menu_X<61)
  {
   gotoxy(Menu_X,Menu_Y);
   cout<< " ***********\n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< " ***********\n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< " **\n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< " **\n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< " ***********\n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< " ***********\n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< " **\n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< " **\n";
   gotoxy(Menu_X,Menu_Y+8);
   cout<< " ***********\n";
   gotoxy(Menu_X,Menu_Y+9);
   cout<< " ***********\n";
   Sleep(speed);
   Menu_X++;	
  } 
  Menu_X = 48,Menu_Y = 2; 
   while(Menu_X>18)
  {
   gotoxy(Menu_X,Menu_Y);
   cout<< "**       ** \n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< "***      ** \n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< "****     ** \n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< "** **    ** \n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< "**  **   ** \n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< "**   **  ** \n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< "**    ** ** \n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< "**     **** \n";
   gotoxy(Menu_X,Menu_Y+8);
   cout<< "**      *** \n";
   gotoxy(Menu_X,Menu_Y+9);
   cout<< "**       ** \n";
   Sleep(speed);
   Menu_X--;	
  }
  Menu_X = 32 ,Menu_Y = 2; 
   while(Menu_X<47)
  {
   gotoxy(Menu_X,Menu_Y);
   cout<< " ** \n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< " **      **\n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< " **    **\n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< " **  **\n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< " ****\n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< " ***\n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< " ** **\n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< " **   **\n";
   gotoxy(Menu_X,Menu_Y+8);
   cout<< " **     **\n";
   gotoxy(Menu_X,Menu_Y+9);
   cout<< " **       **\n";
   Sleep(speed);
   Menu_X++;	
  }   
  Menu_X = 33,Menu_Y = 13;    
  while(Menu_Y>1)
  {
   gotoxy(Menu_X,Menu_Y);
   cout<< "     * \n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< "    *** \n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< "   ** ** \n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< "  **   ** \n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< "  **   ** \n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< " ********* \n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< " **     ** \n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< "**       ** \n";
   gotoxy(Menu_X,Menu_Y+8);
   cout<< "**       ** \n";
   gotoxy(Menu_X,Menu_Y+9);
   cout<< "**       ** \n";
   gotoxy(Menu_X,Menu_Y+10);
   cout<< "            \n";
   Sleep(speed*2);
   Menu_Y--;	
  }	
 Menu_X = 3,Menu_Y = 12; 
 while(Menu_X<77)
 {
  gotoxy(Menu_X,Menu_Y);
  cout<< "_";	
  Menu_X++;	
 }
  
 Menu_X = 45,Menu_Y = 14; 
 while(Menu_X>4) 
 {
  gotoxy(Menu_X,Menu_Y);
   cout<< " * ** * \n";  
   gotoxy(Menu_X,Menu_Y+1);
   cout<< "* .  . * \n";	 
   gotoxy(Menu_X,Menu_Y+2);
   cout<< "*      * \n";	 
   gotoxy(Menu_X,Menu_Y+3);
   cout<< "*  -   * \n";	 
   gotoxy(Menu_X,Menu_Y+4);
   cout<< " *    *      * * \n";
   gotoxy(Menu_X,Menu_Y+5);
   cout<< "   *  *    * * * *         * \n";
   gotoxy(Menu_X,Menu_Y+6);
   cout<< "    *  * * *    * * *  * ** \n";
   gotoxy(Menu_X,Menu_Y+7);
   cout<< "     * * *       * * * * * \n";
   Sleep(speed*2+10);	
  Menu_X--;	
 } 	
   Menu_X = 41,Menu_Y = 15; 
   Sleep(200);
   gotoxy(Menu_X+4,Menu_Y);
   cout<< "! Start Game";
   Sleep(200);
   gotoxy(Menu_X+7,Menu_Y+2);
   cout<< "! Smake Menu";
   Sleep(200);
   gotoxy(Menu_X+10,Menu_Y+4);
   cout<< "! Exit Game";
   Sleep(200);
   gotoxy(Menu_X+13,Menu_Y+6);
   cout<< "! About Game";
   gotoxy(Menu_X,Menu_Y);
   cout<< Snake_PointShape;
  while(true)
  { 
   switch(getch())
   {
   	case Up: 
	   if(Menu_Y>15)
      {
	   Menu_X = Menu_X-3;
	   Menu_Y = Menu_Y-2;
	   gotoxy(Menu_X+3,Menu_Y+2);
	   cout<< "  ";
	   gotoxy(Menu_X,Menu_Y);
       cout<< Snake_PointShape;
      }
	   break;
   	case Down:
	   if(Menu_Y<21)
      { 
        Menu_X = Menu_X+3; 
	    Menu_Y = Menu_Y+2;
	    gotoxy(Menu_X-3,Menu_Y-2);
	    cout<< "  ";
	    gotoxy(Menu_X,Menu_Y);
        cout<< Snake_PointShape;
      }
	   break;
   	case Enter:
   	   switch(Menu_Y)
	  {
	   case 15:system("cls");
	           Start_Game();break;	  	
	   case 17:system("cls");
	           Game_Setting();break;  
	   case 19:exit(0);
	   case 21:Game_How();break;
	  } 		
      break;
   }
  }
}

void Snake_Game::GameOver_Logo(){       //結束動?
 int n = 0;
  Menu_X = 1,Menu_Y = 0;
  while(n<197)
 {	 
   if(Menu_X<77&&Menu_Y==0)
   { 
     Menu_X++;
	 gotoxy(Menu_X,Menu_Y);
     cout<< '~';	 
   }
   if(Menu_X==77&&Menu_Y<24)
   {
    	
   	gotoxy(Menu_X,Menu_Y);
    cout<< '|';	Menu_Y++;
  } 
   if(Menu_Y==24&&Menu_X>1)
   { 	
   	gotoxy(Menu_X,Menu_Y);
    cout<< '~';
	Menu_X--;	
   } 
   if(Menu_X==1&&Menu_Y>0)
   { 
     Menu_Y--;
   	 gotoxy(Menu_X,Menu_Y);
     cout<< '|'; 
   }  
   	n++;
 }	
 Menu_X = 25,Menu_Y = 2;
 gotoxy(Menu_X,Menu_Y); 
 cout<< "*****    *     *   *   *****";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+1); 
 cout<< "*       * *    ** **   *    ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+2); 
 cout<< "*  **   ***    * * *   *****";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+3); 
 cout<< "*   *  *   *   *   *   *    ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+4); 
 cout<< "*****  *   *   *   *   *****";
 
 Menu_X = 35,Menu_Y = 2;
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+6); 
 cout<< " ***    *   *  *****   **** ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+7); 
 cout<< "*   *   *   *  *       *   *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+8); 
 cout<< "*   *   *   *  *****   **** ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+9); 
 cout<< "*   *    * *   *       *  * ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+10); 
 cout<< " ***      *    *****   *   *";
 
 Menu_X = 6,Menu_Y = 12;
 Sleep(100);
 gotoxy(Menu_X,Menu_Y); 
 cout<< "  * ** * ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+1); 
 cout<< " * > <  *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+2); 
 cout<< " *      *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+3); 
 cout<< " *  ^   *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+4); 
 cout<< "  *    *      * *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+5); 
 cout<< "    *  *    * * * *         *";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+6); 
 cout<< "     *  * * *    * * *  * ** ";
 Sleep(100);
 gotoxy(Menu_X,Menu_Y+7); 
 cout<< "      * * *       * * * * *  ";	
}

void Snake_Game::Game_Setting(){        //遊戲二級菜?
  Menu_X = 4;
  Menu_Y = 4;
  gotoxy(8,4);	
  cout<< "! Color Select";	
  gotoxy(8,6);
  cout<< "! Grade Select";
  gotoxy(8,8);
  cout<< "! Snake Select";
  gotoxy(8,10);
  cout<< "! Check Top";
  gotoxy(4,4);
  cout<< Snake_PointShape;
  gotoxy(3,22);
  cout<< "Press [Up] or [Down] To Select,Then Press [Enter],Press [Esc] To Return";
  for(i = 0;i<20;i++)
  {
   gotoxy(30,i);
   cout<< "|";	
 }
 gotoxy(0,20);
 for(i = 0;i<80;i++)
 {
  cout<< "_";	
 }
 while(true)
 {
  Flag:switch(getch())
  {	
   case Up:
    if(Menu_Y>4)
    {
	 Menu_Y = Menu_Y-2;
	 gotoxy(Menu_X,Menu_Y+2);
	 cout<< "  ";
	 gotoxy(Menu_X,Menu_Y);
     cout<< Snake_PointShape;
    }
	else 
	goto Flag;
	break;
   case Down: 
    if(Menu_Y<10)
    {
	 Menu_Y = Menu_Y+2;
	 gotoxy(Menu_X,Menu_Y-2);
	 cout<< "  ";
	 gotoxy(Menu_X,Menu_Y);
     cout<< Snake_PointShape;
    }
	else 
	goto Flag;
	break;
   case Esc:
   	 system("cls");
     SnakeGame_Logo(0);break; 		
   case Enter:
   	switch(Menu_Y)
   {
    case 4:
     gotoxy(Menu_X,Menu_Y);	
     cout<< "  ";	
	 Color_Select();break;
	case 6: 
	 gotoxy(Menu_X,Menu_Y);	
     cout<< "  ";
	 Grade_Select();break;
	case 8: 
	 gotoxy(Menu_X,Menu_Y);	
     cout<< "  ";
	 Snake_Select();break;
	case 10: 
	 gotoxy(Menu_X,Menu_Y);	
     cout<< "  ";
     Show_Top();break;
   }  
  }	
 }	
}

void Snake_Game::Color_Select(){        //色彩選擇菜?
   Menu_X = 45;
   Menu_Y = 4;
   gotoxy(Menu_X,Menu_Y);
   cout<< "! Blue";
   gotoxy(Menu_X,6);
   cout<< "! Red  ";
   gotoxy(Menu_X,8);
   cout<< "! Green ";
   gotoxy(Menu_X,10);
   cout<< "! Purple";
   gotoxy(Menu_X,12);
   cout<< "! Yellow";
   gotoxy(Menu_X,14);
   cout<< "! white";
   gotoxy(Menu_X-4,Menu_Y);
   cout<< Snake_PointShape;
  while(true)
 {
  Flag:switch(getch())
  {
   case Esc:
   	gotoxy(Menu_X-4,Menu_Y);
   	cout<< "  ";
    Game_Setting();	 
   case Up:
    if(Menu_Y>4)
    {
	 Menu_Y = Menu_Y-2;
	 gotoxy(Menu_X-4,Menu_Y+2);
	 cout<< "  ";
	 gotoxy(Menu_X-4,Menu_Y);
     cout<< Snake_PointShape;
    }
	else 
	goto Flag;
	break;
   case Down: 
    if(Menu_Y<14)
    {
	 Menu_Y = Menu_Y+2;
	 gotoxy(Menu_X-4,Menu_Y-2);
	 cout<< "  ";
	 gotoxy(Menu_X-4,Menu_Y);
     cout<< Snake_PointShape;
    }
	else 
	goto Flag;
	break;	
   case Enter:
   	switch(Menu_Y)
   {
    case 4:     		
	 system("color 1");break;
	case 6: 
     system("color 4");break;
	case 8: 
     system("color 2");break;
    case 10:
     system("color 5");break;	
    case 12:
	 system("color 6");break;
	case 14:
	 system("color 7");break;	
   }  
  }	
 }	
}

void Snake_Game::Grade_Select(){        //遊戲等級選擇菜?
   Menu_X = 45;
   Menu_Y = 4;
   gotoxy(Menu_X,Menu_Y);
   cout<< "! Practice";
   gotoxy(Menu_X,6);
   cout<< "! Easy   ";
   gotoxy(Menu_X,8);
   cout<< "! Normal ";
   gotoxy(Menu_X,10);
   cout<< "! Hard   ";
   gotoxy(Menu_X,12);
   cout<< "! Max    ";
   gotoxy(Menu_X,14);
   cout<< "        ";
   gotoxy(Menu_X-4,Menu_Y);
   cout<< Snake_PointShape;
   while(true)
  {
   Flag:switch(getch())
   {
    case Esc:
     gotoxy(Menu_X-4,Menu_Y);
     cout<< "  ";
     Game_Setting();	
    case Up:
     if(Menu_Y>4)
     {
	  Menu_Y = Menu_Y-2;
	  gotoxy(Menu_X-4,Menu_Y+2);
	  cout<< "  ";
	  gotoxy(Menu_X-4,Menu_Y);
      cout<< Snake_PointShape;
     }
	 else 
	 goto Flag;
 	 break;
    case Down: 
     if(Menu_Y<12)
     {
 	  Menu_Y = Menu_Y+2; 
	  gotoxy(Menu_X-4,Menu_Y-2);
	  cout<< "  ";
	  gotoxy(Menu_X-4,Menu_Y);
      cout<< Snake_PointShape;
     }
	 else 
	 goto Flag;
	 break;	
    case Enter:
    switch(Menu_Y)
    {
     case 4:Snake_Speed = 400;
 	  gotoxy(Menu_X-4,4);
   	  cout<< "  ";  	
	  Game_Setting();	  		
	  break;
	 case 6:Snake_Speed = 200; 
	  gotoxy(Menu_X-4,6);
   	  cout<< "  ";  	
	  Game_Setting();
      break;
	 case 8:Snake_Speed = 100;
	  gotoxy(Menu_X-4,8);
   	  cout<< "  ";  	
	  Game_Setting();
      break;
     case 10:Snake_Speed = 50;
      gotoxy(Menu_X-4,10);
   	  cout<< "  ";  	
	  Game_Setting();
      break;	
     case 12:Snake_Speed = 20;
	  gotoxy(Menu_X-4,Menu_Y);
   	  cout<< "  ";  	
	  Game_Setting();	
	  break;	
    }  
   }	
 }	
}

void Snake_Game::Snake_Select(){        //蛇形狀選擇菜?
   Menu_X = 45;
   Menu_Y = 4;
   gotoxy(Menu_X,Menu_Y);
   cout<< "! **#     ";
   gotoxy(Menu_X,6);
   cout<< "! -->    ";
   gotoxy(Menu_X,8);
   cout<< "! 
[email protected]
"; gotoxy(Menu_X,10); cout<< " "; gotoxy(Menu_X,12); cout<< " "; gotoxy(Menu_X,14); cout<< " "; gotoxy(Menu_X-4,Menu_Y); cout<< Snake_PointShape; while(true) { Flag:switch(getch()) { case Esc: gotoxy(Menu_X-4,Menu_Y); cout<< " "; Game_Setting(); case Up: if(Menu_Y>4) { Menu_Y = Menu_Y-2; gotoxy(Menu_X-4,Menu_Y+2); cout<< " "; gotoxy(Menu_X-4,Menu_Y); cout<< Snake_PointShape; } else goto Flag; break; case Down: if(Menu_Y<8) { Menu_Y = Menu_Y+2; gotoxy(Menu_X-4,Menu_Y-2); cout<< " "; gotoxy(Menu_X-4,Menu_Y); cout<< Snake_PointShape; } else goto Flag; break; case Enter: switch(Menu_Y) { case 4: strcpy(Snake_PointShape,"*#"); Snake_HeadShape = '#'; Snake_BodyShape = '*'; gotoxy(Menu_X-4,4); cout<< " "; Game_Setting(); break; case 6: strcpy(Snake_PointShape,"->"); Snake_HeadShape = '>'; Snake_BodyShape = '-'; gotoxy(Menu_X-4,6); cout<< " "; Game_Setting(); break; case 8: strcpy(Snake_PointShape,"
[email protected]
"); Snake_HeadShape = '@'; Snake_BodyShape = '~'; gotoxy(Menu_X-4,8); cout<< " "; Game_Setting(); break; } } } } void Snake_Game::Read_Data(){ //讀取玩家數? DataFile.open("Data.dat",ios::in|ios::binary); if(!DataFile) { cerr << "open error"<< endl; return ; } for(i = 0;i!=4;i++) { p = new Player_Data; DataFile.read((char *)p,sizeof(Player_Data)); player[i] = *p; delete p; } DataFile.close(); strcpy(player[0].grade,"Easy"); strcpy(player[1].grade,"Normal"); strcpy(player[2].grade,"Hard"); strcpy(player[3].grade,"Max"); } void Snake_Game::Init_Data(){ //初始化玩家數? DataFile.open("Data.dat",ios::out|ios::binary); if(!DataFile) { cerr << "open error"<< endl; return; } for(i = 0;i!=4;i++) { strcpy(player[i].name,"NULL"); player[i].score = 0; } strcpy(player[0].grade,"Easy"); strcpy(player[1].grade,"Normal"); strcpy(player[2].grade,"Hard"); strcpy(player[3].grade,"Max"); for(i = 0;i!=4;i++) { p = &player[i]; DataFile.write((char *)p,sizeof(Player_Data)); } DataFile.close(); } void Snake_Game::Show_Top(){ //顯示英雄? Menu_X = 45; Menu_Y = 4; while(Menu_Y<15) { gotoxy(Menu_X,Menu_Y); cout<< " "; Menu_Y = Menu_Y+2; } Menu_X = 40; Menu_Y = 4; gotoxy(Menu_X,Menu_Y); cout<< "| GRADE |---"; gotoxy(Menu_X+12,Menu_Y); cout<< "| NAME |----"; gotoxy(Menu_X+24,Menu_Y); cout<< "| SCORE |"; gotoxy(Menu_X+1,Menu_Y+2); cout<< '['<< player[0].grade<< ']'; gotoxy(Menu_X+1,Menu_Y+4); cout<< '['<< player[1].grade<< ']'; gotoxy(Menu_X+1,Menu_Y+6); cout<< '['<< player[2].grade<< ']'; gotoxy(Menu_X+1,Menu_Y+8); cout<< '['<< player[3].grade<< ']'; gotoxy(Menu_X+13,Menu_Y+2); cout<< '['<< player[0].name<< ']'; gotoxy(Menu_X+13,Menu_Y+4); cout<< '['<< player[1].name<< ']'; gotoxy(Menu_X+13,Menu_Y+6); cout<< '['<< player[2].name<< ']'; gotoxy(Menu_X+13,Menu_Y+8); cout<< '['<< player[3].name<< ']'; gotoxy(Menu_X+25,Menu_Y+2); cout<< '['<< player[0].score<< ']'; gotoxy(Menu_X+25,Menu_Y+4); cout<< '['<< player[1].score<< ']'; gotoxy(Menu_X+25,Menu_Y+6); cout<< '['<< player[2].score<< ']'; gotoxy(Menu_X+25,Menu_Y+8); cout<< '['<< player[3].score<< ']'; gotoxy(Menu_X+2,Menu_Y+14); cout<< "Press [R] To Init Data!"; if(getch()=='r') { gotoxy(Menu_X+2,Menu_Y+15); cout<< "Are You Sure?(Y/N)"; if(getch()=='y') { Init_Data(); } else; } system("cls"); Game_Setting(); } void Snake_Game::Handle_Data(int &score){ //處理數? switch(Snake_Speed) { case 20: if(Player_Score>player[3].score) { player[3].score = score; gotoxy(50,16); cout<< "Good Job!"; gotoxy(50,17); cout<< "Please Enter Your Name :"; gotoxy(50,18); cin>> player[3].name; } else { gotoxy(40,17); cout<< "Please make persistent efforts !"; gotoxy(40,18); cout<< "Press Any Key To Return Menu"; } break; case 50: if(Player_Score>player[2].score) { player[2].score = score; gotoxy(50,16); cout<< "Good Job!"; gotoxy(50,17); cout<< "Please Enter Your Name :"; gotoxy(50,18); cin>> player[2].name; } else { gotoxy(40,17); cout<< "Please make persistent efforts !"; gotoxy(40,18); cout<< "Press Any Key To Return Menu"; } break; case 100: if(Player_Score>player[1].score) { player[1].score = score; gotoxy(50,16); cout<< "Good Job!"; gotoxy(50,17); cout<< "Please Enter Your Name :"; gotoxy(50,18); cin>> player[1].name; } else { gotoxy(40,17); cout<< "Please make persistent efforts !"; gotoxy(40,18); cout<< "Press Any Key To Return Menu"; } break; case 200: if(Player_Score>player[0].score) { player[0].score = score; gotoxy(50,16); cout<< "Good Job!"; gotoxy(50,17); cout<< "Please Enter Your Name :"; gotoxy(50,18); cin>> player[0].name; } else { gotoxy(40,17); cout<< "Please Make Persistent Efforts !"; gotoxy(40,18); cout<< "Press Any Key To Return Menu"; } break; case 400:break; } DataFile.open("Data.dat",ios::out|ios::binary); if(!DataFile) { cerr << "open error"<< endl; return ; } for(i = 0;i!=4;i++) { p = &player[i]; DataFile.write((char *)p,sizeof(Player_Data)); } DataFile.close(); getch(); system("cls"); SnakeGame_Logo(15); } void Snake_Game::Game_How(){ //遊戲說? system("cls"); i = 0,Menu_X = 20,Menu_Y = 5; while(i!=110) { gotoxy(Menu_X,Menu_Y); cout<< '*'; if(Menu_X!=60&&Menu_Y==5) { Menu_X++; } if(Menu_X==60&&Menu_Y!=20) { Menu_Y++; } if(Menu_X!=20&&Menu_Y==20) { Menu_X--; } if(Menu_X==20&&Menu_Y!=5) { Menu_Y--; } i++; } Menu_X = 25,Menu_Y = 8; gotoxy(Menu_X,Menu_Y); cout<< "The up and down or so key "; gotoxy(Menu_X,Menu_Y+2); cout<< "control the movement of the "; gotoxy(Menu_X,Menu_Y+4); cout<< "snake .If encounter itself "; gotoxy(Menu_X,Menu_Y+6); cout<< "or walls, game over ."; gotoxy(Menu_X,Menu_Y+8); cout<< "And practice mode into the list"; getch(); system("cls"); SnakeGame_Logo(0); } int main() { system("title Snake"); //設定標題 system("mode con cols=80 lines=25"); //設定顯示大小 system("color 2"); //設定初始顏色 Snake_Game snakegame; //建立遊戲類物件 getch(); return 0; }

以下是截圖

以下是進入遊戲 選單選項(顏色)


(遊戲等級)

(蛇身圖形)

(英雄榜)

遊戲中暫停

遊戲結束



相關推薦

c++課程設計

這個程式是windows環境下完成的,為了更好的做出動畫效果,定義了gotoxy函式,主要用了三個 類Game_Map,Snake,和Snake_Game類,在第一次遊戲時需要在選單中初始化玩家資料,用了vector來儲存蛇身。 //Windows環境下c++貪食蛇

C++課程設計模擬一個微型生態系統

題目: 模擬一個微型生態系統。有青草、兔子、狐狸三種生物。可以用網格表示整個環境,每個格子內用不同字母表示不同事物:空地E青草G兔子R狐狸F。系統規則如下: 1)初始狀態隨機出現GRF; 2)若格子為G,下一輪其周邊八個格子中為E的格子中會至少有一個變為G; 3)若格子為R

使用C++設計小遊戲

說明:所有程式碼均可在Visual Studio 2013上編譯執行。並未測試在其它編譯器上編譯情況。 遊戲規則         貪食蛇遊戲要求玩家控制方向鍵(或WSAD鍵)來控制小蛇的前進方向,以使蛇吃掉面板上隨即位置上的食物。每次成功吃掉食物後小蛇體長將增加一點,得分增

終於把弄出來了(C語言)

inf pos 容易 發布 com 初學 總結 info src 真不容易,小小的貪食蛇,居然這麽有難度。 從圖片可以看出,卡頓,閃爍比較嚴重,而且比較簡陋。 初學者,做成這樣,我覺得還算不錯,恩繼續學習。 額,代碼先不貼了,先總結一下,整理好之後再發布終於把貪食蛇弄出來

使用C語言編寫程式原始碼

#include <windows.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #include <string.h> #include <conio.h&g

課程設計四位加法計算器(2)(C程式碼)

#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; sbit led=P3

基於OpenGL的C(簡陋版)

終於找到一個合適的圖形庫,比之前一個DOS視窗的好多了,DOS視窗版刷屏不給力,就算是一個sleep()下去是毫秒級的精度,等屏上資訊刷出來,黃花菜都涼了。 介紹下GLUT,OpenGL Utility Toolkit,即OpenGL應用工具包,是一套可用於所有主流平

C語言課程設計學生資訊管理系統

#include"stdio.h" //標準的輸入輸出函式檔案頭部說明 #include"math.h" // 數學函式頭部說明 #include"string.h" #include"stdlib.h" //通過該函式頭部裡的

Cocos2d-x 3.0final 終結者系列教程13-遊戲案例(全)

track print return pla sprint 宋體 能夠 post world 快過節了。謝謝了屈原,我們愛你。 應該多幾個向屈大人一樣跳江的,這

關於的源代碼

fault DC 繼承 刷新方法 main () down 主函數 ext import javax.swing.*;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyList

代寫System Simulator作業、代寫OS/CS編程語言作業、C/C++課程設計作業代做、代做OS/CS作業

The fault dom cut cas shm deadline memory testing Semaphores and Operating System SimulatorOperating System SimulatorThis will be your ma

代寫COMP 3023作業、代做c++課程設計作業、代寫Software Development作業、代做C++程式設計作業

代寫COMP 3023作業、代做c++課程設計作業、代寫Software Development作業、代做C++程式設計作業School of Information Technology and Mathematical SciencesCOMP 3023 Software Development with

代寫COMP/2013作業、代做python/c++作業、代做UML DESIGN作業、代寫Python, C/C++課程設計作業

代寫COMP/2013作業、代做python/c++作業、代做UML DESIGN作業、代寫Python, C/C++課程設計作業COMP/2013 (Lab 03 - 2018)1LAB 3: UML DESIGN GROUP PROJECTAims: Practice your object orient

代做EEEN20010作業、代寫C/C++課程設計作業、代做Computer Engineering作業、代寫C/C++程式語言作業

代做EEEN20010作業、代寫C/C++課程設計作業、代做Computer Engineering作業、代寫C/C++程式語言作業EEEN20010 Computer Engineering I“Find root of a cubic function”(root)You are expected to

代寫HCI Project作業、代做C/C++課程設計作業、linux程式作業代寫代做、C/C++程式設計作業代做

  代寫HCI Project作業、代做C/C++課程設計作業、linux程式作業代寫代做、C/C++程式設計作業代做HCI Project DescriptionWe will be designing a notepad application for linux, as we found t

代寫CS4115留學生作業、代做C/C++程式設計作業、代寫matrix compression program作業、代做C/C++課程設計作業

CS4115 Week06 Lab ExerciseLab Objective: The objective of this week’s lab is to consider a matrix compression program.Matrices are used in a huge variety o

代做CSE 232作業、代寫C/C++程式設計作業、代做Steganography作業、代寫C/C++課程設計作業

CSE 232 Fall 2018Programming Project 06Assignment OverviewThis assignment is worth 50 points (5.0% of the course grade) and must be completed and turnedin

代寫ENGO 333作業、代做C++程式設計作業、代寫geometric留學生作業、代做C++課程設計作業

代寫ENGO 333作業、代做C++程式設計作業、代寫geometric留學生作業、代做C++課程設計作業Lab Assignment 8 ENGO 3331Lab Assignment #8 (Bonus)Where would we be after a couple of geometric trans

代寫CS320留學生作業、代做C/C++課程設計作業、代寫tokenizers and parsers作業、代做C/C++實驗作業

Assignment #2CS320 Assignment #2PurposeThis assignment is designed to familiarize you with C++ programming, tokenizersand parsers.RequirementsThis assignme

#include<bits/stdc++.h> #include<conio.h> using namespace std; #define ms(a) memset(a,0,sizeof a) const int maxn=1e2; int grid[maxn][maxn]; ch