命令行之2048

命令行之2048

大家好,又见面了,我是全栈君。

命令行之2048
2048挺火的游戏,在命令行实现是什么样呢?小尝试了下,这里感谢css大神给debug,还有就是游戏空格处採用特殊字符,因此程序在linux下跑可能会出现乱码,能够手动调整

游戏截图:

命令行之2048


命令行之2048


命令行之2048


代码:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <conio.h>
#include <cstdlib>
#include <windows.h>
#define Coord_x 15
#define Coord_y 15
#define Height  20
#define Width  16

using namespace std;

class Game
{
    public:
        int score;
        int num[5][5];

    public:
        Game(int s = 0);
        bool control(char ch);
        void init();
        void make();
}G;

class Console
{
    public:
        void gotoxy(HANDLE hOut, int x, int y);
        void enter_game();
        void window();
        void show();
        void start_game();
        void end_game();

    friend class Game;
}C;

Game::Game(int s)
{
    score = s;
    memset(num,0,sizeof(num));
}

void Console::gotoxy(HANDLE hOut, int x, int y)
{
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hOut, pos);
}

void Console::enter_game()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    system("title 2048 by Tc");
    gotoxy(hOut,Coord_x+Width-1,Coord_y-12);
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
    cout<<"  欢迎进入 2 0 4 8";
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN);
    gotoxy(hOut,Coord_x+Width-25,Coord_y-8);
    cout << "        *  *           *  *            *        *        *  *         " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-7);
    cout << "     *        *     *        *        *        *       *      *            " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-6);
    cout << "    *        *     *          *      *        *         *    *            " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-5);
    cout << "           *       *          *     *        *             *                     " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-4);
    cout << "         *         *          *    *  *  *  *  * *      *      *     " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-3);
    cout << "       *           *          *            *          *          *                 " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-2);
    cout << "     *              *        *            *            *        *               " << endl;
    gotoxy(hOut,Coord_x+Width-25,Coord_y-1);
    cout << "  *  *  *  *  *        *  *              *                *  *      " << endl;
    gotoxy(hOut,Coord_x+Width+1,Coord_y+3);
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED);
    cout << "按回车键进入游戏\n"<< endl;;
    while(1)
    {
        char c;
        if(kbhit())
        {
            c = getch();
            if(c == 13)
            {
                system("CLS");
                C.start_game();
            }
        }
    }
    if(getch() == 27)
    {
        C.end_game();
    }
}


void Console::end_game()
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    system("CLS");
    gotoxy(hOut,Coord_x+Width+5,Coord_y-10);
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED);
    cout << "游戏结束";
    gotoxy(hOut,Coord_x+Width+5,Coord_y-7);
    cout << "终于得分 : " << G.score << endl;
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
    exit(0);
}

void Console::window()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    system("title 2 0 4 8 by Tc");
    system("color 0C");
    gotoxy(hOut,Coord_x+Width-2,Coord_y-13);
    cout << " *******";
    gotoxy(hOut,Coord_x+Width-2,Coord_y-12);
    cout << " 2 0 4 8";
    gotoxy(hOut,Coord_x+Width-2,Coord_y-11);
    cout << " *******";
    gotoxy(hOut,Coord_x+2*Width+3,Coord_y+6);
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
    gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 8);
    cout << "w键 : 向上  " << "s键 : 向下";
    gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 6);
    cout << "a键 : 向左  " << "d键 : 向右";
    gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 4);
    cout << "Esc :退出";
}

void Console :: show()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED);
    gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10);
    cout << "                   ";
    gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10);
    cout << "分数 : " << G.score;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            if(G.num[i][j] != 0)
            {
                cout << " ";
                SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED);
                gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4);
                cout << G.num[i][j];
            }
            else
            {
                cout << " ";
                SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN);
                gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4);
                cout << "■";
            }
        }
        cout << endl;
    }

}

