首页 > 代码库 > 纯c 2048

纯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("\n"); 

 
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("\t"); 
                continue; 
            } 
 
            printf("%2d\t", box[i][j]); 
        } 
        printf("|"); 
        printf("\n"); 
    } 
    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:\n"); 
        print(n); 
        if (!mark){ 
            continue; 
        } 
        fillBox(n); 
        printf("Fill:\n"); 
        print(n); 
 
        if (isOver(n)){ 
            printf("\n\nGame Over!\n\n"); 
            break; 
        } 
    } 
     
     
    return 0;