2048核心算法,数字移动合并检测

using UnityEngine;
using System.Collections;
public enum GameState
{
Playing,
Pause,
End
}
public enum touchDir
{
Left,
Right,
Top,
Bottom,
None //表示当前移动无效
}
public class gameController : MonoBehaviour
{

public static gameController _instance;
public GameObject numPrefab;
public GameState state=GameState.Playing;


void Awake()
{
_instance=this;
}

public int[][] numArray =new int[4][] //判断当前位置存在几个数字
{
new int [4]{0,0,0,0},
new int [4]{0,0,0,0},
new int [4]{0,0,0,0},
new int [4]{0,0,0,0}
};
public Numbers[][] numComponentArray =new Numbers[4][]
{
new Numbers[4]{null,null,null,null},
new Numbers[4]{null,null,null,null},
new Numbers[4]{null,null,null,null},
new Numbers[4]{null,null,null,null}
};

// Use this for initialization
void Start ()
{
GenerateNumber();
GenerateNumber();

}

// Update is called once per frame
void Update ()
{
switch(state)
{
case GameState.Playing:
MoveNum();
break;
case GameState.Pause:
break;
case GameState.End:
break;
}
//nowNumbers._instance.number=(int)Mathf.Pow(2,preNum.num+1);

}
//16个格子里随机生成一个数字

private void GenerateNumber(int posX=-1,int posY=-1,int number=1)
{

int numberX=-1;
int numberY=-1;
if (posX ==-1 || posY ==-1)
{
int countOfEmptyNum =0;
for(int x=0;x<4;x++)
{
for(int y=0;y<4;y++)
{
if(numArray[x][y]==0)
countOfEmptyNum++;
}
}
if(countOfEmptyNum==0)
{
return;
}
int randomNum=Random.RandomRange(1,countOfEmptyNum+1);
int index=0;
for(int x=0;x<4;x++)
{
for(int y=0;y<4;y++)
{
if(numArray[x][y]==0)
{
index++;
if(index==randomNum)
{
numberX=x;
numberY=y;
goto flag;
}
}
}
}
}else
{
numberX=posX;
numberY=posY;
}
flag:
dfControl numdfControl=this.GetComponent<dfControl>().AddPrefab(numPrefab);
Numbers num=numdfControl.GetComponent<Numbers>();
//Create a number
num.num=number;
num.x=numberX;num.y=numberY;
numArray[numberX][numberY]++;
numComponentArray[numberX][numberY]=num;
}

private bool checkWin()
{
for(int x=0;x<4;x++)
{
for(int y=0;y<4;y++)
{
if(numArray[x][y]!=0)
{
if(numComponentArray[x][y].num==13)
return true;
}
}
}
return false;
}
private bool checkGameOver()
{
for(int x=0;x<4;x++)
{
for(int y=0;y<4;y++)
{
if(numArray[x][y]==0)
{
return false;
}
}
}
//横向检查
for(int x=0;x<4;x++)
{
for(int y=0;y<3;y++)
{
if(numComponentArray[x][y].num==numComponentArray[x][y+1].num)
{
return false;
}
}
}
//竖向检查
for(int y=0;y<4;y++)
{
for(int x=0;x<3;x++)
{
if(numComponentArray[x][y].num==numComponentArray[x+1][y].num)
{
return false;
}
}
}
return true;
}
private Vector3 mouseDownPosition;

// MoveNum 移动数字方法
public void MoveNum()
{
bool isAnyNumMove=false;
int countCombine=0;
if(Input.GetMouseButtonDown(0))
{
mouseDownPosition=Input.mousePosition;
}
if(Input.GetMouseButtonUp(0)==false)return;
touchDir dir = GetTouchDir();
switch(dir)
{
case touchDir.None:
return;
case touchDir.Right:
for(int y=0;y<4;y++)
{
//Numbers preNum=null; //表示上一个Numbers是哪一个 如果上一个为空
Numbers preNum=null;
int index=4;
for(int x=3;x>=0;x--)
{
bool isNeedUpdateComponentArray=true;
if(numArray[x][y]==0) continue;
if(preNum==null)
{
preNum=numComponentArray[x][y];
index--;
}else
{
if(preNum.num==numComponentArray[x][y].num)
{
//合并 并移动 到目标位置 原有数字消失,生成合并后数字
countCombine++;
GenerateNumber(index,y,preNum.num+1);
scoreManager._instance.AddScore( (int)Mathf.Pow(2,preNum.num+1));
nowNumbers._instance.number=(int)Mathf.Pow(2,preNum.num+1);
preNum.Disappear();
numComponentArray[x][y].Disappear();
preNum=null;
isNeedUpdateComponentArray=false;
}else
{
//不能合并
preNum=numComponentArray[x][y];
index--;
}
}
//move to index x,y
if(numComponentArray[x][y].moveToPosition(index,y,isNeedUpdateComponentArray))
{
isAnyNumMove=true;
}

}
}
break;
case touchDir.Left:
for(int y=0;y<4;y++)
{
bool isNeedUpdateComponentArray=true;
Numbers preNum=null; //表示上一个Numbers是哪一个 如果上一个为空
int index=-1;
for(int x=0;x<4;x++)
{
if(numArray[x][y]==0) continue;
if(preNum==null)
{
preNum=numComponentArray[x][y];
index++;
}else
{
if(preNum.num==numComponentArray[x][y].num)
{
//合并 并移动 到目标位置 原有数字消失,生成合并后数字
countCombine++;
GenerateNumber(index,y,preNum.num+1);
preNum.Disappear();
numComponentArray[x][y].Disappear();
preNum=null;
isNeedUpdateComponentArray=false;
}else
{
//不能合并
preNum=numComponentArray[x][y];
index++;
}
}
//move to index x,y
if(numComponentArray[x][y].moveToPosition(index,y,isNeedUpdateComponentArray))
{
isAnyNumMove=true;
}
}
}
break;
case touchDir.Top:
for(int x=0;x<4;x++)
{
bool isNeedUpdateComponentArray=true;
Numbers preNum=null; //表示上一个Numbers是哪一个 如果上一个为空
int index=-1;
for(int y=0;y<4;y++)
{
if(numArray[x][y]==0) continue;
if(preNum==null)
{
preNum=numComponentArray[x][y];
index++;
}else
{
if(preNum.num==numComponentArray[x][y].num)
{
//合并 并移动 到目标位置 原有数字消失,生成合并后数字
countCombine++;
GenerateNumber(x,index,preNum.num+1);
preNum.Disappear();
numComponentArray[x][y].Disappear();
preNum=null;
isNeedUpdateComponentArray=false;
}else
{
//不能合并
preNum=numComponentArray[x][y];
index++;
}
}
//move to index x,y
if(numComponentArray[x][y].moveToPosition(x,index,isNeedUpdateComponentArray))
{
isAnyNumMove=true;
}
}
}
break;
case touchDir.Bottom:
for(int x=0;x<4;x++)
{
bool isNeedUpdateComponentArray=true;
Numbers preNum=null; //表示上一个Numbers是哪一个 如果上一个为空
int index=4;
for(int y=3;y>=0;y--)
{
if(numArray[x][y]==0) continue;
if(preNum==null)
{
preNum=numComponentArray[x][y];
index--;
}else
{
if(preNum.num==numComponentArray[x][y].num)
{
//合并 并移动 到目标位置 原有数字消失,生成合并后数字
countCombine++;
GenerateNumber(x,index,preNum.num+1);
preNum.Disappear();
numComponentArray[x][y].Disappear();
preNum=null;
isNeedUpdateComponentArray=false;
}else
{
//不能合并
preNum=numComponentArray[x][y];
index--;
}
}
//move to index x,y
if(numComponentArray[x][y].moveToPosition(x,index,isNeedUpdateComponentArray))
{
isAnyNumMove=true;
}
}
}
break;
}
if(countCombine>0)
{
audio.Play();
}
if(isAnyNumMove)
{
GenerateNumber();
}
// if(checkWin()||checkGameOver())
// {
// gameOver._instance.Show();
// }
}

private touchDir GetTouchDir()
{
if(Input.GetMouseButtonUp(0))
{
Vector3 touchOffset=Input.mousePosition-mouseDownPosition;
//if(Mathf.Abs(touchOffset.x)>Mathf.Abs(touchOffset.y) && Abs(touchOffset.x)>50)
if(Mathf.Abs(touchOffset.x)>Mathf.Abs(touchOffset.y)&&Mathf.Abs(touchOffset.x)>50)
{
if(touchOffset.x>0)
{
return touchDir.Right;
}
}
if(Mathf.Abs(touchOffset.x)>Mathf.Abs(touchOffset.y)&& Mathf.Abs(touchOffset.x)>50)
{
if(touchOffset.x<0)
{
return touchDir.Left;
}
}
if(Mathf.Abs(touchOffset.x)<Mathf.Abs(touchOffset.y) &&Mathf.Abs(touchOffset.y)>50)
{
if(touchOffset.y>0)
{
return touchDir.Top;
}
}
if(Mathf.Abs(touchOffset.x)<Mathf.Abs(touchOffset.y)&&Mathf.Abs(touchOffset.y)>50)
{
if(touchOffset.y<0)
{
return touchDir.Bottom;
}
}
}
return touchDir.None;
}

}


转载于:https://my.oschina.net/Magicwu/blog/513666

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值