俄罗斯方块算法及其实现

//Spawner.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Spawner : MonoBehaviour {
	 
	 //建立储存方块组的数组
	 public GameObject[] Blocks;
	 public Sprite[] sprites;
	 public static bool isFirst = true;
	 public static int current = 0;
	 public static int next = 0;


	 void Start(){
		 SpawnerNext();
	 }


	 public void SpawnerNext(){

		//  //用产生随机数的方式随机产生方块组
		//  int i = Random.Range(0,Blocks.Length);

		//  //随机产生方块
		//  Instantiate(Blocks[i],transform.position,Quaternion.identity);
		if (isFirst)
		{
			isFirst = false;
			current = Random.Range(0,Blocks.Length);
			next = Random.Range(0,Blocks.Length);
			
		}
		else
		{
			current = next;
			next = Random.Range(0,Blocks.Length);
		}
		Instantiate(Blocks[current],transform.position,Quaternion.identity);


		GameObject.Find("Image").GetComponent().sprite = sprites[next];
	 }
}


//Group.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Group : MonoBehaviour {

	public float lastFall = 0;

	void start()
	{
		if(!IsValidGridPos())
		{
			Debug.Log("Game Over");
			Destroy(gameObject);
		}
	}

		
	// Update is called once per frame
	void Update() 
	{
		//向左移动
		if(Input.GetKeyDown(KeyCode.LeftArrow)){
			transform.position += new Vector3(-1,0,0);
			if(IsValidGridPos()){
				//如果左移动后方块在有效的位置内,更新存放方块的数组
				UpdateGrid();
			}else{
				//向右移动一个单位
				transform.position += new Vector3(1,0,0);
			}
			
		}

		//向右移动
		if(Input.GetKeyDown(KeyCode.RightArrow)){
			transform.position += new Vector3(1,0,0);
			//如果右移动后方块在有效的位置内,更新存放方块的数组
			if(IsValidGridPos()){
				UpdateGrid();
			}else{
				transform.position += new Vector3(-1,0,0);
			}
		}


		//旋转
		if(Input.GetKeyDown(KeyCode.UpArrow))
		{

			//逆时针旋转90度
			transform.Rotate(0,0,-90);
			if(IsValidGridPos())
			{
				//如果旋转后方块组在有效位置内,更新数组
				UpdateGrid();
				Debug.Log("按下方向上键");
			}
			else
			{
				//顺时针旋转90度
				transform.Rotate(0,0,90);
			}
		}


		//加速下落
		if(Input.GetKeyDown(KeyCode.DownArrow) || Time.time - lastFall > 1){

			//向下移动一个单位
			transform.position += new Vector3(0,-1,0);

			if(IsValidGridPos()){
				//如果下移之后方块在有效位置内,更新数组
				UpdateGrid();
			}else{
				//向上移动一个单位
				transform.position += new Vector3(0,1,0);

				Grid.DeleteFullRows();
				//生成下一个方块
				FindObjectOfType().SpawnerNext();
				//当方块组到达最下方后,禁用该方块的此脚本
				enabled = false;
			}
			//记录方块下落时间
			lastFall = Time.time;
		}
	}
	
	
	bool IsValidGridPos()
	{
		//遍历方块组中的每一个子方块
		foreach(Transform child in transform)
		{
			Vector2 v = Grid.RoundVec2(child.position);
			//如果子方块的位置超出边界则返回false
			if(!Grid.InsideBorder(v))
			{
				//首先判定子方块是否超出界限,其次嵌套判定方块组将要移动的预期位置,是否存在之前的方块组成员
				return false;
			}
				//检测方块组要移动的位置是否存在其他方块组
				if(Grid.grid[(int)v.x,(int)v.y]!=null&&Grid.grid[(int)v.x,(int)v.y].parent!=transform)
				{
					return false;
				}
		
			//}//应嵌套if语句,否则方块絮乱。
		}
		return true;
	}
	void UpdateGrid()
	{
		for(int y = 0; y < Grid.height;y++){
			for(int x = 0;x < Grid.width;x++){
				if(Grid.grid[x,y]!=null){
				//检测某一方块是否是该方块的一部分
					if(Grid.grid[x,y].parent == transform)
					{
						//移除旧的子方块
						Grid.grid[x,y] = null;
					}
				}
			}
		}
		foreach(Transform child in transform)
		{
			Vector2 v= Grid.RoundVec2(child.position);
			Grid.grid[(int)v.x,(int)v.y] = child;
		}
	}
}

 

你可能感兴趣的:(unity)