コード例 #1
0
 public void PlayCard(Player player, Card card)
 {
     // move card to Skat
     if (GamePlayer == player && SkatTaken && !GameStarted)
     {
         if (Skat.Count < 2)
         {
             player.Cards.Remove(card);
             Skat.Add(card);
         }
     }
     else if (GameStarted && CurrentPlayer == player)
     {
         if (Stitch.Count == 3)
         {
             CollectStitch(player);
             if (player.Cards.Count == 0)
             {
                 return; // game ended
             }
         }
         if (IsValidForStitch(card))
         {
             player.Cards.Remove(card);
             CurrentPlayer = GetNextPlayer(player);
             Stitch.Add(card);
             if (Stitch.Count == 3)
             {
                 var stichPlayer = GetStitchPlayer();
                 stichPlayer.Stitches.AddRange(Stitch);
                 CurrentPlayer = stichPlayer;
             }
         }
     }
 }
コード例 #2
0
        public void GiveUp()
        {
            // add all cards on the game player's hand to the stitch of one opponent player
            Player opponentPlayer = null;

            foreach (var p in Players)
            {
                if (p != GamePlayer && opponentPlayer == null)
                {
                    opponentPlayer = p;
                    p.Stitches.AddRange(GamePlayer.Cards);
                    p.Stitches.AddRange(GamePlayer.Stitches);
                    p.Stitches.AddRange(p.Cards);
                    p.Stitches.AddRange(Skat);
                    p.Stitches.AddRange(Stitch);
                    p.Cards.Clear();
                    GamePlayer.Cards.Clear();
                    GamePlayer.Stitches.Clear();
                    Skat.Clear();
                    Stitch.Clear();
                }
                else if (p != GamePlayer && opponentPlayer != null)
                {
                    opponentPlayer.Stitches.AddRange(p.Cards);
                    p.Cards.Clear();
                }
            }
            var game = GamePlayer.Game;

            GameValue         = game.GetGameValue(MatadorsJackStraight, GamePlayer.Stitches, Skat, CurrentBidValue, true);
            GamePlayer.Score += GameValue.Score;
        }
コード例 #3
0
        public SkatTable(string player1, string player2, string player3, string player4 = null)
        {
            if (player4 != null)
            {
                Players.Add(new Player(player1, PlayerPosition.Forehand));
                Players.Add(new Player(player2, PlayerPosition.Middlehand));
                Players.Add(new Player(player3, PlayerPosition.Rearhand));
                InactivePlayer = new Player(player4, PlayerPosition.Inactive);
                TablePlayers.Add(InactivePlayer);
                TablePlayers.AddRange(Players);
            }
            else
            {
                Players.Add(new Player(player1, PlayerPosition.Rearhand));
                Players.Add(new Player(player2, PlayerPosition.Forehand));
                Players.Add(new Player(player3, PlayerPosition.Middlehand));
                TablePlayers.AddRange(Players);
            }
            SkatResult     = new SkatResult();
            CurrentHistory = new GameHistory();
            var deck = Card.GenerateDeck();

            foreach (var player in Players)
            {
                player.Cards.AddRange(Card.Draw(deck, 10));
                player.SortCards();
                CurrentHistory.PlayerCards.Add((player.Name, new List <Card>(player.Cards)));
            }
            Skat.AddRange(Card.Draw(deck, 2));
            CurrentHistory.Skat.AddRange(Skat);
            var s = new HashSet <int>();

            // farbe
            for (int m = 2; m < 18; m++) // mit 10 spielt 11 hand 12 schneider 13 angesagt 14 schwarz 15 angesagt 16 ouvert 17
            {
                s.Add(m * 9);
                s.Add(m * 10);
                s.Add(m * 11);
                s.Add(m * 12);
            }
            // grand
            for (int m = 2; m < 12; m++) // mit 4 spielt 5 hand 6 schneider 7 angesagt 8 schwarz 9 angesagt 10 overt 11
            {
                s.Add(m * 24);
            }
            // null
            s.Add(23);
            // null hand
            s.Add(35);
            // null ouvert
            s.Add(46);
            // null ouvert hand
            s.Add(59);
            BidValues = s.ToList <int>();
            BidValues.Sort();
        }
