c/c++ 2048 120行左右~

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




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值