【来写个2048吧】—— 移动算法与随机数字生成

一、移动算法

其实2048的移动算法蛮简单,看代码很容易明白,就不多说了。

向左滑动

//左滑动
bool GameScene:: doLeft ()
{
        //判断有没有发生移动
        bool isMove = false ;
        for ( int y = 0 ; y < 4; y++)
        {
               for ( int x = 0 ; x < 4; x++)
               {
                      for ( int x1 = x +1 ; x1 < 4; x1++)
                      {
                            if ( cardArr [x1 ][ y]-> getNumber () > 0 )
                            {
                                   if ( cardArr [x ][ y]-> getNumber () <= 0 )
                                   {
                                          cardArr [x ][ y]-> setNumber (cardArr [ x1][ y ]->getNumber ());
                                          cardArr [x1 ][ y]-> setNumber (0 );
                                          x --;
                                          isMove = true;
                                   }
                                   else if ( cardArr[ x ][y ]-> getNumber() == cardArr [ x1][ y ]->getNumber ())
                                   {
                                          cardArr [ x][ y ]->setNumber ( cardArr[ x ][y ]-> getNumber() * 2 );
                                          cardArr [x1 ][ y]-> setNumber (0 );
                                          isMove = true;
                                   }
                                   break ;
                            }
                      }
               }
        }

        return isMove ;
}

向右滑动

//右滑动
bool GameScene::doRight()
{
	//判断有没有发生移动
	bool isMove = false;
	for (int y = 0; y < 4; y++)
	{
		for (int x = 3; x >= 0; x--)
		{
			for (int x1 = x-1; x1>=0; x1--)
			{
				if (cardArr[x1][y]->getNumber() > 0)
				{
					if (cardArr[x][y]->getNumber() <= 0)
					{
						cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber());
						cardArr[x1][y]->setNumber(0);
						x++;
						isMove = true;
					}
					else if(cardArr[x][y]->getNumber() == cardArr[x1][y]->getNumber())
					{
						cardArr[x][y]->setNumber(cardArr[x][y]->getNumber() * 2);
						cardArr[x1][y]->setNumber(0);
						isMove = true;
					}
					break;
				}
			}
		}
	}

	return isMove;
}

向上滑动

//上滑动
bool GameScene::doUp()
{
	//判断有没有发生移动
	bool isMove = false;
	for (int x = 0; x < 4; x++)
	{
		for (int y = 3; y >= 0; y--)
		{
			for (int y1 = y-1; y1>=0; y1--)
			{
				if (cardArr[x][y1]->getNumber() > 0)
				{
					if (cardArr[x][y]->getNumber() <= 0)
					{
						cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());
						cardArr[x][y1]->setNumber(0);
						y++;
						isMove = true;
					}
					else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber())
					{
						cardArr[x][y]->setNumber(cardArr[x][y]->getNumber() * 2);
						cardArr[x][y1]->setNumber(0);
						isMove = true;
					}
					break;
				}
			}
		}
	}

	return isMove;
}

向下滑动

//下滑动
bool GameScene::doDown()
{
	//判断有没有发生移动
	bool isMove = false;
	for (int x = 0; x < 4; x++)
	{
		for (int y = 0; y <4; y++)
		{
			for (int y1 = y+1; y1<4; y1++)
			{
				if (cardArr[x][y1]->getNumber() > 0)
				{
					if (cardArr[x][y]->getNumber() <= 0)
					{
						cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());
						cardArr[x][y1]->setNumber(0);
						y--;
						isMove = true;
					}
					else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber())
					{
						cardArr[x][y]->setNumber(cardArr[x][y]->getNumber() * 2);
						cardArr[x][y1]->setNumber(0);
						isMove = true;
					}
					break;
				}
			}
		}
	}

	return isMove;
}

从代码中可以看出,主要是判断目标卡片和后一个卡片,目标卡片为0,这后一个卡片等于目标卡片,如果目标卡片与后一个卡片相等,则目标卡片乘2

二、生成随机卡片

