2048游戏开局就赢了

img


开局就2048怎么改,以及玩不动的画面和提示成功的画面



// 2048game.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<graphics.h>//easyx图形库头文件
#define MAX_SIZE 4//每一行格子数
#define GRID_WIDTH 100//格子宽数
#define INTERVAL 15//格子之间的间隔
#define WIN_SIZE MAX_SIZE*GRID_WIDTH+(MAX_SIZE+1)*INTERVAL//窗口宽度

#include <iostream>

//枚举每个数字的颜色
enum Color 
{
    //没有数字的地方是0
    zero   = RGB(205, 193, 180), //0的颜色
    twoTo1 = RGB(238, 228, 218), //2的颜色
    twoTo2 = RGB(237, 224, 200), //4的颜色
    twoTo3 = RGB(242, 177, 121), //8的颜色
    twoTo4 = RGB(245, 149, 99), //16的颜色
    twoTo5 = RGB(246, 124, 95), //32的颜色
    twoTo6 = RGB(246, 94, 59), //64的颜色
    twoTo7 = RGB(242, 177, 121), //128的颜色
    twoTo8 = RGB(237, 204, 97), //256的颜色
    twoTo9 = RGB(255, 0, 128), //512的颜色
    twoTo10 = RGB(145, 0, 72), //1024的颜色
    twoTo11 = RGB(242, 17, 158), //2048的颜色
    bk      = RGB(187, 173, 160), //背景颜色

  
};
//把颜色和数据建立联系
Color arr[13] = { zero, twoTo1,twoTo2,twoTo3,twoTo4,twoTo5,twoTo6,twoTo7,twoTo8,twoTo9,twoTo10,twoTo11,bk };
int num[12] = { 0, 2 ,4 ,8,16,32,64,128,256,512,1024,2048 };
//0 2 4 8 16 32 64 128 256 512 1024 2048
int map[MAX_SIZE][MAX_SIZE];//存储数据 //格子数值
POINT pos[MAX_SIZE][MAX_SIZE];//结构体//格子坐标
char usrkey = 0;//接受按键消息

//随机生成2/4
int RandTwoFour()
{
    if (rand() % 10 == 0)//三分之一概率出现4
    {
        return 4;
    }
    else {
        return 2;//三分之二概率出现2
    }
}

//在随机位置产生一个数
void CreateNumber()
{
    while (1) 
    {
        //随机数 rand() 随机获得一个整数   0~上万
        int x = rand() % MAX_SIZE;//0~3
        int y = rand() % MAX_SIZE;//0~3
        if (map[x][y] == 0) 
        {
            map[x][y] = RandTwoFour();
            break;//产生一个就退出
        }
    }
}