コード例 #4
0
        public void StartNewRound()
        {
            GameCounter += 1;
            foreach (var p in Players)
            {
                p.Stitches.Clear();
                p.Cards.Clear();
                p.Game = new Game(GameType.Grand);
                switch (p.Position)
                {
                case PlayerPosition.Middlehand:
                    p.Position  = PlayerPosition.Forehand;
                    p.BidStatus = BidStatus.Accept;
                    break;

                case PlayerPosition.Rearhand:
                    p.Position  = PlayerPosition.Middlehand;
                    p.BidStatus = BidStatus.Bid;
                    break;

                case PlayerPosition.Forehand:
                    p.Position  = PlayerPosition.Rearhand;
                    p.BidStatus = BidStatus.Wait;
                    break;

                default:
                    break;
                }
            }
            MatadorsJackStraight = null;
            GameStarted          = false;
            GamePlayer           = null;
            GameValue            = null;
            SkatTaken            = false;
            CurrentPlayer        = null;
            Stitch.Clear();
            Skat.Clear();
            LastStitch.Clear();
            using (var rng = new RNGCryptoServiceProvider())
            {
                var deck = Card.GenerateDeck();
                foreach (var player in Players)
                {
                    player.Cards.AddRange(Card.Draw(rng, deck, 10));
                }
                Skat.AddRange(Card.Draw(rng, deck, 2));
            }
            BidSaid       = false;
            BidValueIndex = -1;
            BidExceeded   = false;
        }
コード例 #5
0
        public SkatTable(string player1, string player2, string player3)
        {
            Players.Add(new Player(player1, PlayerPosition.Rearhand));
            Players.Add(new Player(player2, PlayerPosition.Forehand));
            Players.Add(new Player(player3, PlayerPosition.Middlehand));
            using (var rng = new RNGCryptoServiceProvider())
            {
                var deck = Card.GenerateDeck();
                foreach (var player in Players)
                {
                    player.Cards.AddRange(Card.Draw(rng, deck, 10));
                    player.SortCards();
                }
                Skat.AddRange(Card.Draw(rng, deck, 2));
            }
            var s = new HashSet <int>();

            // farbe
            for (int m = 2; m < 18; m++) // mit 10 spielt 11 hand 12 schneider 13 angesagt 14 schwarz 15 angesagt 16 ouvert 17
            {
                s.Add(m * 9);
                s.Add(m * 10);
                s.Add(m * 11);
                s.Add(m * 12);
            }
            // grand
            for (int m = 2; m < 12; m++) // mit 4 spielt 5 hand 6 schneider 7 angesagt 8 schwarz 9 angesagt 10 overt 11
            {
                s.Add(m * 24);
            }
            // null
            s.Add(23);
            // null hand
            s.Add(35);
            // null ouvert
            s.Add(46);
            // null ouvert hand
            s.Add(59);
            BidValues = s.ToList <int>();
            BidValues.Sort();
        }
コード例 #6
0
 public void PickupSkat(Player player, Card card)
 {
     Skat.Remove(card);
     player.Cards.Add(card);
 }
コード例 #7
0
        public void PerformPlayerAction(Player player, ActionType actionType)
        {
            switch (actionType)
            {
            case ActionType.TakeSkat:
                SkatTaken = true;
                break;

            case ActionType.PlayHand:
                SetGameOption(player, player.Game.Option | GameOption.Hand);
                break;

            case ActionType.StartGame:
                StartGame(player);
                break;

            case ActionType.DoNotPlayHand:
                var gameOption = player.Game.Option & ~GameOption.Hand;
                if (player.Game.Type != GameType.Null)
                {
                    gameOption &= ~GameOption.Ouvert;
                }
                SetGameOption(player, gameOption);
                break;

            case ActionType.Bid:
                BidSaid = true;
                MoveNextBidValue();
                break;

            case ActionType.PassBid:
                player.BidStatus = BidStatus.Pass;
                foreach (var p in Players)
                {
                    if (p.Position == PlayerPosition.Rearhand && p.BidStatus != BidStatus.Pass)
                    {
                        p.BidStatus = BidStatus.Bid;
                        break;
                    }
                }
                BidSaid = false;
                break;

            case ActionType.HoldBid:
                BidSaid = false;
                break;

            case ActionType.PassHold:
                BidSaid          = false;
                player.BidStatus = BidStatus.Pass;
                foreach (var p in Players)
                {
                    if (p.Position == PlayerPosition.Rearhand && p.BidStatus != BidStatus.Pass)     // weitersagen
                    {
                        p.BidStatus = BidStatus.Bid;
                    }
                    else if (p.Position == PlayerPosition.Middlehand && p.BidStatus != BidStatus.Pass)     // hoeren
                    {
                        p.BidStatus = BidStatus.Accept;
                    }
                }
                break;

            default:
                break;
            }
            if (actionType == ActionType.PassBid ||
                actionType == ActionType.PassHold ||
                actionType == ActionType.Bid)
            {
                // find if all player have given up
                Player gamePlayer = null;
                var    cntPassen  = 0;
                foreach (var p in Players)
                {
                    if (p.BidStatus != BidStatus.Pass)
                    {
                        gamePlayer = p;
                        continue;
                    }
                    cntPassen++;
                }
                // all gave up
                if (cntPassen == 3)
                {
                    GamePlayer = Players[0];
                    GameValue  = new GameValue {
                        Score = 0
                    };
                    GameStarted = true;
                    foreach (var p in Players)
                    {
                        p.Cards.Clear();
                        p.Stitches.Clear();
                    }
                    Skat.Clear();
                    Stitch.Clear();
                    CurrentHistory.GamePlayerScore = 0;
                    CurrentHistory.GameValue       = 0;
                    SkatResult.History.Add(CurrentHistory);
                    SkatResult.EndedUtc = DateTime.UtcNow;
                }
                // two player gave up, remaing playing is the game player
                else if (gamePlayer != null && cntPassen == 2)
                {
                    if (gamePlayer.Position == PlayerPosition.Forehand && CurrentBidValue == 0)
                    {
                        gamePlayer.BidStatus = BidStatus.Bid;
                    }
                    else
                    {
                        GamePlayer  = gamePlayer;
                        GameStarted = false;
                        SkatTaken   = false;
                    }
                }
            }
        }
