用C++写2048

内容目录

完全用c++写的2048 可以用上下左右控制 有闪动效果哦 棒棒哒

#include <iostream>
#include <cstdio>
#include <time.h>
#include <windows.h>
using namespace std;

/***************************/
#define LINE 4
#define FLASH 1
#define zero {0}
using namespace std ;

int mat[LINE + 2][LINE + 2];
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
void output()
{
    system("CLS");
    printf("*********************\n");
    printf("****2048 by Sky-J****\n");
    printf("*********************\n");
    for (int i = 1; i <= LINE; i++)
    {
        printf("%2c%c%c ", '-', '-', '-');
    }
    printf("\n");
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            if (mat[i][j])
                printf("%4d ", mat[i][j]);
            else
                printf("     ");
        }
        printf("\n");
    }
    for (int i = 1; i <= LINE; i++)
    {
        printf("%2c%c%c ", '-', '-', '-');
    }
    printf("\n");
    printf("*********************\n");
}
bool checkLose()
{
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            if (mat[i][j] == 0)
            {
                return false;
            }
        }
    }
    int x, y;
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            for (int k = 0; k < 4; k++)
            {
                x = i + dir[k][0];
                y = j + dir[k][1];
                if (x < 1 || y < 1 || x > LINE || y > LINE)
                    continue;
                if (mat[x][y] == mat[i][j])
                    return false;
            }
        }
    }
    return true;
}
void addnum()
{
    int num = 0;
    int empty[LINE * LINE][2];
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            if (mat[i][j] == 0)
            {
                empty[num][0] = i;
                empty[num++][1] = j;
            }
        }
    }
    if (num != 0)
    {
        int x = rand() % num;
        mat[empty[x][0]][empty[x][1]] = (rand() % 10 == 0 ? 4 : 2);
    }
    return ;
}
void init()
{
    srand(time(NULL) * 100);
    memset(mat, -1, sizeof(mat));
    // int bug[10][10] =
    // {
    //     {0},
    //     {0, 4  , 32 ,   4  ,  2},
    //     {0, 16 ,   4,   64 ,  16},
    //     {0, 2  ,  8 ,  16  ,  4},
    //     {0, 2  ,  4 , 128  ,  8},
    // };
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            mat[i][j] = 0;
        }
    }
    // output();
    // _sleep(10000);
    addnum();
    addnum();
}
void flashmat(int i, int j)
{
    int t = mat[i][j];
    mat[i][j] = 0;
    output();
    mat[i][j] = t;
    output();
    mat[i][j] = 0;
    output();
    mat[i][j] = t;
}
void up()
{
    bool mark[LINE + 1][LINE + 1] = zero;

    bool hasmove = false;
    for (int j = 1; j <= LINE; j++)
    {
        for (int i = 1; i <= LINE; i++)
        {
            if (mat[i][j] != 0)
            {
                for (int k = i - 1; k >= 0; k--)
                {
                    if (mat[k][j] != 0)
                    {
                        if (mat[k][j] == mat[i][j] && !mark[k][j])
                        {
                            mat[k][j] *= 2;
                            mark[k][j] = 1;
                            mat[i][j] = 0;
                            hasmove = true;
                            if (FLASH)
                                flashmat(k, j);
                        }
                        else if (k + 1 != i)
                        {
                            mat[k + 1][j] = mat[i][j];
                            mat[i][j] = 0;
                            hasmove = true;
                        }
                        break;
                    }
                }
            }
        }
    }
    if (hasmove)
        addnum();
    return ;
}
void down()
{
    bool mark[LINE + 1][LINE + 1] = zero;
    bool hasmove = false;
    for (int j = 1; j <= LINE; j++)
    {
        for (int i = LINE; i >= 1; i--)
        {
            if (mat[i][j] != 0)
            {
                for (int k = i + 1; k <= LINE + 1; k++)
                {
                    if (mat[k][j] != 0)
                    {
                        if (mat[k][j] == mat[i][j] && !mark[k][j])
                        {
                            mat[k][j] *= 2;
                            mark[k][j] = 1;
                            mat[i][j] = 0;
                            hasmove = true;
                            if (FLASH)
                                flashmat(k, j);
                        }
                        else if (k - 1 != i)
                        {
                            mat[k - 1][j] =  mat[i][j];
                            mat[i][j] = 0;
                            hasmove = true;
                        }
                        break;
                    }
                }
            }
        }
    }
    if (hasmove)
        addnum();
    return ;
}
void left()
{
    bool mark[LINE + 1][LINE + 1] = zero;
    bool hasmove = false;
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = 1; j <= LINE; j++)
        {
            if (mat[i][j] != 0)
            {
                for (int k = j - 1; k >= 0; k--)
                {
                    if (mat[i][k] != 0)
                    {
                        if (mat[i][k] == mat[i][j] && !mark[i][k])
                        {
                            mat[i][k] *= 2;
                            mark[i][k] = 1;
                            mat[i][j] = 0;
                            hasmove = true;
                            if (FLASH)
                                flashmat(i, k);
                        }
                        else if (k + 1 != j)
                        {
                            mat[i][k + 1] = mat[i][j];
                            mat[i][j] = 0;
                            hasmove = true;
                        }
                        break;
                    }
                }
            }
        }
    }
    if (hasmove)
        addnum();
    return ;
}
void right()
{
    bool mark[LINE + 1][LINE + 1] = zero;
    bool hasmove = false;
    for (int i = 1; i <= LINE; i++)
    {
        for (int j = LINE; j >= 1; j--)
        {
            if (mat[i][j] != 0)
            {
                for (int k = j + 1; k <= LINE + 1; k++)
                {
                    if (mat[i][k] != 0)
                    {
                        if (mat[i][k] == mat[i][j] && !mark[i][k])
                        {
                            mat[i][k] *= 2;
                            mark[i][k] = 1;
                            mat[i][j] = 0;
                            hasmove = true;
                            if (FLASH)
                                flashmat(i, k);
                        }
                        else if (k - 1 != j)
                        {
                            mat[i][k - 1] =   mat[i][j] ;
                            mat[i][j] = 0;
                            hasmove = true;
                        }
                        break;
                    }
                }
            }
        }
    }
    if (hasmove)
        addnum();
    return ;
}

