课程名称: 物联网/嵌入式工程师
课程章节: 第四周 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一定得记着,不然图形会重叠。
最终效果就是: