zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        printf("score:%d
    ", 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
    ", 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;
    }
    

      

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

  • 相关阅读:
    数据库操作
    jquery 第一章
    算法很美 第一章
    python 学习第四天
    python学习第三天
    python学习第二天
    学习python的第一天
    C#-线程
    C#-流、存储
    C#-集合
  • 原文地址:https://www.cnblogs.com/wenruo/p/4680736.html
Copyright © 2011-2022 走看看