C++控制台实现俄罗斯方块游戏
之前学了些C++的课程,一直想着说编点小游戏,可是MFC又不想学,所以就只能变成控制台的小游戏。
俄罗斯方块一定是很多人小时候玩过的游戏。接下来就说说设计想法。
主要实现,选择游戏的等级,加速下降,不同形状不同颜色,暂停和退出功能。
首先是类的设计。
classBox { private: intmap[23][12];//画面坐标,记录有方块的点,也是游戏界面 inthotpoint[2];//当前活动的点,所有图形都是以此为基准绘制的 inttop;//当前最高位置 intpoint;//分数 intlevel;//等级 intID;//当前活动图形的ID号 intcolorID;//图形的颜色ID。 public: Box()//初始化 { inti,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; } voidSetColor(intcolor);//颜色 voidDrawMap();//画游戏的大界面 boolJudge(intx,inty);//判断当前位置能否绘制图形 voidWelcome();//欢迎界面 voidDrawBox(intx,inty,intnum);//绘制图形 voidRedraw(intx,inty,intnum);//擦除图形 voidRun();//运行 voidTurn();//转动方块 voidUpdataMap();//更新画面 voidPause();//暂停 };
接下来就是一些常量和光标函数,便于保存和调用
#defineA10//A代表长条型,B为方块,C为L型,D为闪电型 #defineA21 #defineB2 #defineC113 #defineC124 #defineC135 #defineC146 #defineC217 #defineC228 #defineC239 #defineC2410 #defineD1111 #defineD1212 #defineD2113 #defineD2214 voidSetPos(inti,intj)//设定光标位置 { COORDpos={i,j}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } constintsharp[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} };//形状点的各个坐标,先纵后横 constinthigh[15]={4,1,2,2,3,2,3,2,3,2,3,2,3,2,3};//这个数组是用来保存各个形状高度的,以上面的坐标相对应
类方法的实现
voidBox::SetColor(intcolorID) { intn_color; switch(colorID) { case0:n_color=0x08;break; case1:n_color=0x0C;break; case2:n_color=0x0D;break; case3:n_color=0x0E;break; case4:n_color=0x0A;break; } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),n_color); } voidBox::DrawMap()//画界面 { inti; 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<<"分数:"<='1')//设置等级 { level=x-'0'; break; } } } voidBox::UpdataMap()//更新画面(关键) { intclear; inti,j,k; intnx,ny; intflag; 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;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<<"分数:"< =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<<"游戏结束!!!最终得分为:"< =23||ny<0||ny>=12||map[nx][ny]==1)//不能,返回1 return1; } return0; } voidBox::Pause() { system("cls"); while(1) { SetPos(30,13); cout<<"暂停等待,咖啡时间^-^"< voidmain()//主函数 { Boxgame; game.Welcome(); system("cls"); game.DrawMap(); game.Run(); }待改进的点:
1、加速下降的时候,从代码中也可以发现,最后几格没法加速。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。