• 纯c 2048


    #include <climits> 
    #include <cstdio> 
    #include <cstring> 
    #include <stack> 
    #include <string> 
    #include <map> 
    #include <vector> 
    #include <cmath> 
     
     
    using namespace std; 
     
    const int MAXX = 10; 
     
    int box[MAXX][MAXX]; 
     
    void moveLeft(int n, bool &ret){ 
        for (int i = 0; i < n; ++i){ 
            for (int j = 0; j < n; ++j){ 
                int k; 
                for (k = j - 1; k >= 0; --k){ 
                    if (box[i][k] != -1){ 
                        break; 
                    } 
                } 
                box[i][k + 1] = box[i][j]; 
     
                if ((k + 1) != j){ 
                    box[i][j] = -1; 
                    ret = true; 
                } 
            } 
        } 

     
    void mergeLeft(int n, bool &ret){ 
        for (int i = 0; i < n; ++i){ 
            for (int j = 0; j < n - 1; ++j){ 
                if (box[i][j] == -1)continue; 
     
                if (box[i][j] == box[i][j + 1]){ 
                    box[i][j] *= 2; 
                    box[i][j + 1] = -1; 
                    ret = true; 
                    ++j; 
                } 
            } 
        } 

     
    bool left(int n){ 
        bool ret = false; 
        moveLeft(n, ret); 
        mergeLeft(n, ret); 
        moveLeft(n, ret); 
        return ret; 

     
    void moveRight(int n, bool &ret){ 
        for (int i = 0; i < n; ++i){ 
            for (int j = n - 1; j >= 0; --j){ 
                if (box[i][j] == -1)continue; 
     
                int k; 
                for (k = j + 1; k < n; ++k){ 
                    if (box[i][k] != -1){ 
                        break; 
                    } 
                } 
     
                box[i][k - 1] = box[i][j]; 
                if ((k - 1) != j){ 
                    box[i][j] = -1; 
                    ret = true; 
                } 
            } 
        } 

     
    void mergeRight(int n, bool &ret){ 
        for (int i = 0; i < n; ++i){ 
            for (int j = n - 1; j >0; --j){ 
                if (box[i][j] == -1)continue; 
     
                if (box[i][j] == box[i][j - 1]){ 
                    box[i][j] *= 2; 
                    box[i][j - 1] = -1; 
                    ret = true; 
                    --j; 
                } 
            } 
        } 

     
    bool right(int n){ 
        bool ret = false; 
        moveRight(n, ret); 
        mergeRight(n, ret); 
        moveRight(n, ret); 
        return ret; 

     
    void moveUp(int n, bool &ret){ 
        for (int j = 0; j < n; ++j){ 
            for (int i = 0; i < n; ++i){ 
                int k; 
                for (k = i - 1; k >= 0; --k){ 
                    if (box[k][j] != -1){ 
                        break; 
                    } 
                } 
                box[k + 1][j] = box[i][j]; 
     
                if ((k + 1) != i){ 
                    box[i][j] = -1; 
                    ret = true; 
                } 
            } 
        } 

     
    void mergeUp(int n, bool &ret){ 
        for (int j = 0; j < n; ++j){ 
            for (int i = 0; i < n - 1; ++i){ 
                if (box[i][j] == -1)continue; 
     
                if (box[i][j] == box[i + 1][j]){ 
                    box[i][j] *= 2; 
                    box[i + 1][j] = -1; 
                    ret = true; 
                    ++i; 
                } 
            } 
        } 

     
    bool up(int n){ 
        bool ret = false; 
        moveUp(n, ret); 
        mergeUp(n, ret); 
        moveUp(n, ret); 
        return ret; 

     
    void moveDown(int n, bool &ret){ 
        for (int j = 0; j < n; ++j){ 
            for (int i = n - 1; i >= 0; --i){ 
                if (box[i][j] == -1)continue; 
     
                int k; 
                for (k = i + 1; k < n; ++k){ 
                    if (box[k][j] != -1)break; 
                } 
     
                box[k - 1][j] = box[i][j]; 
     
                if ((k - 1) != i){ 
                    box[i][j] = -1; 
                    ret = true; 
                } 
            } 
        } 

     
    void mergeDown(int n, bool &ret){ 
        for (int j = 0; j < n; ++j){ 
            for (int i = n - 1; i > 0; --i){ 
                if (box[i][j] == -1)continue; 
     
                if (box[i][j] == box[i - 1][j]){ 
                    box[i][j] *= 2; 
                    box[i - 1][j] = -1; 
                    ret = true; 
                    --i; 
                } 
            } 
        } 

     
    bool down(int n){ 
        bool ret = false; 
        moveDown(n, ret); 
        mergeDown(n, ret); 
        moveDown(n, ret); 
        return ret; 

     
    void line(int n){ 
        for (int i = 0; i < n; ++i){ 
            printf("--------"); 
        } 
        printf("-"); 
        printf(" "); 

     
    void print(int n){ 
        for (int i = 0; i < n; ++i){ 
            line(n); 
            for (int j = 0; j < n; ++j){ 
                printf("|"); 
                if (box[i][j] == -1){ 
                    printf(" "); 
                    continue; 
                } 
     
                printf("%2d ", box[i][j]); 
            } 
            printf("|"); 
            printf(" "); 
        } 
        line(n); 

     
    bool isFull(int n){ 
        bool mark = true; 
        for (int i = 0; i < n; ++i){ 
            for (int j = 0; j < n; ++j){ 
                if (box[i][j] == -1){ 
                    mark = false; 
                    return mark; 
                } 
            } 
        } 
        return mark; 

     
    bool isOver(int n){ 
        if (!isFull(n)){ 
            return false; 
        } 
        for (int i = 0; i < n; ++i){ 
            for (int j = 0; j < n; ++j){ 
                if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){ 
                    return false; 
                } 
            } 
        } 
        return true; 

     
    void fillBox(int n){ 
        int i, j, num; 
     
        if (isFull(n)){ 
            return; 
        } 
     
        while (true){ 
            i = rand() % n; 
            j = rand() % n; 
            num = rand() % 2 == 0 ? 2 : 4; 
     
            if (box[i][j] == -1){ 
                box[i][j] = num; 
                break; 
            } 
        } 

     
    int main(){ 
        //freopen("in.txt", "r", stdin); 
        memset(box, -1, sizeof(box)); 
     
        int n; 
        bool mark; 
        scanf("%d%*c", &n); 
     
        fillBox(n); 
        fillBox(n); 
        print(n); 
     
        while (true){ 
            char ch; 
            scanf("%c%*c", &ch); 
            if (ch == 'a'){ 
                mark = left(n); 
            } 
            else if (ch == 'd'){ 
                mark = right(n); 
            } 
            else if (ch == 'w'){ 
                mark = up(n); 
            } 
            else if (ch == 's'){ 
                mark = down(n); 
            } 
            else{ 
                continue; 
            } 
            system("cls"); 
            printf("Move: "); 
            print(n); 
            if (!mark){ 
                continue; 
            } 
            fillBox(n); 
            printf("Fill: "); 
            print(n); 
     
            if (isOver(n)){ 
                printf(" Game Over! "); 
                break; 
            } 
        } 
         
         
        return 0; 

  • 相关阅读:
    android studio遇到的一系列问题
    flask接口入门实现简单的登录注册(二)
    flask接口入门实现简单的登录注册(一)
    第一节:django环境 模型 视图 后台
    设计模式二:建造者模式
    设计模式一:工厂模式
    mysql系列:创建数据库和用户及赋权
    mysql系列:mysql的数据类型
    mysql系列:数据库范式与mysql引擎
    mysql系列:centos7.6上安装mysql8.0
  • 原文地址:https://www.cnblogs.com/wlcaption/p/3888078.html
Copyright © 2020-2023  润新知