卡牌记忆游戏


其实比较简单。 主要就是对数组的使用,以及一些简单的逻辑思维。

游戏主要是这样,翻开牌,如果两张背面都是一样的,就消除,如果不一样就隐藏起来,要把所有的牌都翻完,就算胜利。

首先这里要先 产生 随机的 数字卡牌 的数组,生成的数组里的数字要有对应才可以,然后顺序要打乱,

这里直接贴出 代码

/// <summary>
	///  产生随机 RandomCard对 数字 卡牌
	/// </summary>
	/// <param name="RandomCard">要随机的对数</param>
	/// <param name="cardKind">卡牌的种类</param>
	List<int> CreateRandomDoublePlayerCard(int RandomCard,int cardKind)
	{
		List<int> al = new List<int>();
		for (int i = 0; i < RandomCard; i++)
		{
			int x = Random.Range(0, cardKind);
			
			al.Add(x);
		}
		for (int i = 0; i < RandomCard; i++)
		{
			int temp = al[i];
			al.Add(temp);
		}
		//打乱交换位置 
		for (int i=0; i<al.Count;i++)
		{
			int RandomIndex = Random.Range(0, al.Count);

			int temp = al[i];
			al[i] = al[RandomIndex];
			al[RandomIndex] = temp;
		}
		Debug.Log(al.Count);
		return al;
	}

 这里讲一下, 一共有Randomcard对牌(关卡里总共的牌),然后 一共有 cardkind种 牌(翻到的牌);

Randomcard是关卡中牌的总数,这个数 一定要是偶数, 然后这个总数 除2 就得到要随机的几次Randomcard次,

知道了我们要随机Randomcard次后,也知道了我们一共有caredkind种牌, 接下来就可以写随机了。

Random.Range(0, cardKind);  这里要注意一点,Untiy里面 Range 是不包含最大值的,因此我们就 从0开始,而不是从1

然后随机结束后,再写个for再随机一下,可能有人会问为什么直接在第一个循环种直接加上去,好吧,其实加上去的或有很大几率 会使得相连的牌一样,所以为了提高游戏难度,就等他循环结束后,在尾部加上。

然后再 根据有这个list里成员的总数再进行随机换位置, 其实换值的概念也比较简单,

假如int a, b;求 a, b 互相交换值

可以是这样 a =a+b; b=a-b; a=a-b;

当然也可以 用个变量来存,int temp; temp=a; a=b; b=temp;

换好了之后, 翻牌的核心也就完成了,接下来就只是游戏逻辑了

这里用的是list数组进行储存, 在for中进行第一次随机, 这个 x 就是要翻开的下标,这个下标要和sprite[]进行关联,sprite存的是图片素材(翻到的牌)。 我这里 是通过多个数组去存储的,NoramlSprite是存储 翻开牌的,FinshSprite是存匹配成功的

然后还要 用到两个 button变量去存储

下面贴出我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.IO;
public class carManager : MonoBehaviour {

	public Text CountDownText;
	public float CTime=100;

	public Image GameOver;
	public Image Win;
	// Use this for initialization
	//卡牌总数
	int CardCount;
	//所有的卡牌
	Image[] childImg;

	public static int level=0;

	//卡牌的图标总数
	int IconCount=9;
	
	//翻开牌后的图标
	Sprite[] NormalSprint;
	//成功匹配后的图标
	Sprite[] FinshSprint;

	//第一次翻的牌
	Button BtnSecondNumCard;

	//第二次翻的牌
	Button BtnFirstNumCard;
	//是否第一次点击
	bool isFirstClick = true;

	//匹配成功的对数
	int RewordCourt=0;

	//卡牌的背景图
	Sprite PokerBG1;
	
	//存放点击到的button的下标
	int TempIndex;

	List<int> RamDomCard=new List<int>();

	void Awake()
	{
		
		//初始化
		CardCount = transform.childCount;
		Debug.Log(CardCount);
		childImg = transform.GetComponentsInChildren<Image>();
		Debug.Log(childImg.Length);
		NormalSprint = new Sprite[IconCount];
		FinshSprint =  new Sprite[IconCount]; 
		for (int i = 0; i < 9; i++)
		{
			int Temp = i + 1;
			NormalSprint[i]=Resources.Load("card/"+Temp+"A", typeof(Sprite)) as Sprite;
			FinshSprint[i] = Resources.Load("card/" + Temp + "B", typeof(Sprite)) as Sprite;
		}

		
		PokerBG1 = Resources.Load("card/PokerBG"+level, typeof(Sprite)) as Sprite;

		for (int i=0;i<childImg.Length;i++)
		{
			childImg[i].GetComponent<Button>().onClick.AddListener(CardClicEvent);
			
		}
		InvokeRepeating("Min", 0, 1f);
//		Debug.Log(NormalSprint.Length);
	}
	void Min()
	{
		CTime--;
		CountDownText.text = CTime + "";
		if (CTime == 1)
		{
			GameOver.gameObject.SetActive(true);
		}
		if (CTime == 0)
		{
			Time.timeScale = 0;
		}
	}

