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)); }
public async Task <IActionResult> DeleteList([FromRoute] string tableID, [FromRoute] string listID) { if (!CardListCollection.DeleteByTableAndId(new ObjectId(tableID), new ObjectId(listID))) { return(BadRequest()); } return(Ok()); }
[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)))); }
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()); }
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)))); }
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)); }
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)))); }
public List <CardList> GetLists([FromRoute] string tableID) { return(CardListCollection.FindAllInTable(new ObjectId(tableID))); }
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); }