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、加速下降的时候,从代码中也可以发现,最后几格没法加速。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。