Cube Reverse

一些枚举类题目会提到某种特殊的密码锁,比如按下一个钮旁边的按钮状态也会跟着变之类的。这个小玩应跟枚举关系不大,只是一个3×3的方块,我开始叹服我的无聊程度了。
更新了,在最后,控制方法依然原始但是区域变成了4*4

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>

#define MULTIPLE 5  // 一个点放大为若干乘以若干的方块
#define CUBE 3  // 这里不要改除非你愿意替我重做按键映射
typedef char cTable[MULTIPLE * CUBE][MULTIPLE * CUBE];

bool** CreateCube(int N)    // 一个 N*N 的空方块
{
    int i;
    bool** c = (bool**)calloc(N, sizeof(bool*));

    for(i = 0; i < N; i++)
        c[i] = (bool*)calloc(N, sizeof(bool));

    return c;
}

void DelCube(bool** cube, int N)
{
    int i;
    for(i = 0; i < N; i++)
        free(cube[i]);
    free(cube);
}

bool creverse(bool a)
{
    return a?false:true;
}

void Push(bool** c, int x, int y)
{
    int ix, iy;
    int minx = (x == 0)?0:x-1, maxx = (x == CUBE-1)?(CUBE-1):x+1;
    int miny = (y == 0)?0:y-1, maxy = (y == CUBE-1)?(CUBE-1):y+1;

    for(iy = miny; iy <= maxy; iy++)
        c[x][iy] = creverse(c[x][iy]);
    for(ix = minx; ix <= maxx; ix++)
        c[ix][y] = creverse(c[ix][y]);

    c[x][y] = creverse(c[x][y]);
    return;
}

bool** Mult(bool** c, int mltp, bool** ch)  // 小方块映射到大方块
{// c[mx][my] -> ch[x][y], with mltp times.
    int N = CUBE;
    int x, y, mx, my;

    for(my = 0; my < N; my++)
        for(mx = 0; mx < N; mx++)
        {
            if(c[mx][my])
            {
                for(y = my*mltp; y<my*mltp+mltp; y++)
                    for(x = mx*mltp; x<mx*mltp+mltp; x++)
                        ch[x][y] = true;
            }
            else
            {
                for(y = my*mltp; y<my*mltp+mltp; y++)
                    for(x = mx*mltp; x<mx*mltp+mltp; x++)
                        ch[x][y] = false;
            }
        }
    return;
}

void bShow(bool** ch, cTable cc, int width, char t)
{// 同边长方块, 布尔->字符 映射
    int x, y;
    for(y = 0; y < width; y++)
        for(x = 0; x < width; x++)
        {
            if(ch[x][y])
                cc[x][y] = t;
            else
                cc[x][y] = ' ';
        }
    return;
}

void cShow(cTable cc, int width)
{
    int x, y;
    for(y = 0; y < width; y++)
        for(x = 0; x < width; x++)
        {
            putchar(cc[x][y]);
            if(x == width-1)
                putchar('\n');
        }
}

int check(bool** cube)
{
    int x, y;
    int sum = 0;
    for(x = 0; x < CUBE; x++)
        for(y = 0; y < CUBE; y++)
        {
            if(cube[x][y])
                sum++;
        }
    return sum;
}

int main(void)
{
    bool** cube = CreateCube(CUBE);
    bool** ch = CreateCube(MULTIPLE * CUBE);
    cube[1][1] = true;

    cTable table;
    Mult(cube, MULTIPLE, ch);
    bShow(ch, table, MULTIPLE * CUBE, '*');
    cShow(table, MULTIPLE * CUBE);

    char input = '\0', c;
    printf("\n[q,w,e,a,s,d,z,x,c] to push.\n");
    while(input != EOF)
    {
        input = getch();
        switch (input)  // 按键映射
        {
            case 'q': { Push(cube, 0,0); break;}
            case 'w': { Push(cube, 1,0); break;}
            case 'e': { Push(cube, 2,0); break;}
            case 'a': { Push(cube, 0,1); break;}
            case 's': { Push(cube, 1,1); break;}
            case 'd': { Push(cube, 2,1); break;}
            case 'z': { Push(cube, 0,2); break;}
            case 'x': { Push(cube, 1,2); break;}
            case 'c': { Push(cube, 2,2); break;}
        }
        Mult(cube, MULTIPLE, ch);
        system("cls");
        bShow(ch, table, MULTIPLE * CUBE, '*');
        cShow(table, MULTIPLE * CUBE);
        printf("\n[q,w,e,a,s,d,z,x,c] to push.\n");
        if(check(cube) == 0)
            printf("\aGood...you have destroyed all the cube! Just kidding.\n");
        else if(check(cube) == CUBE*CUBE)
            printf("\aYou highlight all the cube!\n");
    }
    DelCube(cube, CUBE);
    DelCube(ch, MULTIPLE * CUBE);
    printf("~Cubes were be destroyed!\n");

    return 0;
}

vol.2:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>

#define MULTIPLE 5  // 一个点放大为若干乘以若干的方块
#define CUBE 4  // 这里不要改除非你愿意替我重做按键映射
typedef char cTable[MULTIPLE * CUBE][MULTIPLE * CUBE];

