c/c++ 2048 120行左右~

来源:互联网 发布:深圳 知乎 编辑:程序博客网 时间:2024/05/29 10:11
</pre><pre name="code" class="cpp">#include <iostream>#include <ctime>#include <cstdlib>#include <cstring>using namespace std;/*代码重复性比较高,下面有修改后的代码。差不多100行。*/int game2048[6][6];bool move_(char a){    bool flag = false;    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)        {            switch(a)            {                case 'w':                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[n][m] && game2048[n][m] == game2048[i][m]) //w                        {                            game2048[n][m] *= 2;                            game2048[i][m] = 0;                            flag = true;                            break;                        }                        if(game2048[i][m] != 0) break;                    }                    break;                case 's':                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[5-n][5-m] && game2048[5-n][5-m] == game2048[5-i][5-m]) //s                        {                            game2048[5-n][5-m] *= 2;                            game2048[5-i][5-m] = 0;                            flag = true;                            break;                        }                        if(game2048[5-i][5-m] != 0) break;                    }                    break;                case 'a':                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[m][n] && game2048[m][n] == game2048[m][i]) //a                        {                            game2048[m][n] *= 2;                            game2048[m][i] = 0;                            flag = true;                            break;                        }                        if(game2048[m][i] != 0) break;                    }                    break;                case 'd':                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[5-m][5-n] && game2048[5-m][5-n] == game2048[5-m][5-i]) //d                        {                            game2048[5-m][5-n] *= 2;                            game2048[5-m][5-i] = 0;                            flag = true;                            break;                        }                        if(game2048[5-m][5-i] != 0) break;                    }                    break;            }        }    return flag;}bool plus_(char a){    bool flag = false;    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)        {            switch(a)            {                case 'w':                    if(game2048[n][m] != 0) continue;  //w                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[i][m] != 0)                        {                            game2048[n][m] = game2048[i][m];                            game2048[i][m] = 0;                            flag = true;                            break;                        }                    }                    break;                case 's':                    if(game2048[5-n][5-m] != 0) continue;  //s                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[5-i][5-m] != 0)                        {                            game2048[5-n][5-m] = game2048[5-i][5-m];                            game2048[5-i][5-m] = 0;                            flag = true;                            break;                        }                    }                    break;                case 'a':                   if(game2048[m][n] != 0) continue;  //a                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[m][i] != 0)                        {                            game2048[m][n] = game2048[m][i];                            game2048[m][i] = 0;                            flag = true;                            break;                        }                    }                    break;                case 'd':                    if(game2048[5-m][5-n] != 0) continue;  //d                    for(int i = n+1;i <= 4;i++)                    {                        if(game2048[5-m][5-i] != 0)                        {                            game2048[5-m][5-n] = game2048[5-m][5-i];                            game2048[5-m][5-i] = 0;                            flag = true;                            break;                        }                    }                    break;            }        }    return flag;}bool over(){    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)            if(game2048[n][m] == 0 || game2048[n][m] == game2048[n+1][m] || game2048[m][n] == game2048[m][n+1]) //w                return true;    return false;}void getblock(){    int a,b;    srand(unsigned(time(0)));    while(1)    {        a = 1 + (int)4 * rand() / (RAND_MAX + 1);        b = 1 + (int)4 * rand() / (RAND_MAX + 1);        if(!game2048[a][b])        {            game2048[a][b] = 2;            break;        }    }}void view(){    for(int m = 1;m <= 4;m++)    {        cout << endl;        for(int n = 1;n <= 4;n++)            cout << "  " << game2048[m][n] << "  ";        cout << endl;    }}void init(){    memset(game2048, 0, sizeof(game2048));    getblock();    view();}int main(){    char key;    init();    while(cin >> key)    {        bool flag = false;        flag = move_(key);        if(plus_(key) || flag)           getblock();        view();        if(!over())        {            cout << "Lost" << endl;            init();        }    }    return 0;}
/*这个是修改后的代码,代码差不多少了100行左右,代码重复部分减少了,代码少但是可读性可能变差了,abcd也挤在一行写了,,需要改进下码农的习惯*/
#include <iostream>#include <ctime>#include <cstdlib>#include <cstring>using namespace std;int game2048[6][6];bool move_(char r)//w a s d{    bool flag = false;    int a[25],b[25],c[25],d[25];    r -= 97;    for(int num = 0;num < 2;num++)    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)        {            a[22] = n;a[18] = 5 - n;a[0] = m;a[3] = 5 - m;            b[22] = m;b[18] = 5 - m;b[0] = n;b[3] = 5 - n;            if(num && game2048[a[r]][b[r]] != 0) continue;  //w            for(int i = n+1;i <= 4;i++)            {                c[22] = i;c[18] = 5 - i;c[0] = m;c[3] = 5 - m;                d[22] = m;d[18] = 5 - m;d[0] = i;d[3] = 5 - i;                if(!num && game2048[a[r]][b[r]] && game2048[a[r]][b[r]] == game2048[c[r]][d[r]]) //w                {                    game2048[a[r]][b[r]] *= 2;                    game2048[c[r]][d[r]] = 0;                    flag = true;//这里添加计分                    break;                }                if(!num && game2048[c[r]][d[r]] != 0) break;                if(num && game2048[c[r]][d[r]] != 0)                {                    game2048[a[r]][b[r]] = game2048[c[r]][d[r]] ;                    game2048[c[r]][d[r]] = 0;                    flag = true;                    break;                }            }        }    return flag;}bool over(){    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)            if(game2048[n][m] == 0 || game2048[n][m] == game2048[n+1][m] || game2048[m][n] == game2048[m][n+1]) //w                return true;    return false;}void getblock(){    int a,b;    srand(unsigned(time(0)));    while(1)    {        a = 1 + (int)4 * rand() / (RAND_MAX + 1);        b = 1 + (int)4 * rand() / (RAND_MAX + 1);        if(!game2048[a][b])        {            game2048[a][b] = 2;            break;        }    }}void view(){    for(int m = 1;m <= 4;m++)    {        cout << endl;        for(int n = 1;n <= 4;n++)        {            int num = 5;            cout << game2048[m][n];            for(int i = game2048[m][n]/10;i > 0;i /= 10)                num--;            while(num--)                cout << ' ';        }        cout << endl;    }}void init(){    memset(game2048, 0, sizeof(game2048));    getblock();    view();}int main(){    char key;    init();    while(cin >> key)    {        if(move_(key))           getblock();        view();        if(!over())        {            cout << "Lost" << endl;            init();        }    }    return 0;}

