课程名称:
物联网/嵌入式工程师
课程章节(阶段一第四周 C项目实践-俄罗斯方块游戏1-5):
俄罗斯方块的数据存储课程链接
老师:
大白老师
课程内容:
如何存储俄罗斯方块的7种图形与每种图形的4种变换
学习笔记:
-
知道存取哪些数据,然后设计存储方式
-
经过分析
图形可以通过三维数组类存储。
7代表方块有7种基本的变化形状。
4代表有4个旋转方向(上,下,左,右)
18代表每行有18个元素,其中前16个数据代表图形的形状,第17个数据代表距离右侧边界距离,第18个数据代表
int shape[7][4][18];
//7—7种图形
//4—每种图形有4种变换
//18---- 前16个代表二维数组的数据点,第17个代表距离右侧的距离,第18个代表距离下侧的距离,距离用来判断边界碰撞问题 -
在打印的时候要注意x,y坐标的变化,不然可能会出现两个图形会连在一起或者错位
完整的示例代码:
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
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},
}
};
// n 7种图形的一种
// m 4个方向中一个
// x,y 坐标
// c color
void print_mode_shape(int n, int m, int x, int y, int c){
int i = 0;
int xx = x;
int yy = y;
for (int i = 0; i < 16; i++) {
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");
}
xx += 2;
}
}
int main(){
// 清屏
printf("\033[2J\n");
int x = 2;
int y = 2;
int 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 += 12;
}
x = 2;
y += 5;
printf("\n");
getchar();// 表示停顿
}
printf("\033[?25h");
return 0;
}
打卡:
打印的俄罗斯方块的所有图形
课程评价
没想到自己也能动手写小时候玩的经典游戏,通过老师的讲解,原来用一个三维数组
就能保存所有图形的变化。另外通过vt100来打印图形把命令行界面变成类似游戏的界面,很神奇。