C++콘 솔 러시아 블록 게임 실현

C++과정 을 배 워 서 작은 게임 을 만 들 자고 생각 했 는데 MFC 가 배우 고 싶 지 않 아서 콘 솔 의 작은 게임 이 될 수 밖 에 없 었 어 요.
러시아 블록 은 틀림없이 많은 사람들 이 어 렸 을 때 했 던 게임 일 것 이다.다음은 디자인 아이디어.
주로 게임 의 등급 을 선택 하여 가속 하강,서로 다른 모양 의 색상,일시 정지 와 종료 기능 을 실현 합 니 다.
우선 유형의 디자인 입 니 다.

class Box 
{ 
 private: 
  int map[23][12];//    ,       ,       
  int hotpoint[2];//      ,               
  int top;//       
  int point;//   
  int level;//   
  int ID;//       ID  
  int colorID;//     ID。 
 public: 
  Box()//    
  { 
   int i,j; 
   for(i=0;i<23;i++) 
    for(j=0;j<12;j++) 
     map[i][j]=0; 
   hotpoint[0]=0; 
   hotpoint[1]=5; 
   point=0; 
   level=1; 
   top=99; 
   ID=0; 
  } 
  void SetColor(int color);//   
  void DrawMap();//        
  bool Judge(int x,int y);//             
  void Welcome();//     
  void DrawBox(int x,int y,int num);//     
  void Redraw(int x,int y,int num);//     
  void Run();//   
  void Turn();//     
  void UpdataMap();//     
  void Pause();//   
}; 
다음은 상수 와 커서 함수 로 저장 과 호출 에 편리 합 니 다.

#define A1 0//A     ,B   ,C L ,D     
#define A2 1 
 
 
#define B 2 
 
 
#define C11 3 
#define C12 4 
#define C13 5 
#define C14 6 
 
 
#define C21 7 
#define C22 8 
#define C23 9 
#define C24 10 
 
 
#define D11 11 
#define D12 12 
 
 
#define D21 13 
#define D22 14 
 
 
void SetPos(int i,int j)//       
{ 
COORD pos={i,j}; 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); 
} 
 
 
const int sharp[15][8]= 
{ 
{0,0,1,0,2,0,3,0},{0,0,0,1,0,2,0,3}, 
{0,0,1,0,0,1,1,1}, 
{0,0,1,0,1,1,1,2},{0,1,1,1,2,0,2,1},{0,0,0,1,0,2,1,2},{0,0,0,1,1,0,2,0}, 
{1,0,1,1,1,2,0,2},{0,0,0,1,1,1,2,1},{0,0,0,1,0,2,1,0},{0,0,1,0,2,0,2,1}, 
{0,0,0,1,1,1,1,2},{0,1,1,0,1,1,2,0}, 
{0,1,0,2,1,0,1,1},{0,0,1,0,1,1,2,1} 
};//        ,     
 
 
const int high[15]={4,1,2,2,3,2,3,2,3,2,3,2,3,2,3};//                ,          
유형 방법의 실현

void Box::SetColor(int colorID) 
{ 
 int n_color; 
 switch(colorID) 
 { 
  case 0: n_color = 0x08;break; 
  case 1: n_color = 0x0C;break; 
  case 2: n_color = 0x0D;break; 
  case 3: n_color = 0x0E;break; 
  case 4: n_color = 0x0A;break; 
 } 
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n_color); 
} 
void Box::DrawMap()//    
{ 
 int i; 
 
 SetColor(0);//     
 
 for(i=0;i<14;i++) 
 { 
   SetPos(i*2,0); 
   cout<<"■"; 
 } 
 for(i=1;i<=24;i++) 
 { 
  SetPos(0,i); 
  cout<<"■"; 
  SetPos(13*2,i); 
  cout<<"■"; 
 } 
 for(i=0;i<14;i++) 
 { 
   SetPos(i*2,24); 
   cout<<"■"; 
 } 
  
 i=15; 
 for(i=15;i<=25;i++) 
 { 
   SetPos(i*2,0); 
   cout<<"■"; 
 } 
 for(i=1;i<=8;i++) 
 { 
  SetPos(15*2,i); 
  cout<<"■"; 
  SetPos(25*2,i); 
  cout<<"■"; 
 } 
 for(i=15;i<=25;i++) 
 { 
   SetPos(i*2,9); 
   cout<<"■"; 
 } 
 
 SetPos(16*2,16); 
 cout<<"     "; 
 SetPos(16*2,17); 
 cout<<"  :"<<point; 
 SetPos(16*2,18); 
 cout<<"  :"<<level; 
} 
 
