俄罗斯方块88行 代码注释版 (一)

来源:互联网 发布:劳拉西泮片 知乎 编辑:程序博客网 时间:2024/05/22 19:26

void trsInit() {
    int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},
        {39,305,114,562},{54,561},{99,306},{51,51},{-1}};
    int *p, i, j, b;
    for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; //1,2,3,4四个形状中如果有3,4为空说明只有两个不重复的,如S形,这时3拷贝1的,4拷贝2的就行了
    gt.pool = &gt._pool[4];
    for (j = 0; j < 7; ++j)
        for (i = 0; i < 4; ++i)
            for (b = 0; b < 16; ++b)
                gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1),
                sp[j][i] >>= 1;
    memset(gt._pool, -1, sizeof(gt._pool));
    for (i = 0; i < 10; ++i)
        memset(&gt.pool[i], 0, sizeof(int[21]));
    return ;
}

int trsCopy(int sp[], int x, int y, int c) {
 //c为0就单纯的碰撞检测,c为1是复制,c为2就是反复制
    int i, cx, cy;
    for (i = 0; i < 16; ++i) if (sp[i]) {
        cx = x + (i & 3), cy = y + (i >> 2); //i&3可以取到i所对应的列号,i>>2可以取到i所对应的行号
        if (gt.pool[cx][cy])
            if (c == 2) gt.pool[cx][cy] = 0; else return 0;
        if (c==1) gt.pool[cx][cy] = sp[i]; //16个格子一起copy所以不会有残影什么的
    }
    return 1;
}