命令行之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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BZOJ 2049: [Sdoi2008]Cave 洞穴勘測 LCT[通俗易懂]

    BZOJ 2049: [Sdoi2008]Cave 洞穴勘測 LCT

    2022年2月3日
    52
  • 视频监控传输设备_网络视频监控平台

    视频监控传输设备_网络视频监控平台高清视频传输系统传输系统是整个社会治安视频监控网络的数据传送平台,承担着平安城市从接入点中心以之间的视频数据传输重担,是搭建整个监控网络的血脉,因此,治安视频监控网络传输系统将采用全数字化的计算机网络传输系统,从监控点的接入到监控中心的数据汇聚完全采用全数字化通道,整个传输网络结构主干万兆汇聚,千兆到监控点接入,户外接入层交换机选用宽温宽压工业级交换机产品,保证视频数据的无阻塞、无延迟传输以及与原…

    2022年10月4日
    0
  • 独热编码(One-Hot Encoding)介绍及实现

    独热编码(One-Hot Encoding)介绍及实现一、介绍One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。独热编码是利用0和1表示一些参数,使用N位状态寄存器来对N个状态进行编码。例如:参考数字手写体识别中:如数字字体识别0~9中,6的独热编码为0000001000自然状态码为:000,001,010,011,100,101…

    2022年10月22日
    0
  • Android ConstraintLayout 约束布局详解

    Android ConstraintLayout 约束布局详解

    2021年10月1日
    40
  • linux怎么查看root权限,linux 查看当前用户是否有root权限490

    linux怎么查看root权限,linux 查看当前用户是否有root权限490匿名用户1级2016-08-13回答ssh远程控制程序。sudo提权命令。你要不会用请不要尝试。配置sudo的配置文件在/etc/sudoers里面,一般通过visudo命令来安全打开编辑。查看/etc/sudoers的用法可以使用命令:man5sudoers。在/etc/sudoers文件里面主要包括这两部分:1.别名设置别名主要包括这几种:User_Alias,Host_Alia…

    2022年5月23日
    617
  • pycharm彻底卸载_pycharm如何更新

    pycharm彻底卸载_pycharm如何更新用过Windows系统的朋友应该都体验过被系统强制更新的烦恼,经常玩电脑玩着玩着就觉得网速很慢或者电脑变卡了,打开设置一看,发现是Windows系统正在更新。然后当关机的时候,选项变成了”更新并关机”和”更新并重启”,但是它更新的速度还很慢。更新完成之后打开电脑,很多人也都遇到过蓝屏或者卡死机的情况,至于原因,不得而知。实际上系统设置和控制面板里面都有暂停更新选项,但是那个时效只有一个月,之后又会…

    2022年8月25日
    3

发表回复

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

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