トランプゲームを作るときなんかに使えそうなコードのメモ。
まず通常カード52枚とジョーカー2枚を0~53までの整数で管理する。
ゲームで使う時にはnum/13をスート、num%13+1を数とする。
あとカード全体、デッキ、場のカードで分けて管理している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using UnityEngine; using System.Collections.Generic; //0_0 - 3_13(通常カード) + 4_0,4_1(ジョーカー) //0:スペード 1:ハート 2:ダイヤ 3:クラブ public class Card : MonoBehaviour { public static int[] card = new int[54];//54枚数のカード 13*4+2 public static List<int> deck = new List<int>();//デッキ public static List<int> field = new List<int>();//場のカード public static void Init () { if(deck .Count!=0) deck = new List<int>(); if(field.Count!=0) field = new List<int>(); for(int i = 0; i < card.Length; i++){ card[i] = i; } Shuffle(); //カードを混ぜる deck.AddRange(card); //デッキにする } //カード全体のシャッフル 早い? public static void Shuffle(){ for (int i = 0; i < card.Length; i++){ int _r = Random.Range(0,card.Length); //0<=_r<=length-1 int _t=card[i]; card[i]=card[_r]; card[_r]=_t; //swap } } //デッキのシャッフル 遅い? public static void ShuffleDeck(){ for (int i = 0; i < deck.Count; i++){ int _r = Random.Range(0,deck.Count); //0<=_r<=count-1 int _t = deck[_r]; deck.RemoveAt(_r); deck.Insert(i,_t); } } //カードを配る public static List<int> DealCard(int n){ List<int> l = deck.GetRange(0,n); deck.RemoveRange(0,n); return l; } //場のカードを流してデッキに戻す public static void Revert(){ foreach(int x in field)Card.deck.Add(x); field = new List<int>(); } public static void TestShowCard () { for (int i = 0; i < card.Length; i++){ Debug.Log((card[i] / 13) +"_"+ (card[i]%13 + 1)); } } public static void TestShowDeck () { for (int i = 0; i < deck.Count; i++){ Debug.Log((deck[i] / 13) +"_"+ (deck[i]%13 + 1)); } } } |
こんな感じで使ってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//カードを配る void DealCards(){ Card.Init(); int dealNum = 10; for(int i=-1;i<blue.ids.Count;i++){ List<int> hand = Card.DealCard(dealNum); hands.Add(hand); string _s=""; foreach(int j in hand)_s+=j+","; string msg = "deal:"+_s.Substring(0,_s.Length-1); blue.BluetoothSendMessageS2C(msg,blue.ids[ i ]); //対応クライアントに配る } } //場が流れたとき void FieldSweep(){ Card.Revert(); Card.Shuffle(); //全体通知など } |
通信で使う時は基本的にサーバが管理して、配られたカードや出されたカードだけクライアントに配信すればよさそうです。