目录结构
public class Define
{
public const int FLOWER_SPADE = 3;// 黑桃
public const int FLOWER_HEART = 2;// 红桃
public const int FLOWER_CLUB = 1;// 梅花
public const int FLOWER_DIAMOND = 0;// 方片
public const int NUM_A = 14;
public const int NUM_K = 13;
public const int NUM_Q = 12;
public const int NUM_J = 11;
public const int NUM_10 = 10;
public const int NUM_9 = 9;
public const int NUM_8 = 8;
public const int NUM_7 = 7;
public const int NUM_6 = 6;
public const int NUM_5 = 5;
public const int NUM_4 = 4;
public const int NUM_3 = 3;
public const int NUM_2 = 2;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class PlayerUtil
{
// 将一副牌按牌面从大到小排序
public static void SortPlayerByNumber(Player player)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3 - i - 1; j++)
{
if (player.cards[j].number < player.cards[j + 1].number)
{
Card tempCard = player.cards[j];
player.cards[j] = player.cards[j + 1];
player.cards[j + 1] = tempCard;
}
}
}
}
// 将一副牌按花色从大到小排序
public static void SortPlayerByFlower(Player player) {
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3 - i - 1; j++)
{
if (player.cards[j].flower < player.cards[j + 1].flower)
{
Card tempCard = player.cards[j];
player.cards[j] = player.cards[j + 1];
player.cards[j + 1] = tempCard;
}
}
}
}
// 将对子移动到一幅牌的前两位
public static void MoveDouble2Front(Player player)
{
if (player.cards[1].number == player.cards[2].number)
{
Card tempCard = player.cards[0];
player.cards[0] = player.cards[2];
player.cards[2] = tempCard;
}
}
// 将对子已经处于一副牌的前两张的牌,移动对子中花色大的到最前面
public static void ExchangeSortedDoubleFlower(Player player)
{
if (player.cards[0].flower < player.cards[1].flower)
{
Card tempCard = player.cards[0];
player.cards[0] = player.cards[1];
player.cards[1] = tempCard;
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class Card
{
public int number { get; set; }
public int flower { get; set; }
public Card() { }
public Card(int flower, int number)
{
this.flower = flower;
this.number = number;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class Player
{
public int index {get; set;}
public Card[] cards = new Card[3];
public int type { get; set; }
public bool isSpecial { set; get; }
public int value { get; set; }
public Player()
{
}
public Player(Card card0, Card card1, Card card2)
{
this.cards[0] = card0;
this.cards[1] = card1;
this.cards[2] = card2;
}
public Card[] GetCards()
{
return cards;
}
public void SetCards(Card[] cards)
{
this.cards = cards;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
/**
* 发牌器,洗牌发牌
*/
public interface PlayerProvider
{
// 产生单副牌
Player GetSinglePlayer();
// 产生多副牌
List<Player> GetPlayers(int number);
// 发一张牌
Card GetCard();
// 洗牌
void Shuffle();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
/**
* 一副牌
*/
public class LimitedPlayerProvider : PlayerProvider
{
private List<Card> cards = new List<Card> ();
private Random random = new Random();
public LimitedPlayerProvider()
{
InitCards();
}
public void InitCards()
{
cards.Clear();
for (int i = 14; i > 1; i--)
{
for (int j = 3; j >= 0; j--)
{
Card card = new Card(j, i);
cards.Add(card);
}
}
}
public Player GetSinglePlayer()
{
if (cards.Count < 3)
{
Debug.Log("牌不够......");
return null;
}
Player player = new Player();
for (int i = 0; i < 3; i++)
{
player.cards[i] = GetCard();
}
PlayerUtil.SortPlayerByNumber(player);
return player;
}
public List<Player> GetPlayers(int number)
{
if ( number * 3 > cards.Count)
{
return null;
}
List<Player> players = new List<Player> ();
for (int i = 0; i < number; i++)
{
Player player= GetSinglePlayer();
players.Add(player);
}
return players;
}
// 发一张牌
public Card GetCard()
{
if (cards.Count <= 0)
{
return null;
}
int cardIndex = Random.Range(0, cards.Count);
Card card = cards[cardIndex];
cards.RemoveAt(cardIndex);
return card;
}
// 洗牌
public void Shuffle()
{
InitCards();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class TypeValueSetter
{
private ValueCalculator calculator;
public TypeValueSetter(ValueCalculator calculator)
{
this.calculator = calculator;
}
public void RegPlayerType(Player player)
{
if (IsFlush(player))
{
if (IsStraight(player))
{
player.type = PlayerType.STRAIGHT_FLUSH;
player.value = calculator.GetStraightFlushValue(player);
}
else
{
player.type = PlayerType.FLUSH;
player.value = calculator.GetFlushValue(player);
}
}
else if (IsStraight(player))
{
player.type = PlayerType.STRAIGHT;
player.value = calculator.GetStraightValue(player);
}
else if (IsDouble(player))
{
if (IsBomb(player))
{
player.type = PlayerType.BOMB;
player.value = calculator.GetBombValue(player);
}
else {
player.type = PlayerType.DOUBLE;
PlayerUtil.MoveDouble2Front(player);
player.value = calculator.GetDoubleValue(player);
}
}
else
{
player.type = PlayerType.NORMAL;
player.value = calculator.GetNormalValue(player);
if (IsSpecial(player))
{
player.isSpecial = true;
}
}
}
private bool IsFlush(Player player)
{
return player.cards[0].flower == player.cards[1].flower
&& player.cards[1].flower == player.cards[2].flower;
}
private bool IsStraight(Player player)
{
return ((player.cards[0].number == player.cards[1].number + 1)
&& player.cards[1].number == player.cards[2].number + 1);
}
private bool IsBomb(Player player)
{
return (( player.cards[0].number == player.cards[1].number )
&& (player.cards[1].number == player.cards[2].number));
}
private bool IsDouble(Player player)
{
return player.cards[0].number == player.cards[1].number
|| player.cards[1].number == player.cards[2].number;
}
private bool IsSpecial(Player player)
{
return player.cards[0].number == 5 && player.cards[1].number == 3 && player.cards[2].number == 2;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class PlayerComparator : IComparer<Player>
{
private TypeValueSetter recognizer;
public PlayerComparator(ValueCalculator calculator)
{
this.recognizer = new TypeValueSetter(calculator);
}
public void SetupRegularPlayer(Player player)
{
recognizer.RegPlayerType(player);
}
public void SetupUnRegularPlayer(Player player)
{
PlayerUtil.SortPlayerByNumber(player);
recognizer.RegPlayerType(player);
}
public void SortRegularPlayers(List<Player> playersInput)
{
foreach(Player player in playersInput)
{
recognizer.RegPlayerType(player);
}
}
public int Compare(Player player1, Player player2)
{
return (player1.value - player2.value);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerType
{
public const int BOMB = 5;
public const int BOMB_MAX_VALUE = 7881;
public const int STRAIGHT_FLUSH = 4;
public const int STRAIGHT_FLUSH_MAX_VALUE = 7867;
public const int FLUSH = 3;
public const int FLUSH_MAX_VALUE = 7855;
public const int STRAIGHT = 2;
public const int STRAIGHT_MAX_VALUE = 4052;
public const int DOUBLE = 1;
public const int DOUBLE_MAX_VALUE = 4040;
public const int NORMAL = 0;
public const int NORMAL_MAX_VALUE = 3803;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public interface ValueCalculator
{
int GetBombValue(Player player);
int GetStraightFlushValue(Player player);
int GetFlushValue(Player player);
int GetStraightValue(Player player);
int GetDoubleValue(Player player);
int GetNormalValue(Player player);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameCore
{
public class FlowerValueCalculator : ValueCalculator
{
private int GetFlowerValue(Player player)
{
return player.cards[0].flower * 16 + player.cards[1].flower * 4 + player.cards[2].flower;
}
private int GetA32FlowerValue(Player player)
{
return player.cards[1].flower * 16 + player.cards[2].flower * 4 + player.cards[0].flower;
}
public int GetBombValue(Player player)
{
PlayerUtil.SortPlayerByFlower(player);
return (player.cards[0].number + PlayerType.STRAIGHT_FLUSH_MAX_VALUE) * 64 + GetFlowerValue(player);
}
public int GetStraightFlushValue(Player player)
{
return (player.cards[2].number + PlayerType.FLUSH_MAX_VALUE) * 64 + GetFlowerValue(player);
}
public int GetFlushValue(Player player)
{
return (player.cards[0].number * 256 + player.cards[1].number * 16 + player.cards[2].number
+ PlayerType.STRAIGHT_MAX_VALUE) * 64 + GetFlowerValue(player);
}
public int GetStraightValue(Player player)
{
return (player.cards[2].number + PlayerType.DOUBLE_MAX_VALUE) * 64 + GetFlowerValue(player);
}
public int GetDoubleValue(Player player)
{
PlayerUtil.ExchangeSortedDoubleFlower(player);
return (player.cards[1].number * 16 + player.cards[2].number + PlayerType.NORMAL_MAX_VALUE) * 64
+ GetFlowerValue(player);
}
public int GetNormalValue(Player player)
{
return (player.cards[0].number * 256 + player.cards[1].number * 16 + player.cards[2].number) * 64
+ GetFlowerValue(player);
}
}
}