java2048移动算法_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().AddPrefab(numPrefab);

Numbers num=numdfControl.GetComponent();

//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)50)

{

if(touchOffset.y>0)

{

return touchDir.Top;

}

}

if(Mathf.Abs(touchOffset.x)50)

{

if(touchOffset.y<0)

{

return touchDir.Bottom;

}

}

}

return touchDir.None;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值