继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第2天 物联网/嵌入式工程师 第四周

昆汀
关注TA
已关注
手记 19
粉丝 8
获赞 12

课程名称: 物联网/嵌入式工程师

课程章节: 第四周 C语言项目实战与阶段笔试

主讲老师: 大白老师

课程内容:

今天主要初学了俄罗斯方块的绘制方格以及数据存储。

课程收获:

图片描述
俄罗斯方块由上述其中方块类型构成,如果要绘制这些方格用坐标表示更加简单易懂,这样的话x,y坐标最大为4,4.即所有图形都可以用4*4的方格来表示。
一个点表示一个小方格,我们可以用二维数组来表示这些,所以进而可以把用到的格子设置为1,未用到的设置为0.
坐标值 = {1,1,0,0, 1,1,0,0, 0,0,0,0 ,0,0,0,0}就是表示第一个田字图形。
我们绘制这些图形的时候可以用三维数组;
int shape[7][4][18];为什么要用18不是16,因为后面还需要用到图形与下方以及图形与右方的距离,所以多定义两个整型来保存距离,7代表7个大的图形,4表示有四种变换。
如果要用三维数组把全部图形表示出来就是:

//7----7种图案


int shape[7][4][18] = 
{
    {
            {1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},    //
            {1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},    //
            {1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},    //[][]
            {1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},    //[][]
    },
    {
            {1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 3,0},     //[]  [][][][]   
            {1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,3},     //[]
            {1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 3,0},     //[]
            {1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,3},     //[] 
    },
    {
            {0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},     //  []    []      [][][]     [] 
            {1,0,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},     //[][][]  [][]      []     [][]
            {1,1,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},     //        []                 []
            {0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1}      //  
    },
    {
            {1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},    //[][]       []   
            {0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},    //  [][]   [][]     
            {1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},    //         []             
            {0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},    // 
    },
    {
            {0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},    //  [][]   []       
            {1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},    //[][]     [][]  
            {0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},    //           []             
            {1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},    // 
    },
    {
            {0,0,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},    //    []   []    [][][]  [][]
            {1,0,0,0, 1,0,0,0, 1,1,0,0, 0,0,0,0, 2,1},    //[][][]   []    []        []
            {1,1,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 1,2},    //         [][]            []
            {1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0, 2,1}     //    
    },
    {
            {1,0,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},    //[]       [][]  [][][]      []
            {1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0, 2,1},    //[][][]   []        []      []
            {1,1,1,0, 0,0,1,0, 0,0,0,0, 0,0,0,0, 1,2},    //         []              [][]
            {0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0, 2,1}},   //
};

这是用三维数组表示所有图形,那我们怎么打印出来呢,用for循环就行了

void print_mode_shape(int n,int m,int x,int y,int c)
{
        int i = 0;
        int xx = x;
        int yy = y;
        for(i = 0;i < 16;i++)
        {
        //4 * 4方格,每经过4行,纵坐标 + 1
                if(i != 0 && i%4 == 0)
                {
                        yy += 1;
                        xx = x;
                }

                if(shape[n][m][i] == 1)
                {
                        //指定坐标输出
                        printf("\033[%d;%dH",yy,xx);
                        //输出颜色[]
                        printf("\033[%dm[]",c);
                        //关闭颜色
                        printf("\033[0m");
                }
                //因此[]占2个位置,所以每次输出坐标偏移2个位置
                xx += 2;
        }
}

其实这个for循环就是三维数组的映射,如果数组中的元素,也就是遇到数组里面的点为1的话就打印。
把全部图形打印出来就是:

int main()
{
        //清除屏幕
        printf("\033[2J");
        int x = 6;
        int y = 6,k = 0;
        int i = 0;
        for(k = 0;k < 7;k++)
        {
                for(i = 0;i < 4;i++)
                {
                        print_mode_shape(k,i,x,y,43);
                        x = x + 12;
                }
                x = 6;
                y = y + 4;
                printf("\n");
                getchar();
        }
        printf("\33[?25h");//显示光标
    return 0;
}

上述的x=x+12一定得记着,不然图形会重叠。
最终效果就是:
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP