Hej, En liten fundering bara, borde du inte kunna skilja på kortet som sådant och kortets pokervärde. Rent konceptuellt skulle du ju kunna återanvända dina kort och din hand till att spela olika typer av kortspel då. Om man ser det ur programmatisk synvinkel är det nog lämpligt att definiera < som att spader<hjärter eller liknande. Tänk till exempel på om du vill sortera korten. I C++ använder iaf de inbyggda behållarna <, > osv., för att kunna utföra sorteringar. En sortering bör väl låta varje kort ha en unik position i detta fallet? Oops...lösningen blev att jag implementerar operatorn == så som den "bör" fungera, dvs ruter 7 == ruter 7 men ruter 7 != spader7. För att göra jämföra suit och rank använder jag egenskaperna Suit och Rank (enumeratorer) i stället. Jag struntar helt i att implementera < och > för Card och Hand. Däremot implementerade jag IComparable på Hand-objektet och i CompareTo så la jag in logiken för vilken hand som är bäst. För att jämföra två händer skriver jag alltså :Equals / == samt operator overloading
Sitter och skriver ett litet pokerprogram och har stött på ett område där mina kunskaper brister en aning, och behöver nu lite råd. Eftersom man i poker jämför kort med varandra och händer med varandra så tyckte jag det var lämpligt att börja överlagra lite operatorer, t ex >= och <=, samt == och !=. Jag vill alltså kunna skriva typ :
if (hand1==hand2)
...
if (hand1.Cards[0]<hand2.Cards[0])
...
Detta för att göra koden som avgör vilken hand som vinner lite snyggare.
Min första tanke var att man bara jämför kortets valör och struntar i färgen, dvs en sjua är lägre än en kung, och spader kung är lika med ruter kung. Men att definiera == leder ju till att VS vill att du skall överlagra Equals/GetHashCode också, och då börjar jag fundera på om det är så vettigt att definiera spader kung som LIKA MED ruter kung!?
Låt säga att jag skulle definiera == samt Equals/GetHashCode på så sätt att jag bara jämför valörerna enligt ovan, får jag inte problem då om jag t ex skapar en klass som heter Deck (kortlek) som ärver av en generisk typ (t ex SortedList) som har metoder typ Contains() (för att kolla om ett kort finns i leken)? Använder inte ramverket Equals för att avgöra om elementet finns genom att anropa Equals()?. [Edit : Sitter med VS2005 beta 2 och labbar, därav snacket om generiska klasser, men exemplet gäller väl även utan generiska klasser]
Samma problem uppstår ju med klassen Hand som representerar en pokerhand. Om t ex två personer har Royal Straight Flush så splittas ju potten enligt pokerreglerna (glöm det där med att färgerna är rankade Hjärter,Spader, Ruter, Klöver), och här skulle jag eventuellt vilja överlagra operatorn == så att Hand1==Hand2. Men att de är identiska enligt pokerregler innebär ju inte att händerna ur objektshänseende är identiska.
Är detta helt enkelt ett dumt tillfälle att blanda in operator overloading? Borde jag nöja mig med att implementera IComparable och strunta i operatorerna?
Sv: Equals / == samt operator overloading
T.ex. skulle du kunna ha en property typ Value och sen jämför du dem
if (hand1.Cards[0].Value<hand2.Cards[0].Value)
Då kan du ju skilja på sjlva instansen av kortet och dess pokervärde. Sen i Value kan du ju även där leka med generiska klasser eller interface så att du kan få till olika spel ;-)
Lite funderingar på morgonkvisten
Sv:Equals / == samt operator overloading
Sv:Equals / == samt operator overloading
if (hand1.CompareTo(hand2)>0)
...
Känns inte som att detta är en perfekt lösning, men ibland måste man bita ihop och gå vidare.