总的卡组使用字典实现,当前剩余卡牌用列表表示,因为removeat方法可以方便的实现抽卡。用随机下标模拟抽卡的随机过程,用列表表示手卡
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class Deck : MonoBehaviour
{
string[] deckfile;
string filepath;
int i;
Dictionary<int, int> deck = new();
List<int> Remaining_decks = new List<int>();//剩余卡组
public GameObject card;
GameObject hands;
// Start is called before the first frame update
void Start()
{
hands = GameObject.Find("Hand");
i = 1;
//通过文件获取卡组
filepath = Application.dataPath+"/Deck/Deck.CSV";
deckfile = File.ReadAllLines(filepath);
while (deckfile.Length > i)
{
string[] line= deckfile[i].Split(',');
if (line[0] == "\n")
{
break;
}
//Debug.Log(line[1]);
int.TryParse(line[0], out int i1);
int.TryParse(line[1], out int i2);
for (; i2 >0; i2--)
{
Remaining_decks.Add(i1);
}
i++;
}
}
// Update is called once per frame
void Update()
{
}
//抽卡
public void GetCards()
{
int cardid=Random.Range(0,Remaining_decks.Count);
//生成一张卡牌
if(Remaining_decks.Count > 0)
{
//如果手卡满了就不允许再抽卡
if (hands.GetComponent<HandShow>().AddCard(Remaining_decks[cardid]))
{
GameObject newcard = Instantiate(card, hands.transform);
newcard.transform.GetComponent<CardShow>().CardNumber = Remaining_decks[cardid];
string path = "Exusiai_Card/" + Remaining_decks[cardid].ToString();
newcard.transform.GetComponent<Image>().sprite = Resources.Load<Sprite>(path);
Remaining_decks.RemoveAt(cardid);
}
}
else
{
Debug.Log("卡组没卡了");
}
}
}