//创建生成随机卡片
void GameScene:: createCardNumber ()
{
        int i = CCRANDOM_0_1 () * 4 ;         //生成0~3随机数
        int j = CCRANDOM_0_1 () * 4 ;

        //判断是否已经存在
        if ( cardArr [i ][ j]-> getNumber () > 0 )
        {
               createCardNumber ();
        }
        else
        {
               //2和4的生成率为9:1
               cardArr [i ][ j]-> setNumber (CCRANDOM_0_1 ()* 10 < 1 ? 4 : 2);
        }
}

然后在init()后面添加两个该函数, 然后在每滑动一次后调用一次该函数。

【来写个2048吧】—— 移动算法与随机数字生成

时间: 2024-10-16 14:38:55

【来写个2048吧】—— 移动算法与随机数字生成的相关文章

机器学习算法的随机数据生成

在学习机器学习算法的过程中,我们经常需要数据来验证算法,调试参数.但是找到一组十分合适某种特定算法类型的数据样本却不那么容易.还好numpy, scikit-learn都提供了随机数据生成的功能,我们可以自己生成适合某一种模型的数据,用随机数据来做清洗,归一化,转换,然后选择模型与算法做拟合和预测.下面对scikit-learn和numpy生成数据样本的方法做一个总结. 1. numpy随机数据生成API numpy比较适合用来生产一些简单的抽样数据.API都在random类中,常见的API有:

280行代码:Javascript 写的2048游戏

2048 原作者就是用Js写的,一直想尝试,但久久未动手. 昨天教学生学习JS代码.不妨就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算法,移动后有数字的对齐,无数字(我用的0,但不显示)补齐. 移动前 移动后(注意程序合并了第一行2个2,并产生了新的2) 移动算法分2步: 第一步骤:移动 第二步骤:合并 移动代码参考: [html] view plaincopy function left(t,i) { var j; var len 

【来写个2048吧】—— 后期优化及源代码

卡片里的数字假设越来越大则会超过卡片,这样看起来不好看,所以我们要推断数字的位数然后设置合适的大小. 在Card.cpp的setNumber()中增加例如以下代码 //设置数字大小 if ( num >= 0) { labelCardNumber->setFontSize (100); } if ( num >= 16) { labelCardNumber->setFontSize (90); } if ( num >= 128) { labelCardNumber->

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

js写的2048

闲着无聊,用js写个简单的2048玩儿...引用了jquery,需要改下地址 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><title>2048</title> <script src="jquery-1.8

【来写个2048吧】—— 游戏结束检测与添加分数

一. 游戏结束检测 //检测游戏是否结束 void GameScene :: doCheck() { bool isGameOver = true ; //判断每一个的上下左右和自己是否相同 for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { if ( cardArr [x ][ y]-> getNumber () == 0 || ( x< 3 && cardArr[ x ][y ]->

【来写个2048吧】—— 后期优化及源码

卡片里的数字如果越来越大则会超过卡片,这样看起来不好看,所以我们要判断数字的位数然后设置合适的大小. 在Card.cpp的setNumber()中加入如下代码 //设置数字大小 if ( num >= 0) { labelCardNumber->setFontSize (100); } if ( num >= 16) { labelCardNumber->setFontSize (90); } if ( num >= 128) { labelCardNumber->se

【来写个2048吧】—— 创建卡片类以及添加

一.创建卡片类 首先想想卡片是一个精灵,那么我们就继承精灵类.然后还要有数字,背景颜色.基本就这些,那么看代码吧. Card.h代码 #ifndef _CARD_H_ #define _CARD_H_ #include "cocos2d.h" USING_NS_CC ; class CardSprite : public Sprite { public : //这里number是卡片数字,wight和height是宽和高,cardSpriteX和CardSpriteY是卡片坐标 sta

【来写个2048吧】—— 手势识别框架搭建

迭代是一开发种技术,用来把系统功能传递到一系列的增量的完整版本,每个版本一个特定固定的时间段被开发,该时间段称之为迭代. 每个迭代的经历过程: 整个迭代过程: 图中颜色代表每次开发每项活动所占的比重不同 迭代式开发的优点: 1.降低风险 2.得到早期用户反馈 3.持续测试和集成 4.适应变更 开发特征: 1.在进行大规模的投资前,就解决了关键的风险问题 2.使的早期用户反馈在初始迭代中就能出现 3.连续进行测试和集成. 4.各个目标里程碑提供了短期的焦点. 5.对过程的测量是通过实现的评定来进行