diff --git a/NadekoBot/Classes/Cards.cs b/NadekoBot/Classes/Cards.cs index 23163940..bc6a3c70 100644 --- a/NadekoBot/Classes/Cards.cs +++ b/NadekoBot/Classes/Cards.cs @@ -20,6 +20,9 @@ public class Cards { 13, "King" }, }; + private static Dictionary, bool>> handValues; + + public enum CARD_SUIT { Spades = 1, @@ -28,7 +31,7 @@ public class Cards Clubs = 4 } - public class Card + public class Card : IComparable { public CARD_SUIT suit; public int number; @@ -63,6 +66,13 @@ public class Cards { return cardNames[number] + " Of " + suit; } + + public int CompareTo(object obj) + { + if (!(obj is Card)) return 0; + var c = (Card)obj; + return this.number - c.number; + } } private List cardPool; @@ -79,6 +89,7 @@ public class Cards { cardPool = new List(52); RefillPool(); + InitHandValues(); } /// /// Restart the game of blackjack. It will only refill the pool for now. Probably wont be used, unless you want to have only 1 bjg running at one time, @@ -116,28 +127,21 @@ public class Cards /// A card from the pool public Card DrawACard() { - if (CardPool.Count > 0) - { - //you can either do this if your deck is not shuffled - Random r = new Random((int)DateTime.Now.Ticks); - int num = r.Next(0, cardPool.Count); - Card c = cardPool[num]; - cardPool.RemoveAt(num); - return c; - - // if you want to shuffle when you fill, then take the first one - /* - Card c = cardPool[0]; - cardPool.RemoveAt(0); - return c; - */ - } - else { - - //for now return null + if (CardPool.Count == 0) Restart(); - return null; - } + //you can either do this if your deck is not shuffled + Random r = new Random((int)DateTime.Now.Ticks); + int num = r.Next(0, cardPool.Count); + Card c = cardPool[num]; + cardPool.RemoveAt(num); + return c; + + // if you want to shuffle when you fill, then take the first one + /* + Card c = cardPool[0]; + cardPool.RemoveAt(0); + return c; + */ } /// /// Shuffles the deck. Use this if you want to take cards from the top of the deck, instead of randomly. See DrawACard method. @@ -149,7 +153,77 @@ public class Cards cardPool.OrderBy(x => r.Next()); } } - //public override string ToString() => string.Join("", cardPool.Select(c => c.ToString())) + Environment.NewLine; public override string ToString() => string.Join("", cardPool.Select(c => c.ToString())) + Environment.NewLine; + + public void InitHandValues() { + Func, bool> hasPair = + cards => cards.GroupBy(card => card.number) + .Count(group => group.Count() == 2) == 1; + Func, bool> isPair = + cards => cards.GroupBy(card => card.number) + .Count(group => group.Count() == 3) == 0 + && hasPair(cards); + + Func, bool> isTwoPair = + cards => cards.GroupBy(card => card.number) + .Count(group => group.Count() >= 2) == 2; + + Func, bool> isStraight = + cards => cards.GroupBy(card => card.number) + .Count() == cards.Count() + && cards.Max(card => (int)card.number) + - cards.Min(card => (int)card.number) == 4; + + Func, bool> hasThreeOfKind = + cards => cards.GroupBy(card => card.number) + .Any(group => group.Count() == 3); + + Func, bool> isThreeOfKind = + cards => hasThreeOfKind(cards) && !hasPair(cards); + + Func, bool> isFlush = + cards => cards.GroupBy(card => card.suit).Count() == 1; + + Func, bool> isFourOfKind = + cards => cards.GroupBy(card => card.number) + .Any(group => group.Count() == 4); + + Func, bool> isFullHouse = + cards => hasPair(cards) && hasThreeOfKind(cards); + + Func, bool> hasStraightFlush = + cards => isFlush(cards) && isStraight(cards); + + Func, bool> isRoyalFlush = + cards => cards.Min(card => (int)card.number) == 10 + && hasStraightFlush(cards); + + Func, bool> isStraightFlush = + cards => hasStraightFlush(cards) && !isRoyalFlush(cards); + + handValues = new Dictionary, bool>> + { + { "A Pair", isPair }, + { "Two Pairs", isTwoPair }, + { "Three Of A Kind", isThreeOfKind }, + { "Straight", isStraight }, + { "Flush", isFlush }, + { "Full House", isFullHouse }, + { "Four Of A Kind", isFourOfKind }, + { "Straight Flush", isStraightFlush }, + { "Royal Flush", isRoyalFlush } + }; + } + + public static string GetHandValue(List cards) + { + foreach (var KVP in handValues) + { + if (KVP.Value(cards)) { + return KVP.Key; + } + } + return "High card "+cards.Max().GetName(); + } } diff --git a/NadekoBot/Classes/ImageHandler.cs b/NadekoBot/Classes/ImageHandler.cs index b43e8d43..1dac41a5 100644 --- a/NadekoBot/Classes/ImageHandler.cs +++ b/NadekoBot/Classes/ImageHandler.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; @@ -13,10 +14,11 @@ namespace NadekoBot /// /// The Images you want to merge. /// Merged bitmap - public static Bitmap MergeImages(Image[] images) + public static Bitmap MergeImages(IEnumerable images) { + if (images.Count() == 0) return null; int width = images.Sum(i => i.Width); - int height = images[0].Height; + int height = images.First().Height; Bitmap bitmap = new Bitmap(width, height); var r = new Random(); int offsetx = 0; diff --git a/NadekoBot/Commands/DrawCommand.cs b/NadekoBot/Commands/DrawCommand.cs index 7fa0498b..0e6fc02e 100644 --- a/NadekoBot/Commands/DrawCommand.cs +++ b/NadekoBot/Commands/DrawCommand.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Discord.Commands; using System.Drawing; using System.Drawing.Imaging; +using System.Collections.Generic; namespace NadekoBot { @@ -17,10 +18,10 @@ namespace NadekoBot { if (cards == null) { + await e.Send("Shuffling cards..."); cards = new Cards(); - await e.Send( "Shuffling cards..."); } - + try { int num = 1; @@ -33,17 +34,24 @@ namespace NadekoBot if (num > 5) num = 5; - Image[] images = new Image[num]; + List images = new List(); + List cardObjects = new List(); for (int i = 0; i < num; i++) { - if (cards.CardPool.Count == 0) + if (cards.CardPool.Count == 0 && i!= 0) { - await e.Send( "No more cards in a deck...\nGetting a new deck...\nShuffling cards..."); + await e.Send( "No more cards in a deck."); + break; } - images[i] = Image.FromFile(cards.DrawACard().Path); + var currentCard = cards.DrawACard(); + cardObjects.Add(currentCard); + images.Add(Image.FromFile(currentCard.Path)); } Bitmap bitmap = ImageHandler.MergeImages(images); - await client.SendFile(e.Channel, num+" cards.jpg",ImageHandler.ImageToStream(bitmap,ImageFormat.Jpeg)); + await client.SendFile(e.Channel, images.Count+" cards.jpg",ImageHandler.ImageToStream(bitmap, ImageFormat.Jpeg)); + if (cardObjects.Count == 5) { + await e.Send(Cards.GetHandValue(cardObjects)); + } } catch (Exception ex) { Console.WriteLine("Error drawing (a) card(s) "+ex.ToString()); diff --git a/NadekoBot/Modules/Conversations.cs b/NadekoBot/Modules/Conversations.cs index f49a6694..ab7f47a6 100644 --- a/NadekoBot/Modules/Conversations.cs +++ b/NadekoBot/Modules/Conversations.cs @@ -46,7 +46,7 @@ namespace NadekoBot.Modules .Description("Nadeko replies with /o/") .Do(async e => { - await e.Send( e.User.Mention + "/o/"); + await e.Send(e.User.Mention + "/o/"); }); cgb.CreateCommand("/o/") diff --git a/dlls/Discord.Net.Audio.dll b/dlls/Discord.Net.Audio.dll index 88fd9380..7b28cee7 100644 Binary files a/dlls/Discord.Net.Audio.dll and b/dlls/Discord.Net.Audio.dll differ diff --git a/dlls/Discord.Net.Commands.dll b/dlls/Discord.Net.Commands.dll index c3bfae20..0ee4770c 100644 Binary files a/dlls/Discord.Net.Commands.dll and b/dlls/Discord.Net.Commands.dll differ diff --git a/dlls/Discord.Net.Modules.dll b/dlls/Discord.Net.Modules.dll index 217508b3..bea6b9bc 100644 Binary files a/dlls/Discord.Net.Modules.dll and b/dlls/Discord.Net.Modules.dll differ diff --git a/dlls/Discord.Net.dll b/dlls/Discord.Net.dll index be7bda39..559a1a04 100644 Binary files a/dlls/Discord.Net.dll and b/dlls/Discord.Net.dll differ diff --git a/dlls/WebSocket4Net.dll b/dlls/WebSocket4Net.dll new file mode 100644 index 00000000..ac6cbce1 Binary files /dev/null and b/dlls/WebSocket4Net.dll differ diff --git a/dlls/websocket-sharp.dll b/dlls/websocket-sharp.dll deleted file mode 100644 index 19b6cc74..00000000 Binary files a/dlls/websocket-sharp.dll and /dev/null differ