手把手教你编写C++控制台小游戏 : 2048 (正在施工)

原创不易,请勿抄袭
作者联系方式 : QQ:993678929

文章目录

      • 0.游戏界面展示
      • 1. 编写思路
      • 2. 界面绘制
      • 3.键盘控制
      • 4.数字的生成与合并
      • 5.游戏结束判定
      • #.完整代码


0.游戏界面展示

手把手教你编写C++控制台小游戏 : 2048 (正在施工)_第1张图片
手把手教你编写C++控制台小游戏 : 2048 (正在施工)_第2张图片


1. 编写思路

动手写代码之前,先设计好要做哪些部分。下面所述的是我个人的思路,如果有更好的思路欢迎探讨。

我们肯定能想到的是游戏界面的绘制,游戏的键盘控制,游戏逻辑。

游戏逻辑中包括数字的生成,合并,分数计算,以及游戏结束的判断。

棋盘是 4 x 4 的,且只需要显示数字,这可以用一个int数组来表示。

游戏过程中用户移动之后生成数字,需要注意这个次序

合并的顺序是按移动的逆方向来合并,而且一次移动只会合并一次。
比如有一行是4 2 2 2
那么向右划(移动)的结果是0 4 2 4
向左划的结果是4 4 2 0

不同的数字可以使用不同的颜色来显示方便辨识,提高玩家的游戏体验

后续还可以推出联网天梯排行榜


2. 界面绘制


3.键盘控制


4.数字的生成与合并


5.游戏结束判定


#.完整代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

const int W = 4;
const int H = 4;
int board[H][W];  //H:高  W:宽   board[2][1] 表示第二行第二个
int score;
const int keymap[4] = {
     72,80,75,77}; //依次为上下左右
const int dx[4] = {
      -1,1,0,0 };  //依次对应上下左右
const int dy[4] = {
       0,0,-1,1 };
                                        
                    //2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384  (超过这个数字的从头开始)
const int color[] = {
     15,8,6,14, 4, 2,12 ,5,  13, 3,   10,  11,  1,   9, };

/*  颜色说明:
 * 0 = 黑色       8 = 灰色
 * 1 = 蓝色       9 = 淡蓝色
 * 2 = 绿色       10 = 淡绿色
 * 3 = 浅绿色     11 = 淡浅绿色
 * 4 = 红色       12 = 淡红色
 * 5 = 紫色       13 = 淡紫色
 * 6 = 黄色       14 = 淡黄色
 * 7 = 白色       15 = 亮白色
 */
bool judge()   //0:ok  1:gameover
{
     
    bool flag = true;
    for (int i = 0; i < H; i++)
        for (int j = 0; j < W; j++)
            if (board[i][j] == 0)
            {
     
                flag = false;
            }
    return flag;
}

void Set_Color(int color)
{
     
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
}

void display()
{
     
    system("cls");
    for (int i = 0; i < H; i++)
    {
     
        for (int j = 0; j < W; j++)
        {
     
            if (board[i][j] == 0) printf("     ");
            else {
     
                Set_Color(color[ (int)log2(board[i][j])-1 ]); //根据数字设置颜色
                printf("%-5d", board[i][j]);
                Set_Color(7);
            }if (j < 3) putchar('|');
        }
        putchar('\n');
        for (int r = 0; r < 23; r++) putchar('-');
        putchar('\n');
    }
    printf("当前得分: %d",score);
}


void move(int dir)
{
     
    int x=0,y=0;
    if (dy[dir]) //水平移动
    {
     
        for (int i = 0; i < H; i++) //遍历每一行
        {
     
            y = (dy[dir] == 1) ? 3 : 0;
            int j = y;
            int top = y;
            while (abs(j - y) < 3) {
     
                j -= dy[dir];
                if (board[i][top] == 0 &&board[i][j]!=0)
                {
     
                    board[i][top] = board[i][j];
                    board[i][j] = 0;
                }
                else if (board[i][top]!=0 && board[i][j]==board[i][top])
                {
     
                    board[i][top] *= 2;
                    score += board[i][top];
                    board[i][j] = 0;
                }
                else if (board[i][top] * board[i][j] != 0 && board[i][top] != board[i][j])
                {
     
                    top -= dy[dir];
                    if (j != top)
                    {
     
                        board[i][top] = board[i][j];
                        board[i][j] = 0;
                    }
                }
            }

        }
    
    }
    else if (dx[dir]) //垂直移动
    {
     
        for (int j = 0; j < W; j++) //遍历每一列
        {
     
            x = (dx[dir] == 1) ? 3 : 0;
            int i = x;
            int top = x;
            while (abs(i - x) < 3) {
     
                i -= dx[dir];
                if (board[top][j] == 0 && board[i][j] != 0)
                {
     
                    board[top][j] = board[i][j];
                    board[i][j] = 0;
                }
                else if (board[top][j] != 0 && board[i][j] == board[top][j])
                {
     
                    board[top][j] *= 2;
                    score += board[top][j];
                    board[i][j] = 0;
                }
                else if (board[top][j] * board[i][j] != 0 && board[top][j] != board[i][j])
                {
     
                    top -= dx[dir];
                    if (i != top)
                    {
     
                        board[top][j] = board[i][j];
                        board[i][j] = 0;
                    }
                }
            }

        }

    }
        
}

void newNum()
{
     
    int flag = 0;
    int n = 0;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            if (board[i][j] == 0 || board[i][j] == 2)
                n++;
    
    int end = rand() % n;
    int t = 0;
    for (int i = 0; i < 4 && !flag; i++)
        for (int j = 0; j < 4 && !flag; j++)
        {
     
            if (board[i][j] == 0)
            {
     
                if (t == end) {
     
                    board[i][j] += 2;
                    flag = 1;
                }
                else t++;
                
            }
        }
}

void play()
{
     
    newNum();
    display();
    while (!judge())
    {
     
        
        int ch = _getch();
        for (int i = 0; i < 4; i++)
            if (ch == keymap[i]) {
     
            move(i); 
            newNum();
            display();
        }
        Sleep(10);     //防止连按
    }
    system("cls");
    printf("\n\n\tGAME OVER!");
    printf("\n\n\tSCORE:%d",score);

}

void init()
{
     
    system("mode con:cols=24 lines=10");
    memset(board, 0, sizeof(board));
    score = 0;
}

int main()
{
     
    init();
    play();
    getchar();
}

你可能感兴趣的:(游戏,C/C++)