其实比较简单。 主要就是对数组的使用,以及一些简单的逻辑思维。
游戏主要是这样,翻开牌,如果两张背面都是一样的,就消除,如果不一样就隐藏起来,要把所有的牌都翻完,就算胜利。
首先这里要先 产生 随机的 数字卡牌 的数组,生成的数组里的数字要有对应才可以,然后顺序要打乱,
这里直接贴出 代码
/// <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);
int temp= al[i];//先存起来
al[i]= al[RandomIndex];//随机交换
al[RandomIndex]=temp;
//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;
}
}
}
}