コード例 #8
0
        public void StartNewRound()
        {
            GameCounter += 1;
            if (InactivePlayer == null)
            {
                foreach (var p in Players)
                {
                    p.Stitches.Clear();
                    p.Cards.Clear();
                    p.Game = new Game(GameType.Grand);
                    switch (p.Position)
                    {
                    case PlayerPosition.Middlehand:
                        p.Position  = PlayerPosition.Forehand;
                        p.BidStatus = BidStatus.Accept;
                        break;

                    case PlayerPosition.Rearhand:
                        p.Position  = PlayerPosition.Middlehand;
                        p.BidStatus = BidStatus.Bid;
                        break;

                    case PlayerPosition.Forehand:
                        p.Position  = PlayerPosition.Rearhand;
                        p.BidStatus = BidStatus.Wait;
                        break;

                    default:
                        break;
                    }
                }
            }
            else
            {
                var nextPlayers = new Player[3];
                var newPlayer   = InactivePlayer;
                newPlayer.Position  = PlayerPosition.Rearhand;
                newPlayer.BidStatus = BidStatus.Wait;
                newPlayer.Stitches.Clear();
                newPlayer.Cards.Clear();
                newPlayer.Game = new Game(GameType.Grand);
                nextPlayers[2] = newPlayer;
                foreach (var p in Players)
                {
                    p.Stitches.Clear();
                    p.Cards.Clear();
                    p.Game = new Game(GameType.Grand);
                    if (p.Position == PlayerPosition.Forehand)
                    {
                        InactivePlayer = p;
                        p.Position     = PlayerPosition.Inactive;
                        p.BidStatus    = BidStatus.Wait;
                    }
                    else if (p.Position == PlayerPosition.Middlehand)
                    {
                        p.Position     = PlayerPosition.Forehand;
                        p.BidStatus    = BidStatus.Accept;
                        nextPlayers[0] = p;
                    }
                    else if (p.Position == PlayerPosition.Rearhand)
                    {
                        p.Position     = PlayerPosition.Middlehand;
                        p.BidStatus    = BidStatus.Bid;
                        nextPlayers[1] = p;
                    }
                }
                Players.Clear();
                Players.AddRange(nextPlayers);
            }
            MatadorsJackStraight = null;
            GameStarted          = false;
            GamePlayer           = null;
            GameValue            = null;
            IsSpeedUp            = false;
            SkatTaken            = false;
            CurrentPlayer        = null;
            Stitch.Clear();
            Skat.Clear();
            LastStitch.Clear();
            CurrentHistory = new GameHistory();
            var deck = Card.GenerateDeck();

            foreach (var player in Players)
            {
                player.Cards.AddRange(Card.Draw(deck, 10));
                player.SortCards();
                CurrentHistory.PlayerCards.Add((player.Name, new List <Card>(player.Cards)));
            }
            Skat.AddRange(Card.Draw(deck, 2));
            CurrentHistory.Skat.AddRange(Skat);
            BidSaid       = false;
            BidValueIndex = -1;
        }
コード例 #9
0
 static void Main(string[] args)
 {
     var skat = new Skat();
 }