bool Game::control(char dir)
{
    int num2[4][4];
    for(int n = 0; n < 4; n++)
        for(int m = 0; m < 4; m++)
            num2[n][m] = num[n][m];
    bool IsMove = false;
    if(dir == 'w' || dir == 'W')
    {
        for(int j = 0; j < 4; j++)
        {
            int ii = 0, temp = 5;
            for(int i = 0; i < 4; i++)
            {
                if(num[i][j] == 0)
                    continue;
                else
                {
                    temp = i;
                    break;
                }
            }
            if(temp == 5)
                continue;
            num[ii][j] = num[temp][j];
            for(int i = temp + 1; i < 4; i++)
            {
                if(num[i][j] == 0)
                    continue;
                else if(num[i][j] != 0 && num[i][j] == num[ii][j])
                {
                    num[ii][j] *= 2;
                    G.score += num[ii][j];
                    num[i][j] = 0;
                }
                else if(num[i][j] != 0 && num[i][j] != num[ii][j])
                    num[++ii][j] = num[i][j];
            }
            while(ii < 4)
                num[++ii][j] = 0;
            for(int n = 0; n < 4; n++)
            {
                for(int m = 0; m < 4; m++)
                {
                    if(num2[n][m] != num[n][m])
                    {
                        IsMove = true;
                        break;
                    }
                }
                if(IsMove)
                    break;
            }
        }
        return IsMove;
    }
    else if(dir == 's' || dir == 'S')
    {
        for(int j = 0; j < 4; j++)
        {
            int ii = 3, temp = 5;
            for(int i = 3; i >= 0; i--)
            {
                if(num[i][j] == 0)
                    continue;
                else
                {
                    temp = i;
                    break;
                }
            }
            if(temp == 5)
                continue;
            num[ii][j] = num[temp][j];
            for(int i = temp - 1; i >= 0; i--)
            {
                if(num[i][j] == 0)
                    continue;
                else if(num[i][j] != 0 && num[i][j] == num[ii][j])
                {
                    num[ii][j] *= 2;
                    G.score += num[ii][j];
                    num[i][j] = 0;
                }
                else if(num[i][j] != 0 && num[i][j] != num[ii][j])
                    num[--ii][j] = num[i][j];
            }
            while(ii >= 0)
                num[--ii][j] = 0;
            for(int n = 0; n < 4; n++)
            {
                for(int m = 0; m < 4; m++)
                {
                    if(num2[n][m] != num[n][m])
                    {
                        IsMove = true;
                        break;
                    }
                }
                if(IsMove)
                    break;
            }
        }
        return IsMove;
    }
    else if(dir == 'a' || dir == 'A')
    {
        for(int i = 0; i < 4; i++)
        {
            int jj = 0, temp = 5;
            for(int j = 0; j < 4; j++)
            {
                if(num[i][j] == 0)
                    continue;
                else
                {
                    temp = j;
                    break;
                }
            }
            if(temp == 5)
                continue;
            num[i][jj] = num[i][temp];
            for(int j = temp + 1; j < 4; j++)
            {
                if(num[i][j] == 0)
                    continue;
                else if(num[i][j] != 0 && num[i][j] == num[i][jj])
                {

                    num[i][jj] *= 2;
                    G.score += num[i][jj];
                    num[i][j] = 0;
                }
                else if(num[i][j] != 0 && num[i][j] != num[i][jj])
                {

                    num[i][++jj] = num[i][j];
                }
            }
            while(jj < 4)
            {
                num[i][++jj] = 0;
            }
            for(int n = 0; n < 4; n++)
            {
                for(int m = 0; m < 4; m++)
                {
                    if(num2[n][m] != num[n][m])
                    {
                        IsMove = true;
                        break;
                    }
                }
                if(IsMove)
                    break;
            }
        }
        return IsMove;
    }
    else if(dir == 'd' || dir == 'D')
    {
        for(int i = 0; i < 4; i++)
        {
            int jj = 3, temp = 5;
            for(int j = 3; j >= 0; j--)
            {
                if(num[i][j] == 0)
                    continue;
                else
                {
                    temp = j;
                    break;
                }
            }
            if(temp == 5)
                continue;
            num[i][jj] = num[i][temp];
            for(int j = temp - 1; j >= 0 && jj > 0; j--)
            {
                if(num[i][j] == 0)
                    continue;
                else if(num[i][j] != 0 && num[i][j] == num[i][jj])
                {
                    num[i][jj] *= 2;
                    G.score += num[i][jj];
                    num[i][j] = 0;
                }
                else if(num[i][j] != 0 && num[i][j] != num[i][jj])
                    num[i][--jj] = num[i][j];
            }
            while(jj > 0)
                num[i][--jj] = 0;
            for(int n = 0; n < 4; n++)
            {
                for(int m = 0; m < 4; m++)
                {
                    if(num2[n][m] != num[n][m])
                    {
                        IsMove = true;
                        break;
                    }
                }
                if(IsMove)
                    break;
            }
        }
        return IsMove;
    }
    return false;
}

