c语言 字符版 简易2048

花了两个多小时,用最蠢的方法写的……最简陋版……

还不确定这么写逻辑对不对……

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <ctime>

#include <conio.h>

using namespace std;



int map[5][5];



int score;



int move(int& a, int& b, int& c, int& d) //move nonzero digit to front

{

    int vis_num = 0;    //the number of visited digit, most is 4

    int zero_num = 0;   //the number of zero digit

    while (1) {

        if (a != 0) {

            if (++vis_num >= 4) return zero_num;

            break;

        }

        ++zero_num;

        a = b;

        b = c;

        c = d;

        d = 0;

        if (++vis_num >= 4) return zero_num;

    }

    while (1) {

        if (b != 0) {

            if (++vis_num >= 4) return zero_num;

            break;

        }

        ++zero_num;

        b = c;

        c = d;

        d = 0;

        if (++vis_num >= 4) return zero_num;

    }

    while (1) {

        if (c != 0) {

            ++vis_num;

            if (vis_num >= 4) return zero_num;

            break;

        }

        ++zero_num;

        c = d;

        d = 0;

        if (++vis_num >= 4) return zero_num;

    }

    if (d == 0)

        ++zero_num;

    return zero_num;

}



void change(int& a, int& b, int& c, int& d)

{

    int zero_num = move(a, b, c, d);

    if (zero_num == 4 || zero_num == 3) return ;

    if (zero_num == 2) {

        if (a == b) {

            score += a * 10;

            a <<= 1;

            b = 0;

        }

        return ;

    }

    if (zero_num == 1) {

        if (a == b) {

            score += a * 10;

            a <<= 1;

            b = c;

            c = 0;

        } else if (c == b) {

            score += c * 10;

            b <<= 1;

            c = 0;

        }

        return ;

    }

    if (a == b) {

        if (c == d) {

            score += c * 10;

            score += a * 10;

            a <<= 1;

            b = c << 1;

            c = d = 0;

        } else {

            score += a * 10;

            a <<= 1;

            b = c;

            c = d;

            d = 0;

        }

    } else if (b == c){

        score += b * 10;

        b <<= 1;

        c = d;

        d = 0;

    } else if (c == d) {

        score += c * 10;

        c <<= 1;

        d = 0;

    }

}



int rand_2_or_4()

{

    if (rand() & 1) return 2;

    return 4;

}



void rand_pos()

{

    int x, y;

    do {

        x = rand() % 4;

        y = rand() % 4;

    } while (map[x][y]);

    map[x][y] = rand_2_or_4();

}



void print()

{

    int i, j;

    for (i = 0; i < 4; ++i) {

        for (j = 0; j < 4; ++j) {

            if (map[i][j] == 0) printf("  □ ");

            else printf("%4d ", map[i][j]);

        }

        printf("\n");

    }

    printf("score:%d\n", score);

}



bool is_full()

{

    int i, j;

    for (i = 0; i < 4; ++i)

        for (j = 0; j < 4; ++j)

            if (map[i][j] == 0) return false;

    return true;

}



bool is_over_row(int a, int b, int c, int d)

{

    if (a != b && b != c && c != d) return true;

    return false;

}



bool is_over()

{

    if (!is_full()) return false;

    int i;

    for (i = 0; i < 4; ++i) {

        if (!is_over_row(map[i][0], map[i][1], map[i][2], map[i][3]))

            return false;

    }

    for (i = 0; i < 4; ++i) {

        if (!is_over_row(map[0][i], map[1][i], map[2][i], map[3][i]))

            return false;

    }

    return true;

}



int main()

{

//    int a,b,c,d;

//    while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF){

//        change(a,b,c,d);

//        printf("%d %d %d %d\n", a, b, c, d);

//    }

    srand(unsigned(time(NULL)));

    rand_pos();

    rand_pos();

    print();

    while (!is_over()) {

        char dir = getch();

        int i;

        if (dir == 'w') {

            for (i = 0; i < 4; ++i) {

                change(map[0][i], map[1][i], map[2][i], map[3][i]);

            }

        } else if (dir == 's') {

            for (i = 0; i < 4; ++i)

                change(map[3][i], map[2][i], map[1][i], map[0][i]);

        } else if (dir == 'a') {

            for (i = 0; i < 4; ++i)

                change(map[i][0], map[i][1], map[i][2], map[i][3]);

        } else if (dir == 'd') {

            for (i = 0; i < 4; ++i)

                change(map[i][3], map[i][2], map[i][1], map[i][0]);

        } else continue;

        if (!is_full()) rand_pos();

        system("cls");

        print();

    }

    printf("Lose!");

    return 0;

}

  

你可能感兴趣的:(C语言)