Exemple #1
0
        public async Task <IActionResult> CreateList([FromRoute] string tableID, [FromBody] CreateListData data)
        {
            if (string.IsNullOrEmpty(data.Name))
            {
                return(BadRequest());
            }

            User activeUser = await userManager.GetUserAsync(User);

            Table table = TableCollection.FindByUserAndId(activeUser.ID, new ObjectId(tableID));

            if (table == null)
            {
                return(NotFound());
            }

            CardList newList = new CardList();

            newList.Name    = data.Name;
            newList.Table   = table.ID;
            newList.Content = new List <Card>();
            CardListCollection.InsertOne(newList);

            return(Ok(newList));
        }
Exemple #2
0
 public async Task <IActionResult> DeleteList([FromRoute] string tableID, [FromRoute] string listID)
 {
     if (!CardListCollection.DeleteByTableAndId(new ObjectId(tableID), new ObjectId(listID)))
     {
         return(BadRequest());
     }
     return(Ok());
 }
Exemple #3
0
        [HttpGet("/table/{tableID}/{listID}/move")] //?toList=&cardIndex=&newCardIndex=
        public async Task <IActionResult> MoveCard([FromRoute] string tableID, [FromRoute] string listID, [FromQuery(Name = "toList")] string toListID, [FromQuery] int cardIndex, [FromQuery] int newCardIndex)
        {
            ObjectId table = new ObjectId(tableID);

            if (cardIndex < 0 || newCardIndex < 0)
            {
                return(BadRequest());
            }

            if (listID == toListID)
            {
                CardList list = CardListCollection.FindListByTableAndId(table, new ObjectId(listID));
                if (list == null || list.Content.Count <= cardIndex)
                {
                    return(BadRequest());
                }

                Card card = list.Content[cardIndex];
                list.Content.RemoveAt(cardIndex);
                list.Content.Insert(newCardIndex, card);

                if (!CardListCollection.UpdateContent(list))
                {
                    return(BadRequest());
                }
            }
            else
            {
                CardList fromList = CardListCollection.FindListByTableAndId(table, new ObjectId(listID));
                if (fromList == null || fromList.Content.Count <= cardIndex)
                {
                    return(BadRequest());
                }

                CardList toList = CardListCollection.FindListByTableAndId(table, new ObjectId(toListID));
                if (toList == null)
                {
                    return(BadRequest());
                }

                Card card = fromList.Content[cardIndex];
                fromList.Content.RemoveAt(cardIndex);

                toList.Content.Insert(newCardIndex, card);

                if (!CardListCollection.UpdateContent(fromList))
                {
                    return(BadRequest());
                }
                if (!CardListCollection.UpdateContent(toList))
                {
                    return(BadRequest());
                }
            }

            return(Ok(CardListCollection.FindAllInTable(new ObjectId(tableID))));
        }
Exemple #4
0
        public async Task <IActionResult> DeleteTable([FromRoute] string tableID)
        {
            if (string.IsNullOrEmpty(tableID))
            {
                return(BadRequest());
            }

            ObjectId table = new ObjectId(tableID);

            if (!TableCollection.DeleteOneById(table))
            {
                return(BadRequest());
            }

            CardListCollection.DeleteByTable(table);

            return(Ok());
        }
Exemple #5
0
        public async Task <IActionResult> CreateCard([FromRoute] string tableID, [FromRoute] string listID, [FromBody] CreateCardData data)
        {
            if (string.IsNullOrEmpty(data.Title))
            {
                return(BadRequest());
            }

            Card newCard = new Card()
            {
                Title       = data.Title,
                Description = data.Description
            };

            if (!CardListCollection.AddCardToTable(new ObjectId(tableID), new ObjectId(listID), newCard))
            {
                return(BadRequest());
            }

            return(Ok(CardListCollection.FindOneList(new ObjectId(tableID), new ObjectId(listID))));
        }
Exemple #6
0
        public async Task <IActionResult> CreateCard([FromRoute] string tableID, [FromRoute] string listID, [FromRoute] int cardIndex, [FromBody] CreateCardData data)
        {
            if (string.IsNullOrEmpty(data.Title))
            {
                return(BadRequest());
            }

            CardList list = CardListCollection.FindListByTableAndId(new ObjectId(tableID), new ObjectId(listID));

            list.Content[cardIndex] = new Card()
            {
                Title       = data.Title,
                Description = data.Description
            };

            if (!CardListCollection.UpdateContent(list))
            {
                return(BadRequest());
            }

            return(Ok(list));
        }
