我正在統一開發紙牌游戲。我有 5 張不同的牌(A、B、C、D、E),我手上最多可以有 8 張牌。而且我有一個抽獎按鈕。因此,一旦抽出一張牌,點擊抽獎按鈕。所以所有這些功能都準備好了。但是我想在抽出的那些牌中執行一個動作。如果任何三張牌相似。
例如:- 我抽出 5 張牌,抽出的牌按以下順序排列:A、A、A、B、C 現在,如您所見,我有 3-AI 想要執行 A 動作。或者如果卡片是這樣的 A,B,C,C,C,E 如果要執行 C 功能,因為有 3 個 C。因此,如果 3 張卡片型別相同,我想執行與之相關的操作。
所以為了更簡單,我將解釋一次流程。Card-Draw Button 點擊?? -> 每次點擊繼續獲取卡片 -> 將卡片添加到名為 _CardList 的串列中并對串列中的卡片進行排序 -> 如果有 3 張相同的卡片,則執行操作。我在最后一次檢查卡時遇到問題。
我已經做了一個方法,但它超級龐大,不可取。所以,如果你們能在這方面幫助我,那將會對我有很大幫助。謝謝,我會在下面用我嘗試過的方法發布我所有的疑問和問題。
Try#1
Have multiple list like:
List<Card> Alist;
List<Card> BList; //and so on until And keep creating list as long as card type
.
.
List<Card> Elist;
void DrawButton() // Function thats passed to the button. Meaning what to happen when draw button is clicked
{
//Here we instantiate the card randomly from a list given from inspector.
GameObject card = Instantiate(cards._cardModel, _playerHandPoints[clicks].localPosition, _playerHandPoints[clicks].localRotation, mCardHolderParent.transform);
//We access the card script attached to card and give its type and everything
Cards cardDetails = card.GetComponent<Cards>();
cardDetails._cardType = cards._cardType;
//Here we pass the instantiated card
AddNewCard(card.GetComponent<Cards>());
//Every time after adding we check if any list count is 3 and perform related action
CardMatchThreeChecker();
}
AddNewCard(Card inNewCard)
{
//in this function we check the card type and add it to their specific list & also add it to _cardList.
switch (inNewCard._cardType)
{
case CardType.A: AList.Add(inNewCard);
break;
case CardType.B: BList.Add(inNewCard);
break;
case CardType.C: CList.Add(inNewCard);
break;
case CardType.D: DList.Add(inNewCard);
break;
case CardType.E: EList.Add(inNewCard);
break;
default:
break;
}
_CardList.Add(inNewCard);
}
void CardMatchThreeChecker()
{
if (AList.Count == 3)
{
SceneManager.LoadScene(1);
}
if (BList.Count == 3)
{
SceneManager.LoadScene(2);
}
if (CList.Count == 3)
{
SceneManager.LoadScene(3);
}
if (DList.Count == 3)
{
SceneManager.LoadScene(4);
}
if (EList.Count == 3)
{
SceneManager.LoadScene(5);
}
}
問題 - 1:使用上述方法是,如果我將來添加任何新卡,我需要繼續添加許多串列,這是不可取的,因為一次可玩的卡也可以是 20 或更多
問題-2:沒有使用包含所有實體化卡片的串列“_cardList”。
Question - 1 Instead I want to check if any 3 things are similar in the _CardList List itself. Like every time I draw a card they all go and add themself to cardlist's List and I want to check if any three elements are similar in the list then perform the related action. I searched in internet but dint find or get an idea for what to do or how to try.
But Yet I tried a method but now im stuck in that too.Method metioned Below
These lines below come under a function called CardChecking() That is called in DrawButton(). Here Im saying it to check the list only if card count is more than 2 because we have a match only if 3 cards are there and we cant have a match if cards are less that 3 as we are checking if there are 3 similar cards. And as we want to check the elements of the list we have a for loop with (i,i 1,i 2) making it checking elements of the cardlist. Problem of this outside the snippet.
for (int i = 0; i < _CardList.Count; i )
{
if (_CardList.Count > 2)
{
if(_CardList[i]._cardType == _CardList[i 1]._cardType && _CardList[i 1]._cardType == _CardList[i 2]._cardType)
{
SceneManager.LoadScene(_CardList[i]._cardType.ToString());
}
else
{
continue;
}
}
}
我面臨的問題是:例如,如果我抽了 3 張牌,我的卡片串列數將為 3,這將滿足我的條件并檢查功能。如果我的卡片型別不同,那么它會進入下一個迭代,那時我的 i 值將是 cardList[1] || cardList[2] && cardList[2] || cardList[3] 意味著我的卡值 1,2 & 3 在我的 for 回圈的第二次迭代中但是當它檢查 cardList[3] 時它拋出 Index out of range 因為我的 cardlist 計數是 3 并且它沒有第 4 個元素for 回圈正在檢查。所以不知道如何克服這個。
uj5u.com熱心網友回復:
要解決問題 - 1,您可以使用 Dictionary<CardType,List> :
Dictionary<CardType,List<Card>> cardListDictionary = new Dictionary<CardType, List<Card>>();
AddNewCard(Card inNewCard)
{
if (!cardListDictionary.TryGetValue(inNewCard._cardType,out var list))
{
list = new List<Card>();
cardListDictionary.Add(inNewCard._cardType,list);
}
list.Add(inNewCard);
}
為了解決問題 - 2,像這樣實作 CardChecking:
void CardChecking()
{
if (_CardList.Count > 2)
{
var type = _CardList[0]._cardType;
var count = 1;
for (int i = 1; i < _CardList.Count; i )
{
if(_CardList[i]._cardType == type)
{
count ;
if (count == 3)
{
SceneManager.LoadScene(type.ToString());
}
}
else
{
type = _CardList[i]._cardType;
count = 1;
}
}
}
}
uj5u.com熱心網友回復:
好吧,不知道我是否看對了整個畫面。讓我簡化一下問題,如果它有效,那么就有一個解決方案。
問題:我有一個卡片串列,如果串列中有 3 個相同型別的卡片,我需要執行一個操作。
答:使用 Linq 按型別對串列進行分組。然后,過濾結果以找到“3-cards case”。
干得好:
var answer = _CardList
.GroupBy(c => c.GetCardType())
.ToDictionary(g => g.Key, g => g.Count()) // Count by the card type.
.Where(x => x.Value >= 3) // Three or more cards of the same type.
.Select(x => x.Key) // Fetch the card type.
.FirstOrDefault(); // Only one match is needed.
if (answer != null) {
// answer is the type of the card that is counted 3 or more times.
}
如果需要檢測所有的“三張牌”,請移除FirstOrDefault并處理收集。
uj5u.com熱心網友回復:
我認為卡片的順序無關緊要,并認為您正在尋找LinqGroupBy
// Just a simplified example since you didn't show your Card class
class Card
{
public CardType _cardType;
public Card(CardType type)
{
_cardType = type;
}
}
var list = new List<Card>
{
new Card(CardType.A),
new Card(CardType.B),
new Card(CardType.C),
new Card(CardType.C),
new Card(CardType.B),
new Card(CardType.B),
new Card(CardType.A),
new Card(CardType.A),
new Card(CardType.B)
};
// This creates separated groups according to the value of the card
var groups = list.GroupBy(c => c._cardType)
// Then it filters out only those groups that have 3 or more items
.Where(g => g.Count() >= 3);
// Then you can simply iterate through them
foreach (var @group in groups)
{
// The Key is the value the grouping was based on
// so in this example the Card._cardType
Debug.Log($"There are {@group.Count()} cads with cardType = {@group.Key}");
// you can also get all the according cards if needed
//var cards = @group.ToArray();
}
將列印
There are 3 cards with cardType = A
There are 4 cards with cardType = B
此外,如果您只想獲得擁有3物品的第一組,并且無論如何已經知道永遠不會同時有兩個或更多,您可以去
// again first create separate groups based on the value
var group = list.GroupBy(c => c._cardType)
// Pick the first group that has at least 3 items
// or NULL if there is none
.FirstOrDefault(g => g.Count() >= 3);
if (group != null)
{
Debug.Log($"Found a group of {group.Count()} for the value = {group.Key}!");
}
else
{
Debu.Log("There is no group with 3 elements yet...");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336726.html
上一篇:LaravelSocialite-升級Twitch范圍
下一篇:將串列中的項連接成一個串列項