void Game :: init()
{
    srand((unsigned int) time(NULL));
    int x = rand() % 4;
    int y = rand() % 4;
    G.num[x][y] = 2;
    int xx = rand() % 4;
    int yy = rand() % 4;
    while(1)
    {
        if(xx != x && yy != y)
        {
            G.num[xx][yy] = 2;
            break;
        }
        xx = rand() % 4;
        yy = rand() % 4;
    }
}

void Game :: make()
{
    int count = 0;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            if(num[i][j])
                count ++;
        }
    }
    if(count == 16)
        C.end_game();
    int xx = rand() % 4;
    int yy = rand() % 4;
    while(1)
    {
        if(num[xx][yy] == 0)
        {
            num[xx][yy] = 2;
            break;
        }
        xx = rand() % 4;
        yy = rand() % 4;
    }
}

void Console :: start_game()
{
    G.init();
    window();
    show();
    char dir;
    while(true)
    {
        bool flag = false;
        dir = getch();
        if(dir == 27)
            end_game();
        if(dir == 'w' || dir == 'W' || dir == 'a' || dir == 'A' || dir == 's' || dir == 'S' || dir == 'D' || dir == 'd')
        {
            flag = G.control(dir);
            window();
            if(flag)
                G.make();
            show();
        }
    }
}

int main()
{
    C.enter_game();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116044.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot事务处理[通俗易懂]

    Springboot事务处理[通俗易懂]采用Aop对项目进行全局异常事务处理@Aspect@ConfigurationpublicclassTransactionAdviceConfig{ privatestaticfinalStringAOP_POINTCUT_EXPRESSION=”execution(*demo.service.impl.*.*(..))”; @Autowired privatePlatformTransactionManagertransactionManager; @Be

    2022年6月8日
    38
  • 下载文件总结

    下载文件总结

    2021年9月20日
    70
  • linux命令mysql启动,在linux中启动mysql服务的命令

    linux命令mysql启动,在linux中启动mysql服务的命令用reboot命令重启linux服务器之后会导致mysql服务终止,也就是mysql服务没有启动。必须要重启mysql服务,否则启动jboss时会报有关数据库mysql方面的错误。命令如下:第一步:安装mysql,设置mysql的安装路径:mysql_install_db–user=mysql–datadir=/home/ems/tmp/mysql/data命令说明:上面的db-use…

    2022年5月13日
    41
  • 给Android程序员的一些面试建议「建议收藏」

    给Android程序员的一些面试建议「建议收藏」前言应大家的邀请,写一篇关于Android面试相关的博客,需要说明的是本文只针对Android应用开发,不针对rom开发以及逆向工程。我想面试对于程序员来说是很重要的一件事件,面试结果的好坏直接决定了能否进入某个公司以及以什么级别和待遇进入某个公司。我参加面试的经验并不多,但是以面试官的身份面试别人倒是有很多次,所以我可以结合这些经验来介绍下如何更好地把握一个面试。什么是合适的候选者在介绍如何面试之

    2022年6月14日
    104
  • bootstrap日期时间控件

    bootstrap日期时间控件datetime控件Bootstrap的日期时间控件,使用非常的简单。首先,添加日期时间控件的引用@*datetime控件*@

    2022年5月23日
    93
  • laravel artisan常用命令[通俗易懂]

    laravel artisan常用命令[通俗易懂]laravel artisan常用命令

    2022年4月24日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号