【自用14】C++俄罗斯方块-思路复盘2

55 篇文章 0 订阅
28 篇文章 0 订阅

上期思路回顾

编写主函数--->欢迎函数--->游戏基本布局--->右上角方块显示

注:

右上角方块的显示功能在编写过程中,游戏板块当下的方块形态和下一个方块的形态都已经确定了。所以需要两个变量来保存方块当下的形态和下一个方块形态的编号。

右上角方块显示的功能的大致思路,如下:

清除当前方块--->确定需要显示方块的形态编码--->绘制需要显示的方块

右上角方块显示功能设计结束之后,开始游戏主界面功能和画面的设计

在主要功能设计开始之前,需要做一些准备工作,如下:

访问数组

定义访问数组来记录游戏主界面每一个位置是否有方块。

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
 
    }
}

降落函数思路:

检查游戏是否结束--->持续循环--->监测是否有暂停游戏指示--->清除当前方块--->不断监测键盘按键--->绘制当前方块--->稍作暂停

其中,不同的按键将对方块进行不同的操作,其中的函数在后续完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值