void Box::DrawBox(int x,int y,int num)//     
{ 
  int i; 
  int nx,ny; 
  if (num<2)SetColor(1);//0、1    
  else if(num<3) SetColor(2);//2    
  else if(num<11) SetColor(3);//3、4、5、6、7、8、9、10 
  else SetColor(4); 
  for(i=0;i<4;i++) 
 { 
  nx=x+sharp[num][i*2]; 
  ny=y+sharp[num][i*2+1]; 
  SetPos((ny+1)*2,nx+1);//  sharp      x,y     
  //SetColor(i+1); 
  cout<<"■"; 
 } 
} 
 
void Box::Redraw(int x,int y,int num)//    ,     
{ 
  int i; 
  int nx,ny; 
  for(i=0;i<4;i++) 
 { 
  nx=x+sharp[num][i*2]; 
  ny=y+sharp[num][i*2+1]; 
  SetPos((ny+1)*2,nx+1); 
  cout<<" "; 
 } 
} 
 
void Box::Turn()//    ,    ID   
{ 
 switch(ID) 
 { 
  case A1: ID=A2; break; 
  case A2: ID=A1; break; 
 
  case B: ID=B; break; 
 
  case C11: ID=C12; break; 
  case C12: ID=C13; break; 
  case C13: ID=C14; break; 
  case C14: ID=C11; break; 
 
  case C21: ID=C22; break; 
  case C22: ID=C23; break; 
  case C23: ID=C24; break; 
  case C24: ID=C21; break; 
   
  case D11: ID=D12; break; 
  case D12: ID=D11; break; 
 
  case D21: ID=D22; break; 
  case D22: ID=D21; break; 
 } 
 
} 
 
void Box::Welcome()//     
{ 
 char x; 
 while(1) 
 { 
  system("cls"); 
  cout<<"■■■■■■■■■■■■■■■■■■■"<<endl; 
  cout<<"■             ■"<<endl; 
  cout<<"■■■■■■■■■■■■■■■■■■■"<<endl; 
  cout<<"■  A,D     S      ■"<<endl; 
  cout<<"■  W      P      ■"<<endl; 
  cout<<"■   Q        ■"<<endl; 
  cout<<"■■■■■■■■■■■■■■■■■■■"<<endl; 
  cout<<"■         ■"<<endl; 
  cout<<"■   1-9    !!   ■"<<endl; 
  cout<<"■         ■"<<endl; 
  cout<<"■         ■"<<endl; 
  cout<<"■■■■■■■■■■■■■■■■■■■"<<endl; 
  SetPos(16,9); 
  x=getch(); 
  if(x<='9'&&x>='1')//     
  { 
   level=x-'0'; 
   break; 
  } 
 } 
} 
 
void Box::UpdataMap()//    (  ) 
{ 
  int clear; 
  int i,j,k; 
  int nx,ny; 
  int flag; 
  for(i=0;i<4;i++)//  map      
  { 
  nx=hotpoint[0]+sharp[ID][i*2]; 
  ny=hotpoint[1]+sharp[ID][i*2+1]; 
  map[nx][ny]=1; 
  } 
  if(hotpoint[0]<top)//             ,  0        
   top=hotpoint[0]; 
  clear=0;//      
  for(i=hotpoint[0];i<hotpoint[0]+high[ID];i++) 
  { 
   flag=0; 
   for(j=0;j<12;j++)//           
   { 
    if(map[i][j]==0)//     ,     
    { 
     flag=1;//1       
     break; 
    } 
   } 
   if(flag==0)//     
   { 
    for(k=i;k>=top;k--)//                
    { 
     if(k==0)//        
      for(j=0;j<12;j++) 
      { 
       map[k][j]=0; 
       SetPos((j+1)*2,k+1); 
       cout<<" "; 
      } 
     else 
     { 
      for(j=0;j<12;j++) 
      { 
       map[k][j]=map[k-1][j]; 
       SetPos((j+1)*2,k+1); 
       if(map[k][j]==0) 
       cout<<" "; 
       else 
       cout<<"■"; 
      } 
     } 
    } 
    top++;//    ,      
    clear++; 
    point+=clear*10*level; 
   } 
  } 
  SetColor(0); 
  SetPos(16*2,17); 
  cout<<"  :"<<point; 
} 
 