最后一个版本啦,增加了计分和控制台的清屏,无需回车就能控制方块的运动。

被人吐槽说论UI的重要性。。。


#include <iostream>#include <ctime>#include <cstdlib>#include <cstring>#include <conio.h>#include<windows.h>using namespace std;int game2048[6][6];int score = 0;bool move_(char r)//w a s d{    bool flag = false;    int a[25],b[25],c[25],d[25];    r -= 97;    if(r != 22 && r != 18 && r != 0 && r != 3)        return false;    for(int num = 0;num < 2;num++)    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)        {            a[22] = n;a[18] = 5 - n;a[0] = m;a[3] = 5 - m;            b[22] = m;b[18] = 5 - m;b[0] = n;b[3] = 5 - n;            if(num && game2048[a[r]][b[r]] != 0) continue;  //w            for(int i = n+1;i <= 4;i++)            {                c[22] = i;c[18] = 5 - i;c[0] = m;c[3] = 5 - m;                d[22] = m;d[18] = 5 - m;d[0] = i;d[3] = 5 - i;                if(!num && game2048[a[r]][b[r]] && game2048[a[r]][b[r]] == game2048[c[r]][d[r]]) //w                {                    game2048[a[r]][b[r]] *= 2;                    game2048[c[r]][d[r]] = 0;                    flag = true;//这里添加计分                    score += game2048[a[r]][b[r]];                    break;                }                if(!num && game2048[c[r]][d[r]] != 0) break;                if(num && game2048[c[r]][d[r]] != 0)                {                    game2048[a[r]][b[r]] = game2048[c[r]][d[r]] ;                    game2048[c[r]][d[r]] = 0;                    flag = true;                    break;                }            }        }    return flag;}bool over(){    for(int m = 1;m <= 4;m++)        for(int n = 1;n <= 4;n++)            if(game2048[n][m] == 0 || game2048[n][m] == game2048[n+1][m] || game2048[m][n] == game2048[m][n+1]) //w                return true;    return false;}void getblock(){    int a,b;    srand(unsigned(time(0)));    while(1)    {        a = 1 + (int)4 * rand() / (RAND_MAX + 1);        b = 1 + (int)4 * rand() / (RAND_MAX + 1);        if(!game2048[a][b])        {            game2048[a][b] = 2;            break;        }    }}void view(){    system("cls");    cout << "Yours score: " << score << endl;    for(int m = 1;m <= 4;m++)    {        cout << endl;        for(int n = 1;n <= 4;n++)        {            int num = 5;            cout << game2048[m][n];            for(int i = game2048[m][n]/10;i > 0;i /= 10)                num--;            while(num--)                cout << ' ';        }        cout << endl;    }}void init(){    score = 0;    memset(game2048, 0, sizeof(game2048));    getblock();    view();}int main(){    char key;    init();    while(1)    {        key = _getch();        if(move_(key))           getblock();        view();        if(!over())        {            cout << "You final score is : " << score << endl << endl;            cout << "Press 2 to restare......" << endl;            while(cin >> key)                if(key == '2')                    init();        }    }    return 0;}



                                             
1 0