为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第3天【养成记】嵌入式挑战第3天 学习俄罗斯方块的数据存储

标签:
C 嵌入式

课程名称:

物联网/嵌入式工程师

课程章节(阶段一第四周 C项目实践-俄罗斯方块游戏1-5):

俄罗斯方块的数据存储课程链接

老师:

大白老师

课程内容:

如何存储俄罗斯方块的7种图形与每种图形的4种变换

学习笔记:

  1. 知道存取哪些数据,然后设计存储方式

  2. 经过分析
    图形可以通过三维数组类存储。
    7代表方块有7种基本的变化形状。
    4代表有4个旋转方向(上,下,左,右)
    18代表每行有18个元素,其中前16个数据代表图形的形状,第17个数据代表距离右侧边界距离,第18个数据代表
    int shape[7][4][18];
    //7—7种图形
    //4—每种图形有4种变换
    //18---- 前16个代表二维数组的数据点,第17个代表距离右侧的距离,第18个代表距离下侧的距离,距离用来判断边界碰撞问题

  3. 在打印的时候要注意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来打印图形把命令行界面变成类似游戏的界面,很神奇。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消