void Box::Run()//     
{ 
 int i=0; 
 char x; 
 int Count;//    
 int nextID; 
 int temp; 
 srand((int)time(0));//          time(0):    
 ID=rand()%15;//    ID    ID 
 nextID=rand()%15;//      ,               
 DrawBox(hotpoint[0],hotpoint[1],ID);//     
 DrawBox(3,17,nextID); 
 Count=1000-level*100;//      ,    Count    ,         
 while(1) 
 { 
  if(i>=Count) 
  { 
   i=0;//      
   if(Judge(hotpoint[0]+1,hotpoint[1]))//        (   ) 
   { 
     UpdataMap();//     
     ID=nextID;//   ID,    ID     ID 
     hotpoint[0]=0;//     
     hotpoint[1]=5; 
     Redraw(3,17,nextID); 
     nextID=rand()%15; 
     DrawBox(hotpoint[0],hotpoint[1],ID); 
     DrawBox(3,17,nextID); 
     if(Judge(hotpoint[0],hotpoint[1]))//        ,     
     { 
      //getch(); 
      system("cls"); 
      SetPos(25,15); 
      cout<<"    !!!     :"<<point<<endl; 
      system("pause");//              “Press any key to exit” 
      exit(0);//      ,         ,  0       
     } 
   } 
   else 
   { 
    Redraw(hotpoint[0],hotpoint[1],ID);//    ,       
    hotpoint[0]++;//     
    DrawBox(hotpoint[0],hotpoint[1],ID); 
   } 
  } 
  if(kbhit())//       
  { 
   x=getch(); 
   if(x=='a'||x=='A')//   
   { 
     if(Judge(hotpoint[0],hotpoint[1]-1)==0) 
     { 
      Redraw(hotpoint[0],hotpoint[1],ID); 
      hotpoint[1]-=1; 
      DrawBox(hotpoint[0],hotpoint[1],ID); 
     } 
   } 
   if(x=='d'||x=='D')//   
   { 
     if(Judge(hotpoint[0],hotpoint[1]+1)==0) 
     { 
      Redraw(hotpoint[0],hotpoint[1],ID); 
      hotpoint[1]+=1; 
      DrawBox(hotpoint[0],hotpoint[1],ID); 
     } 
   } 
   if(x=='s'||x=='S')//    !!!!!!!!      ,        。  +3  ,   BUG,         
   { 
     if(Judge(hotpoint[0]+3,hotpoint[1])==0) 
     { 
      Redraw(hotpoint[0],hotpoint[1],ID); 
      hotpoint[0]+=1; 
      DrawBox(hotpoint[0],hotpoint[1],ID); 
     } 
   } 
   if(x=='w'||x=='W')//     
   { 
    temp=ID; 
    Turn(); 
    if(!Judge(hotpoint[0],hotpoint[1])) 
     { 
      Redraw(hotpoint[0],hotpoint[1],temp); 
      DrawBox(hotpoint[0],hotpoint[1],ID); 
     } 
    else 
     ID=temp; 
   } 
   if(x=='p'||x=='P') 
   { 
    //getch(); 
    //system("cls"); 
    Pause(); 
   } 
   if(x=='q'||x=='Q') 
   { 
    system("cls"); 
    SetPos(25,15); 
    cout<<"    !!!     :"<<point<<endl; 
    system("pause"); 
    exit(0); 
   } 
   while(kbhit())//          
    getch(); 
  } 
  Sleep(1);//  1   
  i++;//    1 
 } 
} 
 
int Box::Judge(int x,int y)//             
{ 
 int i; 
 int nx,ny; 
 for(i=0;i<4;i++) 
 { 
  nx=x+sharp[ID][i*2]; 
  ny=y+sharp[ID][i*2+1]; 
  if(nx<0||nx>=23||ny<0||ny>=12||map[nx][ny]==1)//  ,  1 
   return 1; 
 } 
 return 0; 
} 
void Box::Pause() 
{ 
 system("cls"); 
 while(1) 
 {  
  SetPos(30,13); 
  cout<<"    ,    ^-^"<<endl; 
  if(getch()=='p'||getch()=='P') 
   break; 
 } 
 SetPos(30,13); 
 cout<<"       "<<endl; 
 DrawMap(); 
 int i ,j; 
 for(i=0;i<23;i++) 
  for(j=0;j<12;j++) 
   if(map[i][j]==1) 
   {  
    SetPos((j+1)*2,i+1); 
    cout<<"■"; 
   } 
} 

void main()//    
{ 
 Box game; 
 game.Welcome(); 
 system("cls"); 
 game.DrawMap(); 
 game.Run(); 
} 
개선 할 점: 
1.가속 하강 할 때 코드 에서 도 마지막 몇 칸 은 가속 할 수 없다 는 것 을 알 수 있다. 
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기