bool** CreateCube(int N)    // 一个 N*N 的空方块
{
    int i;
    bool** c = (bool**)calloc(N, sizeof(bool*));

    for(i = 0; i < N; i++)
        c[i] = (bool*)calloc(N, sizeof(bool));

    return c;
}

void DelCube(bool** cube, int N)
{
    int i;
    for(i = 0; i < N; i++)
        free(cube[i]);
    free(cube);
}

bool creverse(bool a)
{
    return a?false:true;
}

void Push(bool** c, int x, int y)
{
    int ix, iy;
    int minx = (x == 0)?0:x-1, maxx = (x == CUBE-1)?(CUBE-1):x+1;
    int miny = (y == 0)?0:y-1, maxy = (y == CUBE-1)?(CUBE-1):y+1;

    for(iy = miny; iy <= maxy; iy++)
        c[x][iy] = creverse(c[x][iy]);
    for(ix = minx; ix <= maxx; ix++)
        c[ix][y] = creverse(c[ix][y]);

    c[x][y] = creverse(c[x][y]);
    return;
}

void Control(char ch, bool** cube)
{
    switch (ch)  // 按键映射
        {
            case '1': { Push(cube, 0,0); break;}
            case '2': { Push(cube, 1,0); break;}
            case '3': { Push(cube, 2,0); break;}
            case '4': { Push(cube, 3,0); break;}

            case 'q': { Push(cube, 0,1); break;}
            case 'w': { Push(cube, 1,1); break;}
            case 'e': { Push(cube, 2,1); break;}
            case 'r': { Push(cube, 3,1); break;}

            case 'a': { Push(cube, 0,2); break;}
            case 's': { Push(cube, 1,2); break;}
            case 'd': { Push(cube, 2,2); break;}
            case 'f': { Push(cube, 3,2); break;}

            case 'z': { Push(cube, 0,3); break;}
            case 'x': { Push(cube, 1,3); break;}
            case 'c': { Push(cube, 2,3); break;}
            case 'v': { Push(cube, 3,3); break;}
        }
    return;
}

bool** Mult(bool** c, int mltp, bool** ch)  // 小方块映射到大方块
{// c[mx][my] -> ch[x][y], with mltp times.
    int N = CUBE;
    int x, y, mx, my;

    for(my = 0; my < N; my++)
        for(mx = 0; mx < N; mx++)
        {
            if(c[mx][my])
            {
                for(y = my*mltp; y<my*mltp+mltp; y++)
                    for(x = mx*mltp; x<mx*mltp+mltp; x++)
                        ch[x][y] = true;
            }
            else
            {
                for(y = my*mltp; y<my*mltp+mltp; y++)
                    for(x = mx*mltp; x<mx*mltp+mltp; x++)
                        ch[x][y] = false;
            }
        }
    return;
}

void bShow(bool** ch, cTable cc, int width, char t)
{// 同边长方块, 布尔->字符 映射
    int x, y;
    for(y = 0; y < width; y++)
        for(x = 0; x < width; x++)
        {
            if(ch[x][y])
                cc[x][y] = t;
            else
                cc[x][y] = ' ';
        }
    return;
}

void cShow(cTable cc, int width)
{
    int x, y;
    for(y = 0; y < width; y++)
        for(x = 0; x < width; x++)
        {
            putchar(cc[x][y]);
            if(x == width-1)
            {
                putchar('|');
                putchar('\n');
            }

        }
    for(x = 0; x < width; x++)
        putchar('-');
    putchar('+');
    return;
}

int check(bool** cube)
{
    int x, y;
    int sum = 0;
    for(x = 0; x < CUBE; x++)
        for(y = 0; y < CUBE; y++)
        {
            if(cube[x][y])
                sum++;
        }
    return sum;
}

int main(void)
{
    bool** cube = CreateCube(CUBE);
    bool** ch = CreateCube(MULTIPLE * CUBE);
    cube[1][1] = true;
    cube[2][2] = true;
    char cubeType = '@';

    cTable table;
    Mult(cube, MULTIPLE, ch);
    bShow(ch, table, MULTIPLE * CUBE, cubeType);
    cShow(table, MULTIPLE * CUBE);

    char input = '\0', c;
    printf("\nPush \'1\' to \'v\' in keyboard\nto change a 4*4 cube.\n");
    while(input != EOF)
    {
        input = getch();

        Control(input,cube);

        Mult(cube, MULTIPLE, ch);
        system("cls");
        bShow(ch, table, MULTIPLE * CUBE, cubeType);
        cShow(table, MULTIPLE * CUBE);
        printf("\nPush \'1\' to \'v\' in keyboard\nto change a 4*4 cube.\n");
        if(check(cube) == 0)
            printf("\aGood... You have destroyed all the cube! Just kidding.\n");
        else if(check(cube) == CUBE*CUBE)
            printf("\aYou highlight all the cube!\n");
    }
    DelCube(cube, CUBE);
    DelCube(ch, MULTIPLE * CUBE);
    printf("~Cubes were be destroyed!\n");

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值