上期思路回顾
编写主函数--->欢迎函数--->游戏基本布局--->右上角方块显示
注:
右上角方块的显示功能在编写过程中,游戏板块当下的方块形态和下一个方块的形态都已经确定了。所以需要两个变量来保存方块当下的形态和下一个方块形态的编号。
右上角方块显示的功能的大致思路,如下:
清除当前方块--->确定需要显示方块的形态编码--->绘制需要显示的方块
右上角方块显示功能设计结束之后,开始游戏主界面功能和画面的设计
在主要功能设计开始之前,需要做一些准备工作,如下:
访问数组
定义访问数组来记录游戏主界面每一个位置是否有方块。
int visit[30][15], Color[30][15]; // visit[i][j] == 1 表示该位置有方块
补充主函数思路:
产生下一个方块(右上角方块显示)---->清空访问数组
设计循环
在主函数中编写循环,不断生成新方块、
while(1){
newblock();
}
5.游戏主界面实现
方块降落
新方块函数
void newblock(void){
//确定即将使用的方块的类别
BlockIndex=NextIndex;
//绘制刚从顶部下降的方块
drawBlock(START_X,START_Y);
//让新出现的方块暂停一下,让用户识别到
Sleep(100);//0.1秒
//在右上角区域,绘制一个下一个方块
nextblock();
//方块降落
move();
}
编写思路:
主函数中编写循环,不断生成新方块
生成新方块函数:
赋值当前方块编号--->在指定位置绘制指定形态的方块--->在右上角区域绘制下一个方块(此步骤会生成下一个方块的形态编号)
void drawBlock(int x, int y, int blockIndex, block_dir_t dir) {
setcolor(color[blockIndex]);
settextstyle(23, 0, "楷体");
int id = blockIndex * 4 + dir;
for (int i=0; i<BLOCK_HEIGHT; i++) {
for (int j=0; j<BLOCK_WIDTH; j++) {
//"■"
if (block[id][i][j] == 1) {
int x2 = x + j * UNIT_SIZE;
int y2 = y + i * UNIT_SIZE;
outtextxy(x2, y2, "■");
}
}
}
}
在指定位置绘制方块函数思路:
设置笔触颜色,其中,方块颜色与方块编号一一对应,使用数组编号来实现这种需求
仿照右上角绘制方块的函数,进行指定位置绘制方块的函数重载,在函数中传入指定位置坐标,函数将自动调用全局的当前方块形态编号变量进行使用,并根据需要修改绘制时的位置。
下面放上右上角方块绘制函数方便对比
void drawBlock(){
setcolor(color[NextIndex]);//不同形态的方块对应不同的颜色
setfont(23,0,"楷体");
for(int i=0;i<BLOCK_HEIGHT;i++){
for(int j=0;j<BLOCK_WIDTH;j++){
if(block[NextIndex*4][i][j]==1){
//画小方块
int x=391+j*UNIT_SIZE;
int y=71+i*UNIT_SIZE;
outtextxy(x,y,"■");
}
}
}
}
降落函数
void move(void){
int x=START_X;
int y=START_Y;
block_dir_t blockDir;
int curSpeed = speed;
//检测游戏是否结束
failCheck();
//持续向下降落
while(1){
if(kbhit()){
int key=getch();
if(key==KEY_SPACE){
getch();//暂停
}
}
//清除当前方块
clearBlock(x,y,blockDir);
if(kbhit()){
int key=getch();
if(key==KEY_UP){
//to do
}else if(key==KEY_DOWN){
//to do
}else if(key==KEY_LEFT){
//to do
}else if(key==KEY_RIGHT){
//to do
}
}
//绘制当前方块
drawBlock();
wait(curSpeed);
//方块的固化处理
//to do
}
}
降落函数思路:
检查游戏是否结束--->持续循环--->监测是否有暂停游戏指示--->清除当前方块--->不断监测键盘按键--->绘制当前方块--->稍作暂停
其中,不同的按键将对方块进行不同的操作,其中的函数在后续完成