unity 拼图游戏

拼图游戏,在小时玩个手机中,有一些拼图游戏挺热门的,挺好玩。绝对可以把自己的一些照片回忆弄成一个平涂游戏
个性化的拼图,拼凑的不仅仅是一张照片,而是一个故事,一段回忆,一缕温情。每一片的单片都有它自己的位置,就像每段回忆都有它的故事,你要将它放在专属的地方,放对了就慢慢丰富起来,放错了就无法完整。
你可以把你记忆中最深的片段,可以是你挚爱的照片,可以是你最难忘的一瞬留念,做成拼图,在思念的季节里一一拼起,把片片散落的记忆重新组合,用指尖温习甜蜜,把心湖里最美丽的涟漪荡漾开来。(来自百度百科)
现在来实现拼图游戏的的核心把!
拼图游戏的核心无非是对二维数组的运用,通过切换小方块的位置来移动小方块,然后组合小方块,组合成一个完整的图片,小方块数量不一,有3X3的,有6*6的等,现在主要实现3X3的方块的这种。

核心部分,首先定义一个方块类GridItem.方块类有两个属性,行索引RowIndex,列索引ColIndex
每个GridItem都有Change方法,用来是否可以判断方块来移动,其中0是空白的方块,是可以和其他八个方块交换的,假定
你要想向上移动,正好上面一个方块是空白方块,你可以向上交换,反之不行,下面的代码
public void OnChange()
{
//获取上线四个方向的方块
GridItem upItem = GameUI.Instance.GetGrid(RowIndex - 1, ColIndex);
GridItem downItem = GameUI.Instance.GetGrid(RowIndex + 1, ColIndex);
GridItem leftItem = GameUI.Instance.GetGrid(RowIndex, ColIndex - 1);
GridItem rightItem = GameUI.Instance.GetGrid(RowIndex, ColIndex + 1);
//如果能找到这个四个方块而且他们是空白的方块(即名字为0的方块)
if (upItem != null && upItem.name == "0")
{
//交换
GameUI.Instance.ChangeGrid(this, upItem);
}
if (downItem != null && downItem.name == "0")
{
//交换
GameUI.Instance.ChangeGrid(this, downItem);
}
if (leftItem != null && leftItem.name == "0")
{
//交换
GameUI.Instance.ChangeGrid(this, leftItem);
}

    if (rightItem != null && rightItem.name == "0")
    {
        //交换
        GameUI.Instance.ChangeGrid(this, rightItem);
    }
}

每次移动一次的话,都要判断他这个方块是否已经拼好了
private void OnClickBtn()
{
OnChange();
GameUI.Instance.IsWin();
}

搞定了每个方块,现在来看方块如何生成和如何判断方块是完成了的

1,方块生成
public void CreateBlock()
{
//弄一张图片,把他分成9个小的
Sprite[] sps = Resources.LoadAll<Sprite>("image");
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
int i = 3 * row + col;//二维转一维 一维下标 = 行的总数*当前行数 + 当前列数
GameObject o = new GameObject();
o.name = i.ToString();
o.AddComponent<Image>().sprite = sps[i];
GridItem item = o.AddComponent<GridItem>(); //给每个小方块添加脚本,用来切换小方块的移动
item.RowIndex = row;
item.ColIndex = col;
o.transform.SetParent(gridTf);
gridArr[row, col] = item;//存进二维数组
}
}
//执行打乱的协程
StartCoroutine(ChangeGrid());
}
2,打乱方块
//打乱方块,方块初始化时候并未的时候,顺序还是排好序的
IEnumerator ChangeGrid()
{
yield return new WaitForSeconds(2f);
for (int i = 0; i < 100; i++)
{
int row = Random.Range(0, 3);
int col = Random.Range(0, 3);
gridArr[row, col].OnChange();
}
StartCoroutine(PlayTime());
}

3.两个方块满足条件是如何交换的呢
//交换
public void ChangeGrid(GridItem item1, GridItem item2)
{
//交换二维数组中的位置
gridArr[item1.RowIndex, item1.ColIndex] = item2;
gridArr[item2.RowIndex, item2.ColIndex] = item1;
//交换两个图块的行列坐标 ,既要交换数组的的索引,也要切换unityUI的排序的,两两交换位置,会触发胜利逻辑判断,unity里面切换是同步一下操作,上部分是切换数组,下半部分是切换UI
int tempRowIndex = item1.RowIndex;
int tempColIndex = item1.ColIndex;
item1.RowIndex = item2.RowIndex;
item1.ColIndex = item2.ColIndex;
item2.RowIndex = tempRowIndex;
item2.ColIndex = tempColIndex;
//交换图块的位置
int tempIndex = item1.transform.GetSiblingIndex();
item1.transform.SetSiblingIndex(item2.transform.GetSiblingIndex());
item2.transform.SetSiblingIndex(tempIndex);
}
下面是胜利逻辑判断,其实也简单,判断当前图片的名字和当前二维数组转换为一维数组的值是否相等,因为在生成之初就以及给每个方块命名了,名字是一维数组,0-8,只需把二维数组的行列转换为一维数组,进行判断即可
public bool IsWinGame()
{
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
string name = gridArr[row, col].gameObject.name;
int i = 3 * row + col;
if (name != i.ToString())
{
return false;
}
}
}
return true;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。