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