void GameInit()
{
    //初始化数组为0
    for (int i = 0; i < MAX_SIZE; i++) 
    {
        for (int k = 0; k < MAX_SIZE; k++)
        {
            map[i][k] = 0;
        }
    }
    map[0][0] = 2048;
    //初始化每个格子的坐标,左上角
    for (int i = 0; i < MAX_SIZE; i++)//y
    {
        for (int k = 0; k < MAX_SIZE; k++)//x
        {
            //求出每一个格子的x,y
            pos[i][k].x = (k * GRID_WIDTH) + ((k + 1) * INTERVAL);//k个格子宽度+k+1个间隔
            pos[i][k].y = (i * GRID_WIDTH) + ((i + 1) * INTERVAL);
        }
    }
    //开始游戏时,随机产生两个数字
    CreateNumber();
    CreateNumber();

}
//游戏绘制
void GameDraw() 
{
    //设置背景颜色
    setbkcolor(Color::bk);
    //设置颜色之后需要,清屏(原本的颜色是黑色的,设置的颜色,被覆盖了)
    cleardevice();//刷新一下,绘图设备
    for (int i = 0; i < MAX_SIZE; i++)//y
    {
        for (int k = 0; k < MAX_SIZE; k++)//x
        {
            for (int q = 0; q < 13; q++) 
            {
                //判断数组是哪一个数据
                if (map[i][k] == num[q])
                {
                    DWORD tempcolor = arr[q];
                    setfillcolor(tempcolor );
                    setlinecolor(tempcolor);
                    fillrectangle(pos[i][k].x, pos[i][k].y, pos[i][k].x + GRID_WIDTH, pos[i][k].y + GRID_WIDTH);
                    if (num[q] != 0)
                    {
                        //绘制数字
                        //设置文字大小
                        char number[5] = "";
                        sprintf(number, "%d", num[q]);
                        setbkmode(TRANSPARENT);
                        settextcolor(RGB(119, 110, 101));
                        settextstyle(50, 0, "黑体");
                        int temp = textwidth(number);//获取字符
                        //计算第一个字开始的位置 让数字在格子内居中
                        temp = (GRID_WIDTH - temp)/2;
                        //int 整数
                        outtextxy(pos[i][k].x+temp, pos[i][k].y+25, number);

                    }
                    break;//找到了对应的值就,换下一个继续找
                }
            }         
        }
    }
}
//移动
void moveup()
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        int temp = 0;
        for (int begin = 1; begin < MAX_SIZE; begin++)
        {
            if (map[begin][i] != 0)
            {
                if (map[temp][i] == 0)
                {
                    map[temp][i] = map[begin][i];
                    map[begin][i] = 0;
                }
                else if (map[temp][i] == map[begin][i])
                {
                    map[temp][i] += map[begin][i];
                    map[begin][i] = 0;
                    temp++;
                }
                else
                {
                    map[temp+1][i]= map[begin][i];
                    if (temp + 1 != begin) 
                    {
                        map[begin][i] = 0;
                    }
                    temp++;
                }
            }
        }
    }
    
}
void movedown()
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        int temp = MAX_SIZE - 1;
        for (int begin = MAX_SIZE - 2; begin >= 0; begin--)
        {
            if (map[begin][i] != 0)
            {
                if (map[temp][i] == 0)
                {
                    map[temp][i] = map[begin][i];
                    map[begin][i] = 0;
                   
                }
                else if (map[temp][i] == map[begin][i])
                {
                    map[temp][i] += map[begin][i];
                    map[begin][i] = 0;
                    temp--;
                 
                }
                else
                {
                    map[temp - 1][i] = map[begin][i];
                    if ((temp - 1) != begin)
                    {
                        map[begin][i] = 0;                     
                    }                
                    temp--;
                }
            }
      
        }
    }
}
void moveleft()
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        int temp = 0;
        for (int begin = 1; begin < MAX_SIZE; begin++)
        {
            if (map[i][begin] != 0)
            {
                if (map[i][temp] == 0)
                {
                    map[i][temp] = map[i][begin];
                    map[i][begin] = 0;            
                }
                else if (map[i][temp] == map[i][begin])
                {
                    map[i][temp] += map[i][begin];
                    map[i][begin] = 0;
                    temp++;                
                }
                else
                {
                    map[i][temp + 1] = map[i][begin];
                    if (temp + 1 != begin)
                    {
                        map[i][begin] = 0;                     
                    }
                    temp++;
                }
            }
        }
    }
}
void moveright()
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        int temp = MAX_SIZE - 1;
        for (int begin = MAX_SIZE - 2; begin >= 0; begin--)
        {
            if (map[i][begin] != 0)
            {
                if (map[i][temp] == 0)
                {
                    map[i][temp] = map[i][begin];
                    map[i][begin] = 0;
                }
                else if (map[i][temp] == map[i][begin])
                {
                    map[i][temp] += map[i][begin];
                    map[i][begin] = 0;
                    temp--;

                }
                else
                {
                    map[i][temp - 1] = map[i][begin];
                    if (temp - 1 != begin)
                    {
                        map[i][begin] = 0;     
                    }
                    temp--;
                }
            }
        }
    }
}
void KeyControl()
{
    usrkey = _getch();
    switch (usrkey) 
    {
    case 72:
    case'w':
    case'W':
        moveup();
        CreateNumber();
        break;
    case 80:
    case'S':
    case's':
        movedown();
        CreateNumber();
        break;
    case 75:
    case'a':
    case'A':
        moveleft();
        CreateNumber();
        break;
    case 77:
    case'd':
    case'D':
        moveright();
        CreateNumber();
        break;
    default:
        break;
    }
}


int main(int argc, char* argv[])
{   
    //创建一个窗口
    //第一个参数是宽度,二个高度
    initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);
    GameInit();
    while (1)
    {
        GameDraw();       
        KeyControl();           
    }
    while (1);
    return 0;
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7458958
  • 你也可以参考下这篇文章:2048游戏小代码
  • 除此之外, 这篇博客: (C语言)2048游戏实现中的 数据处理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在按下方向键上下左右后处理游戏数据

    数据处理
    行处理
    列处理
    向 左 处理
    向 右 处理
    向 上 处理
    向 下 处理
    处理完毕