亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++控制臺實現俄羅斯方塊游戲

2020-05-23 13:27:16
字體:
來源:轉載
供稿:網友

之前學了些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、加速下降的時候,從代碼中也可以發現,最后幾格沒法加速。 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩在线播放| 国产激情久久久| 欧美一区在线直播| 国色天香2019中文字幕在线观看| 亚洲自拍欧美色图| 国产福利精品在线| 亚洲免费福利视频| www.午夜精品| 色妞色视频一区二区三区四区| 国产久一一精品| 亚洲欧美一区二区激情| 色偷偷噜噜噜亚洲男人| 久久久999国产精品| 日韩69视频在线观看| 国产精品久久中文| 亚洲免费影视第一页| 欧美日韩成人在线观看| 国产精品美女久久| 欧美成人免费播放| 青青a在线精品免费观看| 夜夜嗨av色综合久久久综合网| 美女av一区二区| 国产精品视频中文字幕91| 一区二区三区四区精品| 91福利视频网| 最近中文字幕日韩精品| 欧美视频在线观看免费网址| 国产精品igao视频| 2021久久精品国产99国产精品| 亚洲第一色中文字幕| 在线播放精品一区二区三区| 国产精品久久在线观看| 国产精品久久久久91| 成人黄色短视频在线观看| 最好看的2019年中文视频| 日韩欧美一区二区三区久久| 亚洲一区二区中文| 久久精品国产亚洲7777| 国产精品男人爽免费视频1| 欧美最猛性xxxxx(亚洲精品)| 日韩av网址在线| 亚洲一区二区三区四区视频| 亚洲深夜福利网站| 国产在线拍揄自揄视频不卡99| 国产精品久久不能| 91日本在线观看| 两个人的视频www国产精品| 日韩在线观看免费全| 91精品国产高清自在线看超| 国产香蕉精品视频一区二区三区| 午夜免费在线观看精品视频| 97久久国产精品| 2021久久精品国产99国产精品| 91国偷自产一区二区三区的观看方式| 国产精品老女人精品视频| 欧美激情综合色综合啪啪五月| 国产精品美乳一区二区免费| 久久综合久中文字幕青草| 日本一区二三区好的精华液| 国产精品久久一区| 成人午夜黄色影院| 日韩欧美a级成人黄色| 国产偷国产偷亚洲清高网站| 88国产精品欧美一区二区三区| 国产精品直播网红| www.亚洲男人天堂| 97在线视频免费看| 亚洲激情视频网站| 精品国产31久久久久久| 国产精品久久久精品| 成人美女av在线直播| 久久6免费高清热精品| 久久久国产视频| 亚洲第一男人av| 91精品久久久久久久久久入口| 91精品国产乱码久久久久久久久| 欧美日韩国产一区在线| 国产va免费精品高清在线观看| 亚洲欧美中文另类| 成人xvideos免费视频| 亚洲情综合五月天| 欧美性xxxxx极品| 国产成人一区二| 亚洲sss综合天堂久久| 亚洲少妇激情视频| 欧美性极品少妇精品网站| 青青草原成人在线视频| 国产色综合天天综合网| 国内成人精品一区| 久久精品国产亚洲7777| 91在线|亚洲| 韩日欧美一区二区| 丁香五六月婷婷久久激情| 亚洲第一区中文字幕| 亚洲免费视频观看| 国产日韩欧美自拍| 中文字幕自拍vr一区二区三区| 国产精品h片在线播放| 成人国产亚洲精品a区天堂华泰| 国产视频自拍一区| 国产一区二区美女视频| 亚洲精品av在线播放| 亚洲精品国产精品国产自| 精品久久久久久久中文字幕| 中文字幕在线日韩| 欧美伊久线香蕉线新在线| 中文字幕不卡av| 欧美日韩国产中文精品字幕自在自线| 日本国产精品视频| 亚洲欧美日韩国产成人| 欧美裸体xxxx极品少妇软件| 57pao成人国产永久免费| 97精品视频在线| 成人网在线视频| 亚洲天堂网站在线观看视频| 日韩精品视频免费| 久久精品影视伊人网| 国产精品极品美女粉嫩高清在线| 精品国产一区二区三区在线观看| 欧美性xxxxx极品| 亚洲热线99精品视频| 97香蕉超级碰碰久久免费的优势| 亚洲男人天堂九九视频| 一本一道久久a久久精品逆3p| 亚洲精品欧美一区二区三区| 这里只有视频精品| 亚洲乱码av中文一区二区| 亚洲欧美日韩一区二区在线| 亚洲欧美制服丝袜| 91免费版网站入口| 久久久亚洲国产天美传媒修理工| www.欧美精品一二三区| 日韩电视剧免费观看网站| 欧美一区视频在线| 亚洲欧美日韩中文在线制服| 国语自产精品视频在免费| 亚洲黄色av女优在线观看| 91精品国产色综合久久不卡98| 久久精品99久久久久久久久| 国语自产精品视频在线看抢先版图片| 国产91精品视频在线观看| 亚洲久久久久久久久久| 少妇激情综合网| 中文字幕欧美日韩精品| 欧美一级大片在线观看| 久久精品国产一区二区三区| 最好看的2019的中文字幕视频| 欧美日韩亚洲系列| 国产91热爆ts人妖在线| zzijzzij亚洲日本成熟少妇| 日韩一级裸体免费视频| 国内精品一区二区三区四区| 久久色免费在线视频| 精品调教chinesegay| 最近免费中文字幕视频2019| 亚洲精品永久免费精品| 久久高清视频免费| 国产一区二区三区丝袜| 欧美超级免费视 在线| 亚洲人成五月天| 国产日韩欧美在线播放| 亚洲成人网久久久| 久久香蕉国产线看观看网| 欧美华人在线视频|