c++2048代码

 废话不多说,上代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>

//过关数字
#define win_number 2048 
//定义地图行、列、以及本身 
#define row 4
#define col 4
int map[row][col]={0};

//初始化地图
void InitializeMap(); 
//打印地图
void PrintMap(); 
//判断是否已经存在2048
int IsWin();
//随机生成一个2或者4,生成2的概率是生成4的概率的3倍
void CreateANumber(); 
//移动数字
int Move(char turn);
//合并数字
int Combine(char turn); 
//gotoxy函数的实现,把光标移到到指定位置 
void gotoxy(int x,int y);

int main()
{
    srand(time(0));        //时间种子 
    InitializeMap();    //初始化地图,只有两个数字 
    char turn;
    while(1)
    {
        PrintMap();        //展示地图 
        if(IsWin())        //判断是否过关 
        {
            printf("恭喜通关!\n");
            break;
        }
        turn=getch();    //获取用户的移动请求,若移动有效则再次生成一个随机2或4 
        if(Move(turn)==1)
        {
            if(Combine(turn))
            {
                Move(turn);    
            } 
            CreateANumber();
        } 
        else if(Combine(turn))
        {
            Move(turn);
            CreateANumber();
        }
    }
    return 0;
}

//初始化地图
void InitializeMap()
{
    CreateANumber();
    CreateANumber(); 
} 

//打印地图
void PrintMap()
{
    int i,j,k;
    gotoxy(0,0);
    for(i=0;i<row;i++)
    {
        for(k=1;k<=5*col+1;k++)
        {
            printf("-");    
        } 
        printf("\n|");
        for(j=0;j<col;j++)
        {
            if(map[i][j]>0)
            {
                printf("%4d|",map[i][j]);
            }
            else
            {
                printf("%4s|"," ");
            }
        }
        printf("\n");
    }
    for(k=1;k<=5*col+1;k++)
    {
        printf("-");    
    } 
    printf("\n");
}

//判断是否已经存在2048
int IsWin()
{
    int i,j;
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            if(map[i][j]==win_number)    
            {
                return 1;
            }
        }    
    }    
    return 0;
}

//随机生成一个2或者4,生成2的概率是生成4的概率的3倍
void CreateANumber()
{
    int number=rand()%4+1;
    if(number!=4)
    {
        number=2;    
    }    
    int i,j;
    while(1)
    {
        i=rand()%row;
        j=rand()%col;
        if(map[i][j]==0)
        {
            map[i][j]=number;
            break;    
        }    
    }
}

//移动数字
int Move(char turn)
{
    int flag=0;    //是否移动或者合并成功。0:否 1:是
    int i,j,k;
    switch(turn)
    {
        case 'w':case 'W'://有空位则下面的非空位往上移 
            for(i=0;i<row-1;i++)
            {
                for(j=0;j<col;j++)
                {
                    if(map[i][j]==0)
                    {
                        for(k=i+1;k<row;k++)
                        {
                            if(map[k][j]>0)
                            {
                                map[i][j]=map[k][j];
                                map[k][j]=0;
                                flag=1;
                                break;    
                            }    
                        }    
                    } 
                }
            }
            break;
        case 's':case 'S'://有空位则上面的非空位往下移 
            for(i=row-1;i>=1;i--)
            {
                for(j=0;j<col;j++)
                {
                    if(map[i][j]==0)
                    {
                        for(k=i-1;k>=0;k--)
                        {
                            if(map[k][j]>0)
                            {
                                map[i][j]=map[k][j];
                                map[k][j]=0;
                                flag=1;
                                break;    
                            }    
                        } 
                    } 
                }
            }
            break;
        case 'a':case 'A'://有空位则右面的非空位往左移 
            for(j=0;j<col-1;j++)
            {
                for(i=0;i<row;i++)
                {
                    if(map[i][j]==0)
                    {
                        for(k=j+1;k<col;k++)
                        {
                            if(map[i][k]>0)
                            {
                                map[i][j]=map[i][k];
                                map[i][k]=0;
                                flag=1;
                                break;
                            }
                        }
                    }
                }
            }
            break;
        case 'd':case 'D'://有空位则左面的非空位往右移 
            for(i=0;i<row;i++)
            {
                for(j=col-1;j>=1;j--)
                {
                    if(map[i][j]==0)
                    {
                        for(k=j-1;k>=0;k--)
                        {
                            if(map[i][k]>0)
                            {
                                map[i][j]=map[i][k];
                                map[i][k]=0;
                                flag=1;
                                break;
                            }
                        }
                    }
                }
            }
            break;
        default:
            break;
    }
    return flag;
}

//合并数字
int Combine(char turn)
{
    int flag=0;        //是否合并成功
    int i,j;
    switch(turn)
    {
        case 'w':case 'W'://是否存在下面一个数字和自己的相同且不是0 
            for(i=0;i<row-1;i++)
            {
                for(j=0;j<col;j++)
                {
                    if(map[i][j]>0&&map[i][j]==map[i+1][j])
                    {
                        map[i][j]*=2;
                        map[i+1][j]=0;
                        flag=1;    
                    }    
                }    
            } 
            break;    
        case 's':case 'S'://是否存在上面一个数字和自己的相同且不是0
            for(i=row-1;i>=1;i--)
            {
                for(j=0;j<col;j++)
                {
                    if(map[i][j]>0&&map[i][j]==map[i-1][j])
                    {
                        map[i][j]*=2;
                        map[i-1][j]=0;
                        flag=1;    
                    } 
                }
            }
            break;    
        case 'a':case 'A'://是否存在右面一个数字和自己的相同且不是0
            for(i=0;i<row;i++)
            {
                for(j=0;j<col-1;j++)
                {
                    if(map[i][j]>0&&map[i][j]==map[i][j+1])
                    {
                        map[i][j]*=2;
                        map[i][j+1]=0;
                        flag=1;
                    }
                }
            }
            break;    
        case 'd':case 'D'://是否存在左面一个数字和自己的相同且不是0
            for(i=0;i<row;i++)
            {
                for(j=col-1;j>=1;j--)
                {
                    if(map[i][j]>0&&map[i][j]==map[i][j-1])
                    {
                        map[i][j]*=2;
                        map[i][j-1]=0;
                        flag=1; 
                    }
                }
            }
            break;    
        default:
            break;
    } 
    return flag;
}

//gotoxy函数的实现,把光标移到到指定位置 
void gotoxy(int x,int y)
{
    COORD pos;
    pos.X=y;
    pos.Y=x;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 
} 

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值