Using the newest discord.net , fixes, improvements

If you draw 5 cards now, you get a hand value.
This commit is contained in:
Kwoth 2015-12-10 21:35:34 +01:00
parent e0ff0b4447
commit 485783d146
10 changed files with 117 additions and 33 deletions

View File

@ -20,6 +20,9 @@ public class Cards
{ 13, "King" },
};
private static Dictionary<string, Func<List<Card>, 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<Card> cardPool;
@ -79,6 +89,7 @@ public class Cards
{
cardPool = new List<Card>(52);
RefillPool();
InitHandValues();
}
/// <summary>
/// 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,8 +127,8 @@ public class Cards
/// <returns>A card from the pool</returns>
public Card DrawACard()
{
if (CardPool.Count > 0)
{
if (CardPool.Count == 0)
Restart();
//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);
@ -132,13 +143,6 @@ public class Cards
return c;
*/
}
else {
//for now return null
Restart();
return null;
}
}
/// <summary>
/// Shuffles the deck. Use this if you want to take cards from the top of the deck, instead of randomly. See DrawACard method.
/// </summary>
@ -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<List<Card>, bool> hasPair =
cards => cards.GroupBy(card => card.number)
.Count(group => group.Count() == 2) == 1;
Func<List<Card>, bool> isPair =
cards => cards.GroupBy(card => card.number)
.Count(group => group.Count() == 3) == 0
&& hasPair(cards);
Func<List<Card>, bool> isTwoPair =
cards => cards.GroupBy(card => card.number)
.Count(group => group.Count() >= 2) == 2;
Func<List<Card>, 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<List<Card>, bool> hasThreeOfKind =
cards => cards.GroupBy(card => card.number)
.Any(group => group.Count() == 3);
Func<List<Card>, bool> isThreeOfKind =
cards => hasThreeOfKind(cards) && !hasPair(cards);
Func<List<Card>, bool> isFlush =
cards => cards.GroupBy(card => card.suit).Count() == 1;
Func<List<Card>, bool> isFourOfKind =
cards => cards.GroupBy(card => card.number)
.Any(group => group.Count() == 4);
Func<List<Card>, bool> isFullHouse =
cards => hasPair(cards) && hasThreeOfKind(cards);
Func<List<Card>, bool> hasStraightFlush =
cards => isFlush(cards) && isStraight(cards);
Func<List<Card>, bool> isRoyalFlush =
cards => cards.Min(card => (int)card.number) == 10
&& hasStraightFlush(cards);
Func<List<Card>, bool> isStraightFlush =
cards => hasStraightFlush(cards) && !isRoyalFlush(cards);
handValues = new Dictionary<string, Func<List<Card>, 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<Card> cards)
{
foreach (var KVP in handValues)
{
if (KVP.Value(cards)) {
return KVP.Key;
}
}
return "High card "+cards.Max().GetName();
}
}

View File

@ -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
/// </summary>
/// <param name="images">The Images you want to merge.</param>
/// <returns>Merged bitmap</returns>
public static Bitmap MergeImages(Image[] images)
public static Bitmap MergeImages(IEnumerable<Image> 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;

View File

@ -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,8 +18,8 @@ namespace NadekoBot
{
if (cards == null)
{
cards = new Cards();
await e.Send("Shuffling cards...");
cards = new Cards();
}
try
@ -33,17 +34,24 @@ namespace NadekoBot
if (num > 5)
num = 5;
Image[] images = new Image[num];
List<Image> images = new List<Image>();
List<Cards.Card> cardObjects = new List<Cards.Card>();
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());

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
dlls/WebSocket4Net.dll Normal file

Binary file not shown.

Binary file not shown.