	public void LoadGame(int index)
	{
		SceneManager.LoadScene(index);
	}

	public void LoadGame()
	{
		level++;
		Debug.Log(level);
		SceneManager.LoadScene(level);
	}

	void CardClicEvent()
	{
		

		//获取点击到的按钮后的下标  及子物的下标
		TempIndex = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.GetComponent<Button>().transform.GetSiblingIndex()% RamDomCard.Count;

		if (BtnSecondNumCard != null && BtnFirstNumCard != null)
		{ 
			if (BtnSecondNumCard.GetComponent<Image>().sprite.name == BtnFirstNumCard.GetComponent<Image>().sprite.name && BtnFirstNumCard!=BtnSecondNumCard)
			{

				BtnSecondNumCard.GetComponent<Image>().sprite = FinshSprint[RamDomCard[TempIndex]];
				BtnFirstNumCard.GetComponent<Image>().sprite  = FinshSprint[RamDomCard[TempIndex]];


				BtnSecondNumCard.enabled = false;
				BtnFirstNumCard.enabled = false;

				BtnSecondNumCard = null;
				BtnFirstNumCard = null;
				return;
			}
			else
			{
				BtnSecondNumCard.GetComponent<Image>().sprite = PokerBG1;
				BtnFirstNumCard.GetComponent<Image>().sprite = PokerBG1;

				BtnSecondNumCard = null;
				return;
			}
		}


		if (isFirstClick)
		{
			BtnFirstNumCard = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.GetComponent<Button>();

			BtnFirstNumCard.GetComponent<Image>().sprite = NormalSprint[RamDomCard[TempIndex]];

			isFirstClick = false;
		}
		else
		{
			isFirstClick = true;

			BtnSecondNumCard = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.GetComponent<Button>();
			Debug.Log(BtnSecondNumCard.transform.GetSiblingIndex());
			if (BtnSecondNumCard.GetComponent<Image>().sprite.name == BtnFirstNumCard.GetComponent<Image>().sprite.name && BtnFirstNumCard != BtnSecondNumCard)
			{
				BtnSecondNumCard.GetComponent<Image>().sprite = FinshSprint[RamDomCard[TempIndex]];
				BtnFirstNumCard.GetComponent<Image>().sprite = FinshSprint[RamDomCard[TempIndex]];

				BtnSecondNumCard.enabled = false;
				BtnFirstNumCard.enabled = false;
				BtnSecondNumCard = null;
				BtnFirstNumCard = null;
				return;
			}


			BtnSecondNumCard.GetComponent<Image>().sprite = NormalSprint[RamDomCard[TempIndex]];

		
			
			
		}
	}

	void Start ()
	{
		RamDomCard=	CreateRandomDoublePlayerCard(CardCount/2,9);
	}

	int Maxc(int C)
	{

		return C;
	}



	/// <summary>
	///  产生随机 RandomCard对 数字 卡牌
	/// </summary>
	/// <param name="RandomCard">要随机的对数</param>
	/// <param name="cardKind">卡牌的种类</param>
	List<int> CreateRandomDoublePlayerCard(int RandomCard,int cardKind)
	{
		List<int> al = new List<int>();
		for (int i = 0; i < RandomCard; i++)
		{
			int x = Random.Range(0, cardKind);
			
			al.Add(x);
		}
		for (int i = 0; i < RandomCard; i++)
		{
			int temp = al[i];
			al.Add(temp);
		}
		//打乱交换位置 
		for (int i=0; i<al.Count;i++)
		{
			int RandomIndex = Random.Range(0, al.Count);

			 al[i] = al[i]+ al[RandomIndex];
			al[RandomIndex] = al[i] -al[RandomIndex] ;
			al[i] = al[i] - al[RandomIndex];
		}
		Debug.Log(al.Count);
		return al;
	}



	// Update is called once per frame
	void Update ()
	{
		if (BtnSecondNumCard != null && BtnFirstNumCard != null)
		{ 
				if (BtnSecondNumCard.GetComponent<Image>().sprite.name == BtnFirstNumCard.GetComponent<Image>().sprite.name && BtnFirstNumCard != BtnSecondNumCard)
			{
				BtnSecondNumCard.GetComponent<Image>().sprite = FinshSprint[RamDomCard[TempIndex]];
				BtnFirstNumCard.GetComponent<Image>().sprite = FinshSprint[RamDomCard[TempIndex]];
				RewordCourt++;
				Debug.Log(RewordCourt);

				if (RewordCourt == CardCount / 2)
				{
					Win.gameObject.SetActive(true);
				}
				BtnSecondNumCard.enabled = false;
				BtnFirstNumCard.enabled = false;
				BtnSecondNumCard = null;
				BtnFirstNumCard = null;
				return;
			}
		}
	}
}


猜你喜欢

转载自blog.csdn.net/qq2512667/article/details/80911161
今日推荐