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;
}

  

后来发现我的写法有问题,因为如果不移动的话,就不会产生新的数字,而我的逻辑是只要有空位就有新的数字。之前没有认真观察过,懒得改了(其实是没想到什么好的方法……

posted @ 2015-07-27 17:30  我不吃饼干呀  阅读(300)  评论(0编辑  收藏  举报