• c++编写简易版2048小游戏


    c++编写简易版2048小游戏

    我们都知道2048是个44的方格,为了方便数组下表我们生成55的数组,只用到1~4的下标。

    初始化时候先随便生成两个目标

    // 程序初始化
    void init()
    {
       
    	score = 0;
    	memset(a, 0, sizeof(a));
    	int x1 = rand() % 4 + 1, y1 = rand() % 4 + 1, x2 = rand() % 4 + 1, y2 = rand() % 4 + 1;	// 随机生成两个初始点
    	a[x1][y1] = a[x2][y2] = 2;				// 初始点初始化为 2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    画图操作,就是把有数组都打印出来,数字为0的就打印空字符,数字不为0的,就打印数字。

    void drawmap()
    {
       
    	system("cls");
    	
    	for (int i = 1; i <= 4; i++)
    	{
       
    		for (int j = 1; j <= 4; j++)
    		{
       
    			if (a[i][j])			// 如果该位置没有数字,则不绘制
    			{
       
    				if(a[i][j]>1000)
    					cout<<a[i][j]<<" ";
    				else if(a[i][j]>100)
    					cout<<a[i][j]<<" ";
    				else if(a[i][j]>10)
    					cout<<" "<<a[i][j]<<" ";
    				else
    					cout<<" "<<a[i][j]<<" ";
    			}
    			else
    			{
       
    				cout<<" ";
    			}
    		}
    		cout<<"\n";
    			
    	}
    			
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    然后就是移动了,我这里用输入字符控制,用wsad,控制上下左右。

    // 玩家操作
    void move()
    {
       
    	memcpy(b, a, sizeof(a));			// 将 a 备份至 b
    	memset(mov, false, sizeof(mov));	// 初始化 mov 为 false(所有点均未移动)
    	char c;
    	cin>>c;
    
    	if(c=='w') //向上
    	{
       
    		for (j = 1; j <= 4; j++)
    			for (i = 2; i <= 4; i++)
    			{
       
    				if (!a[i][j])continue;
    				int k = i;
    				while (!a[k - 1][j] && k >= 2)
    				{
       
    					a[k - 1][j] = a[k][j];
    					a[k][j] = 0;
    					k--;
    				}
    				if (a[k][j] == a[k - 1][j] && !mov[k - 1][j])
    				{
       
    					a[k - 1][j] = 2 * a[k][j];
    					a[k][j] = 0;
    					mov[k - 1][j] = true;
    					score += a[k - 1][j];
    				}
    			}
    	}
    	else if(c=='s') //向下 
    	{
       
    		//。。。
    	} 
    	else if(c=='a') //向左
    	{
       
    		//。。。
    	} 
    	else if(c=='d')
    	{
       
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    还有判断游戏结束和游戏胜利

    // 判断游戏结束

    bool gameover()
    {
       
    	// 对于任意一个位置,该位置为空 或 四周有位置上的数字与该位置上数字相等,说明可继续移动(游戏可继续)
    	for (i = 1; i <= 4; i++)
    		for ( j = 1; j <= 4; j++)
    			if (!a[i][j] || a[i][j] == a[i + 1][j] || a[i][j] == a[i - 1][j] || a[i][j] == a[i][j + 1] || a[i][j] == a[i][j - 1])return false;
    	// 否则游戏结束
    	return true;
    }
    
    // 判断胜利
    bool win()
    {
       
    	// 有任意一个位置达到 2048,则胜利
    	for ( i = 1; i <= 4; i++)
    		for ( j = 1; j <= 4; j++)
    			if (a[i][j] == 256)return true;
    	return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    其实这个2048小游戏并不是特别的难,主要难点在于算法。只要算法思想了解之后,就可以很简单地做出一个完整的游戏。

  • 相关阅读:
    【Spring】Bean生命周期
    大厂频繁联手,NFT 与 GameFi 的融合能带来哪些新叙事?
    在关系型数据库中储存树形结构
    LC-2216. 美化数组的最少删除数(贪心(脑经急转弯))
    初识设计模式 - 解释器模式
    Extjs图书管理系统源码 智能化图书管理系统源码
    Amazon云计算AWS(四)
    Django视图层解析
    智能合约是什么?
    微信小程序获取用户手机号码
  • 原文地址:https://blog.csdn.net/qq_43934844/article/details/128061747