Exemple #7
0
        public async Task <IActionResult> DeleteCard([FromRoute] string tableID, [FromRoute] string listID, [FromRoute] int cardIndex)
        {
            if (cardIndex < 0 || cardIndex < 0)
            {
                return(BadRequest());
            }

            CardList fromList = CardListCollection.FindListByTableAndId(new ObjectId(tableID), new ObjectId(listID));

            if (fromList == null || fromList.Content.Count <= cardIndex)
            {
                return(BadRequest());
            }

            fromList.Content.RemoveAt(cardIndex);

            if (!CardListCollection.UpdateContent(fromList))
            {
                return(BadRequest());
            }

            return(Ok(CardListCollection.FindOneList(new ObjectId(tableID), new ObjectId(listID))));
        }
Exemple #8
0
 public List <CardList> GetLists([FromRoute] string tableID)
 {
     return(CardListCollection.FindAllInTable(new ObjectId(tableID)));
 }
Exemple #9
0
    public Cribbage()
    {
        var red = new Node {
            Value    = "red",
            Key      = "color",
            children = new List <Node> {
                new Node {
                    Value = "hearts",
                    Key   = "suit",
                },
                new Node {
                    Value = "diamonds",
                    Key   = "suit"
                }
            }
        };
        var black = new Node {
            Value    = "black",
            Key      = "color",
            children = new List <Node> {
                new Node {
                    Value = "clubs",
                    Key   = "suit",
                },
                new Node {
                    Value = "spades",
                    Key   = "suit"
                }
            }
        };
        var ranks = new Node {
            Value    = "combo2",
            children = new List <Node> {
                new Node {
                    Value = "2", Key = "rank"
                }, new Node {
                    Value = "3", Key = "rank"
                }, new Node {
                    Value = "4", Key = "rank"
                },
                new Node {
                    Value = "5", Key = "rank"
                }, new Node {
                    Value = "6", Key = "rank"
                }, new Node {
                    Value = "7", Key = "rank"
                }, new Node {
                    Value = "8", Key = "rank"
                }, new Node {
                    Value = "9", Key = "rank"
                }, new Node {
                    Value = "10", Key = "rank"
                },
                new Node {
                    Value = "J", Key = "rank"
                }, new Node {
                    Value = "Q", Key = "rank"
                }, new Node {
                    Value = "K", Key = "rank"
                }, new Node {
                    Value = "A", Key = "rank"
                }
            }
        };
        Tree t = new Tree {
            rootNode = new Node {
                Value    = "Attrs",
                children = new List <Node> {
                    new Node {
                        Value    = "combo1",
                        children = new List <Node> {
                            red, black
                        }
                    },
                    ranks
                }
            }
        };

        // Here for timing estimates right now
        Stopwatch time = new Stopwatch();

        time.Start();

        // READ NUMBER OF PLAYERS and CREATE THE GAME
        int numPlayers = 2;
        var game       = new CardGame(numPlayers);

        List <string> locationsToCreate = new List <string> {
            "STOCK",
            "PLAYHISTORY",
            "STARTER",
            "CRIB"            //TODO TRUMP and LEAD are imaginary locations, should not be used for play
        };

        foreach (var key in locationsToCreate)
        {
            game.tableCards.AddKey(key);
            game.tableCards[key] = new CardStackCollection();
        }

        // Set PLAYER card and int storage locations
        foreach (var player in game.players)
        {
            player.storage.AddKey("BID");
            player.storage.AddKey("CURRENTSTATE");
            player.storage.AddKey("TRICKSWON");
            player.storage.AddKey("GONE");
            player.cardBins.AddKey("HAND");
            player.cardBins.AddKey("TRICK");
        }

        // Set TEAMS and Link to PLAYERS

        for (int i = 0; i < 2; ++i)
        {
            var team = new Team();
            team.teamStorage.AddKey("SCORE");
            team.teamPlayers.Add(game.players[i]);
            game.players[i].team = team;
            game.teams.Add(team);
        }

        game.SetDeck(t);

        //Instantiate Player Decks and Play Areas
        foreach (var player in game.players)
        {
            player.cardBins["HAND"]  = new CardListCollection();
            player.cardBins["TRICK"] = new CardStackCollection();
        }

        // Establish PRECEDENCE for the cards.
        //
        // TODO : Push this into game, have this description be flexible to again read from string



        var suitDict  = new Dictionary <string, HashSet <Card> >();
        var rankDict  = new Dictionary <string, HashSet <Card> >();
        var comboDict = new Dictionary <string, Card>();

        foreach (var card in game.sourceDeck)
        {
            var suit = card.ReadAttribute("suit");

            if (suitDict.ContainsKey(suit))
            {
                suitDict[suit].Add(card);
            }
            else
            {
                suitDict.Add(suit, new HashSet <Card> {
                    card
                });
            }

            var rank = card.ReadAttribute("rank");

            if (rankDict.ContainsKey(rank))
            {
                rankDict[rank].Add(card);
            }
            else
            {
                rankDict.Add(rank, new HashSet <Card> {
                    card
                });
            }

            comboDict.Add(suit + rank, card);
        }
        Dictionary <String, int> StoreNames = new Dictionary <String, int> {
            { "SPADESBROKEN", 0 },
            { "PLAYERTURN", 1 },
            { "CURRENTPLAYER", 2 },
            { "CURRENTHAND", 3 }
        };

        foreach (var key in StoreNames.Keys)
        {
            game.gameStorage.AddKey(key);
        }
        foreach (var team in game.teams)
        {
            team.teamStorage.AddTrigger(new Trigger {
                op        = ">=",
                value     = 121,
                exception = new TriggerException("Game should end here")
            }, "SCORE");
        }
        bool gameNotOver = true;

        try{
            while (gameNotOver)
            {
                if (game.teams.Exists(team => team.teamStorage["SCORE"] >= 121))
                {
                    gameNotOver = false;
                }
                else
                {
                    game.tableCards["CRIB"].Clear();
                    foreach (var player in game.players)
                    {
                        player.cardBins["TRICK"].Clear();
                    }
                    game.tableCards["STOCK"] = new CardListCollection();
                    game.PopulateLocation("STOCK");
                    game.tableCards["STOCK"].Shuffle();
                    // STAGE 0: SETUP STORAGE and DEAL
                    game.DealEvery(6, "STOCK", "HAND");

                    game.tableCards["STARTER"].Add(game.tableCards["STOCK"].Remove());



                    //Populate the crib
                    for (int i = 0; i < 2; ++i)
                    {
                        var player          = game.players[i];
                        var ultimateChoices = new List <GameActionCollection>();
                        foreach (var card in player.cardBins["HAND"].AllCards())
                        {
                            ultimateChoices.Add(new GameActionCollection {
                                new CardMoveAction(card, player.cardBins["HAND"], game.tableCards["CRIB"])
                            });
                        }
                        game.PlayerMakeChoices(ultimateChoices, i, 2);
                    }

                    //Normal Game phase
                    var rankStrings = new List <string> {
                        "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
                    };
                    var rankInts = new List <int> {
                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10
                    };
                    var rankPairs = new List <int> {
                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
                    };
                    var pairList = new List <PointAwards>();
                    for (int i = 0; i < rankStrings.Count; ++i)
                    {
                        pairList.Add(new PointAwards("rank", rankStrings[i], rankPairs[i]));
                    }
                    var pairScore = new CardScore(pairList);


                    var scoreList = new List <PointAwards>();
                    for (int i = 0; i < rankStrings.Count; ++i)
                    {
                        scoreList.Add(new PointAwards("rank", rankStrings[i], rankInts[i]));
                    }
                    var stackScore = new CardScore(scoreList);

                    while (!game.players.All(player => player.cardBins["HAND"].Count == 0))
                    {
                        game.tableCards["PLAYHISTORY"].Clear();
                        foreach (var player in game.players)
                        {
                            //player.cardBins["TRICK"].Clear();
                            player.storage["GONE"] = 0;
                        }
                        while (game.tableCards["PLAYHISTORY"].AllCards().Sum(card => stackScore.GetScore(card)) < 31 && game.players.Exists(player => player.storage["GONE"] == 0))
                        {
                            //Players each play a remaining card
                            var remainingScore = 31 - game.tableCards["PLAYHISTORY"].AllCards().Sum(card => stackScore.GetScore(card));

                            var playableFilter = new CardFilter(new List <CardExpression> {
                                new ScoreExpression(stackScore, "<=", remainingScore)
                            });

                            var actions = new List <GameActionCollection>();

                            foreach (var card in playableFilter.FilterList(game.players[game.gameStorage["CURRENTPLAYER"]].cardBins["HAND"]).AllCards())
                            {
                                actions.Add(new GameActionCollection {
                                    new CardMoveAction(card, game.players[game.gameStorage["CURRENTPLAYER"]].cardBins["HAND"], game.players[game.gameStorage["CURRENTPLAYER"]].cardBins["TRICK"]),
                                    new CardCopyAction(card, game.tableCards["PLAYHISTORY"])
                                });
                            }

                            if (actions.Count > 0)
                            {
                                game.PlayerMakeChoice(actions, game.gameStorage["CURRENTPLAYER"]);

                                if (game.tableCards["PLAYHISTORY"].AllCards().Sum(card => stackScore.GetScore(card)) == 15)
                                {
                                    //Score 2 points
                                    game.players[game.gameStorage["CURRENTPLAYER"]].team.teamStorage["SCORE"] += 2;
                                }

                                game.gameStorage["CURRENTPLAYER"] = (game.gameStorage["CURRENTPLAYER"] + 1) % 2;

                                Console.WriteLine("STATE");
                                foreach (var card in game.tableCards["PLAYHISTORY"].AllCards())
                                {
                                    Console.WriteLine(card);
                                }
                            }
                            else
                            {
                                game.players[game.gameStorage["CURRENTPLAYER"]].storage["GONE"] = 1;
                                game.gameStorage["CURRENTPLAYER"] = (game.gameStorage["CURRENTPLAYER"] + 1) % 2;
                            }
                        }
                    }
                    foreach (var team in game.teams)
                    {
                        Console.WriteLine("AFTER CARDS PLAYED:" + team.teamStorage["SCORE"]);
                    }

                    //Hand has been played, now score the hands and the crib
                    foreach (var player in game.players)
                    {
                        //First score the hand with the starter
                        var trick = player.cardBins["TRICK"];

                        var cardsToScore = new CardListCollection();
                        foreach (var card in trick.AllCards())
                        {
                            cardsToScore.Add(card);
                        }
                        cardsToScore.Add(game.tableCards["STARTER"].Peek());                        //Add the starter

                        var findEm = new CardGrouping(13, pairScore);

                        //Pairs
                        var pairs = findEm.TuplesOfSize(cardsToScore, 2);
                        Console.WriteLine("Pairs:");
                        foreach (var pair in pairs)
                        {
                            foreach (var card in pair.AllCards())
                            {
                                Console.WriteLine(card);
                            }

                            player.team.teamStorage["SCORE"] += 2;
                        }
                        foreach (var team in game.teams)
                        {
                            Console.WriteLine("PAIRS SCORED:" + team.teamStorage["SCORE"]);
                        }


                        //Runs
                        var runs = findEm.RunsOfSize(cardsToScore, 3);
                        Console.WriteLine("Runs:");
                        foreach (var run in runs)
                        {
                            foreach (var card in run.AllCards())
                            {
                                Console.WriteLine(card);
                            }
                            player.team.teamStorage["SCORE"] += 3;
                        }
                        foreach (var team in game.teams)
                        {
                            Console.WriteLine("RUNS SCORED:" + team.teamStorage["SCORE"]);
                        }

                        //15's
                        var allcombos = findEm.AllCombos(cardsToScore);
                        foreach (var combo in allcombos)
                        {
                            if (combo.AllCards().Sum(item => stackScore.GetScore(item)) == 15)
                            {
                                Console.WriteLine("15!");
                                foreach (var card in combo.AllCards())
                                {
                                    Console.WriteLine(card);
                                }

                                player.team.teamStorage["SCORE"] += 2;
                            }
                        }

                        foreach (var team in game.teams)
                        {
                            Console.WriteLine("15s SCORED:" + team.teamStorage["SCORE"]);
                        }
                    }
                }
            }
        }
        catch (TriggerException ex) {
            Console.WriteLine(ex.Message);
        }
        foreach (var team in game.teams)
        {
            Console.WriteLine("FINAL:" + team.teamStorage["SCORE"]);
        }
        time.Stop();
        Console.WriteLine("Elapsed:" + time.Elapsed);
    }