bool move(int dir)
{
    int sleeptime = 0;
    _sleep(sleeptime);
    if (dir == 0)
    {
        up();
        output();
        printf("up\n");
    }
    else if (dir == 1)
    {
        down();
        output();
        printf("down\n");

    }
    else if (dir == 2)
    {
        left();
        output();
        printf("left\n");
    }
    else if (dir == 3)
    {
        right();
        output();
        printf("right\n");
    }
    if (checkLose())
    {
        printf("lose~~\n");
        return false;
    }
    return true;
}
/****************************/



//钩子过程
LRESULT CALLBACK _HookProc(int, WPARAM, LPARAM);

static HANDLE handle;  //控制台句柄
//控制台信息结构
static CONSOLE_SCREEN_BUFFER_INFO info ;

int main()
{

    /*************************/
    init();
    output();
    /*************************/

    //获取输出缓冲区句柄
    handle = GetStdHandle(STD_OUTPUT_HANDLE);
    //获取相关信息(主要是缓冲区大小)
    GetConsoleScreenBufferInfo( handle, &info );

    CONSOLE_CURSOR_INFO cursor;           //光标结构
    cursor.dwSize = 10;
    cursor.bVisible = 0;                  //0为隐藏光标
    SetConsoleCursorInfo(handle, &cursor);//设置隐藏光标函数

    HHOOK hook;
    MSG msg;
    //相应的钩子有相应的过程函数MSDN中可看,安装键盘钩子
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, _HookProc, GetModuleHandle(NULL), 0);
    while (1)
    {
        if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) //循环接收消息
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    UnhookWindowsHookEx( hook );    //卸载钩子
    return 0;
}

LRESULT CALLBACK _HookProc(int message, WPARAM wParam, LPARAM lParam)
{
    //判断是否弹起按键消息
    if ( wParam == WM_KEYUP)
    {
        bool state = true;
        switch (((LPKBDLLHOOKSTRUCT) lParam)->vkCode) //lParam:指向一个结构
        {
        //按下上键
        case VK_UP:
            move(0);
            break;
        //按下下键
        case VK_DOWN:
            move(1);
            break;
        //按下左键
        case VK_LEFT:
            move(2);
            break;
        //按下右键
        case VK_RIGHT:
            move(3);
            break;
        //按下空格和回车键
        case VK_SPACE:
        case VK_RETURN:
            break;
        }
    }
    //消息传给下个钩子
    return CallNextHookEx ( NULL, message, wParam, lParam );
}

One thought on “用C++写2048”

  1. 益群网:逆向网赚,坐等收钱

    【会员福利】

    优势一:静态分红,免费签到就有钱,每日最高一百元

    优势二:十级提成,逆向网赚,什么不干,照样有钱赚

    优势三:营销软件,无限下载,每日增加,且永久更新

    【自动下滑】

    每人限定五个下线,多推荐的自动下滑到一级下线名下

    从而成为推荐者的二级下线,以此类推,直到十级

    不论这个下线是谁直接推荐的,你都有提成

    你直接推荐的每个你提成5元,非直接推荐的每个你提成0.5元

    总之,多干多赚,什么都不干也照样赚

    【注册网址】

    http://www.403867.36u.win/

发表回复