2048的C语言实现

(1)游戏简介:

2048是一款程序员对于数字敏感程度训练的一款游戏,简单易上手。可谓是老少皆宜哇。

(2)规则与玩法 :

随机产生2或4,通过方向键或者w/a/s/d键来实现数字移动,相同数字碰撞会相加,不同数字碰撞会出现一个新的随机值2/4,知道数字铺满游戏界面且没有可碰撞的相同数字,则游戏结束。

(3)代码实现:

是不是感(jio)挺简单,不过对于我这种菜鸡刚开始还是有些问题,不过经过几天的思考和调试也还算是比较顺利的完成了。二维数组、循环、简单的交互就可以实现,废话不多说,直接上代码。

不足之处还请多多指教!

#include<iostream>
#include<cstdio>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
using namespace std;
int mp[4][4],score;
bool map[4][4];
bool cal[4][4];
void DeBug()
{
    for(int i=0;i<4;++i)//定义二位数组空格子
	{
        for(int j=0;j<4;++j)
            cout<<map[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
    for(int i=0;i<4;++i)
	{
        for(int j=0;j<4;++j)
            cout<<mp[i][j]<<" ";
        cout<<endl;
    }
}
void print()//4x4网格
{

    for(int j=0;j<4;++j)
            printf("----");
        printf("\n");
    for(int i=0;i<4;++i)
	{
        for(int j=0;j<4;++j)
		{
            printf("|");
            if(map[i][j])
			{
                if(score<mp[i][j])
                    score=mp[i][j];
                printf("%3d",mp[i][j]);
            }
			else
                printf("   ");

       }
        printf("|\n");
        for(int j=0;j<4;++j)
		{
            printf("----");
		}
        printf("\n");
   }
    printf("w /W: up  s/S : down  a/A : left  d/D : right\n");
    printf("按 'r' 开始新游戏\n按 'e' 退出游戏\n");
}
void MoveUp()//上移
{
    bool flag;
    for(int i=1;i<4;++i)
	{
        for(int j=0;j<4;++j)
		{
            if(!map[i][j])
                continue;
            flag=false;
            int pos=i;
            for(int k=i-1;k>=0;--k)
			{
                if(!map[k][j])
				{
                    pos=k;
                    continue;
                }
                if((mp[k][j]==mp[i][j])&&(!cal[k][j]))
				{
                    mp[k][j]+=mp[i][j];
                    cal[k][j]=true;
                    flag=true;
                    map[i][j]=false;
                }
                else
                    break;
            }
            if(!flag){
                mp[pos][j]=mp[i][j];
                map[i][j]=false;
                map[pos][j]=true;
            }
        }
    }
}
void MoveDown()//下移
{
    bool flag;
    for(int i=2;i>=0;--i)
	{
        for(int j=0;j<4;++j)
		{
            if(!map[i][j])
                continue;
            flag=false;
            int pos=i;
            for(int k=i+1;k<4;++k)
			{
                if(!map[k][j])
				{
                    pos=k;
                    continue;
                }
                if((mp[k][j]==mp[i][j])&&(!cal[k][j]))
				{
                    mp[k][j]+=mp[i][j];
                    cal[k][j]=true;
                    flag=true;
                    map[i][j]=false;
                }
                else
                    break;
            }
            if(!flag){
                mp[pos][j]=mp[i][j];
                map[i][j]=false;
                map[pos][j]=true;
            }
        }
    }
}
void MoveRight()//右移
{
    bool flag;
    for(int i=0;i<4;++i)
	{
        for(int j=2;j>=0;--j)
		{
            if(!map[i][j])
                continue;
            flag=false;
            int pos=j;
            for(int k=j+1;k<4;++k)
			{
                if(!map[i][k])
				{
                    pos=k;
                    continue;
                }
                if((mp[i][k]==mp[i][j])&&(!cal[i][k]))
				{
                    mp[i][k]+=mp[i][j];
                    cal[i][k]=true;
                    flag=true;
                    map[i][j]=false;
                }
                else
                    break;
            }
            if(!flag){
                mp[i][pos]=mp[i][j];
                map[i][j]=false;
                map[i][pos]=true;
            }
        }
    }
}
void MoveLeft()//左移
{
    bool flag;
    for(int i=0;i<4;++i)
	{
        for(int j=1;j<4;++j)
		{
            if(!map[i][j])
                continue;
            flag=false;
            int pos=j;
            for(int k=j-1;k>=0;--k)
			{
                if(!map[i][k])
				{
                    pos=k;
                    continue;
                }
                if((mp[i][k]==mp[i][j])&&(!cal[i][k]))
				{
                    mp[i][k]+=mp[i][j];
                    cal[i][k]=true;
                    flag=true;
                    map[i][j]=false;
                }
                else
                    break;
            }
            if(!flag)
			{
                mp[i][pos]=mp[i][j];
                map[i][j]=false;
                map[i][pos]=true;
            }
        }
    }
}
void Init()
{
    srand(time(NULL));//产生随机值
    int x,y,v,now=0;
    for(int i=0;i<4;++i)
	{
    for(int j=0;j<4;++j)
	{
        if(!map[i][j])
            now++;
	}
	}
    if(now==0)
        return;
    int cnt=rand()%now,n=0;
    bool flag=false;
    for(int i=0;i<4;++i)
	{
        flag=false;
        for(int j=0;j<4;++j)
        if(!map[i][j])
		
		{
            if(cnt==n)
			{
                x=i;
                y=j;
                flag=true;
                break;
            }else
                n++;
        }
        if(flag)
            break;
    }
    v=rand()%2;
    if(v)
        v=4;
    else
        v=2;
    mp[x][y]=v;
    map[x][y]=true;
}
bool gameover()
{
    for(int i=0;i<4;++i)
	{
        for(int j=0;j<4;++j)
		{
            if(!map[i][j])
                return false;
            if(i>0)
			{
                if(mp[i-1][j]==mp[i][j])
                    return false;
            }
            if(j>0)
                if(mp[i][j-1]==mp[i][j])
                    return false;
        }
    }
    return true;
}
void Lose()
{
    char ch;
    system("cls");
    printf("*******************\n");
    printf("****游戏结束 ****\n");
    printf("**** 您的得分:%3d ****\n",score);
    printf("*******************\n\n");
    printf("请按任意键继续...\n");
    ch=getch();
    return ;
}
void Win()
{
    char ch;
    system("cls");//清屏
    printf("*******************\n");
    printf("**** 恭喜您胜利啦 ****\n");
    printf("*******************\n\n");
    printf("请按任意键继续...\n");
    ch=getch();
    return ;
}
void start()
{
    system("cls");
    printf("*************************\n");
    printf("* 游戏加载中,请稍后... *\n");
    printf("*************************\n");
    int x=(int)5e8;
    bool flag=false;
    while(x--);
    memset(mp,0,sizeof(mp));
    memset(map,false,sizeof(map));
    score=0;
    char ch;
    while(!gameover())
    {
        memset(cal,false,sizeof(cal));
        int cnt=0;
        system("cls");
        Init();
        print();
       // DeBug();
        ch=getch();
        switch (ch)
        {
            case 'w':
			case 'W':
					MoveUp();break;
            case 's':
				case 'S':
					MoveDown();break;
            case 'a':
				case 'A':
					MoveLeft();break;
            case 'd':
			case 'D':
					MoveRight();break;
            case 'e':exit(0);
            case 'r':return ;
        }
        if(score>=2048){
            flag=true;
            break;
        }
    }
    if(flag)
        Win();
    else
        Lose();
    return ;
}

int main()
{
    char ch;
    while(1)
    {
       system("cls");
	   printf("					欢迎来到@阿龙儿的2048\n\n");
        printf("按Enter键开始游戏叭\n\n退出请按Esc键\n"); 
        ch=getch();
        if(ch==13)
            start();
        else if(ch==27)
            break;
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值