Hej!
Har ett skolprojekt där jag håller på att programmera ett pokerspel i Java.
Nu har jag kommit till rättningen som jag anser är lite knepig. Något tips på hur man ska bygga upp den?
Det är Texas Hold'em Poker så att det gäller att få ut bästa möjliga handen av 7 kort.
Jag har en array för varje spelare som innehåller klassen kort. Klassen Kort i sin tur har valör.Kort och färg.Kort.
En smart sak är väl att börja med Royal Straight Flush och sedan gå ner till par?
Jag hade nog utgått från korten, d.v.s kolla första kortet, gå vidare till nästa...osv.
Kanske detta hjälper till?
En sak bara... Straight flush är inte implementerad.. föreslår att du kollar om det OCKSÅ är stege, samt att hela stegen ÄR flush om du har "färg" efter getPointHand(), men INNAN calculate()
Du måste ju ävan skriva till en koll i calculate, samt ge straight flush högsta värde i theHand[6].
Plus att koden är tagen ur sitt sammanhang :/ Jag vet hur det fungerar, men du får nog fundera en del =D
Fråga gärna..
/* JABBALIZER MADE THIS SHIT ALL BY HIMSELF */
public class Dealer
{
private int[] taken52 = null;// markera korten som 1, annars 0
private int[] taken14 = null;//kommer att hålla hand efter translateTo14()
private int par = 0;//indikerar om handen har någon av dessa
private int tvåPar = 0;
private int triss = 0;
private int stege = 0;
private int färg = 0;
private int kåk = 0;
private int fyrtal = 0;
private int[] theHand; //kommer att hålla den "färdiga" handen med en kontroll på sista platsen
public Dealer()
{
taken52 = new int[52];
taken14 = new int[14];
par = 0;
tvåPar = 0;
triss = 0;
stege = 0;
färg = 0;
kåk = 0;
fyrtal = 0;
}
public int compareToHand(int[] theOtherHand)//jämför hand i Dealer med en man skickar in utifrån
{
int win = 0;
if(theHand[5] > theOtherHand[5])
win = 1;
else
if(theHand[5] == theOtherHand[5])
if(theHand[0] > theOtherHand[0])
win = 1;
else
if(theHand[0] == theOtherHand[0])
if(theHand[1] > theOtherHand[1])
win = 1;
else
if(theHand[1] == theOtherHand[1])
if(theHand[2] > theOtherHand[2])
win = 1;
else
if(theHand[2] == theOtherHand[2])
if(theHand[3] > theOtherHand[3])
win = 1;
else
if(theHand[3] == theOtherHand[3])
if(theHand[4] > theOtherHand[4])
win = 1;
else
if(theHand[4] == theOtherHand[4])
win = 2;
return win;
}
public int[] getPointHand() //sorterar den färdiga handen
{
theHand = new int[6];
if(par == 1)
{
int j = 2;
theHand[5] = 1;
for(int i =taken14.length-1 ; i >0; i--)
if(taken14[i] == 2)
{
theHand[0] = i;
theHand[1] = i;
}
else
if(j<5 && taken14[i] == 1)
{
theHand[j] = i;
j++;
}
}
else
{
if(tvåPar == 1)
{
theHand[5] = 2;
int antalPar = 0;
int singel = 0;
for(int i =taken14.length-1 ; i >0; i--)
if(taken14[i] == 2 && antalPar <2)
{
theHand[0+2*antalPar] = i;
theHand[1+2*antalPar] = i;
antalPar++;
}
else
if(singel == 0 && taken14[i] > 0)
{
theHand[4] = i;
singel++;
}
}
else
{
if(triss == 1)
{
theHand[5] = 3;
int found = 0;
int j = 3;
for(int i =taken14.length-1 ; i >0; i--)
if(found == 0 && taken14[i] == 3)
{
theHand[0] = i;
theHand[1] = i;
theHand[2] = i;
found++;
}
else
if(j<5 && taken14[i] == 1)
{
theHand[j] = i;
j++;
}
}
else
{
if(stege == 1)
{
theHand[5] = 4;
int found = 0;
for(int i =taken14.length-1 ; i >3; i--)
if(found == 0 && taken14[i] > 0 && taken14[i-1] > 0 && taken14[i-2] > 0 && taken14[i-3] > 0 && taken14[i-4] > 0)
{
theHand[0] = i;
theHand[1] = i-1;
theHand[2] = i-2;
theHand[3] = i-3;
theHand[4] = i-4;
found++;
}
}
else
{
if(färg == 1)
{
theHand[5] = 5;
int tempCount1 = 0;
int tempCount2 = 0;
int tempCount3 = 0;
int tempCount4 = 0;
int downFrom = 0;
int counter = 0;
for(int i = 0; i<13; i++)
{
if(taken52[i]>0)
tempCount1++;
if(taken52[i+13]>0)
tempCount2++;
if(taken52[i+26]>0)
tempCount3++;
if(taken52[i+39]>0)
tempCount4++;
}
if(tempCount1 > 4)
downFrom = 12;
else
if(tempCount2 > 4)
downFrom = 25;
else
if(tempCount3 > 4)
downFrom = 38;
else
if(tempCount4 > 4)
downFrom = 51;
if(taken52[downFrom-12] ==1)
{
theHand[0] = downFrom + 1;
counter++;
}
for(int i =downFrom ; i >downFrom-12; i--)
{
if(counter <5 && taken52[i] > 0)
{
theHand[counter] = i;
counter++;
}
}
for(int i = 0; i<theHand.length-1; i++)
while(theHand[i] > 13)
theHand[i] = theHand[i]-13;
}
else
{
if(kåk == 1)
{
theHand[5] = 6;
int foundTriss = 0;
int foundPar = 0;
for(int i =taken14.length-1 ; i >0; i--)
if(foundTriss == 0 && taken14[i] == 3)
{
theHand[0] = i;
theHand[1] = i;
theHand[2] = i;
foundTriss++;
}
else
if(foundPar == 0 && taken14[i] >1)
{
theHand[3] = i;
theHand[4] = i;
foundPar++;
}
}
else
{
if(fyrtal == 1)
{
theHand[5] = 7;
int singel = 0;
for(int i =taken14.length-1 ; i >0; i--)
if(taken14[i] == 4)
{
theHand[0] = i;
theHand[1] = i;
theHand[2] = i;
theHand[3] = i;
}
else
if(singel == 0 && taken14[i] > 0)
{
theHand[4] = i;
singel++;
}
}
else
{
theHand[5] = 0;
int antal = 0;
for(int i =taken14.length-1 ; i >0; i--)
if(antal <5 && taken14[i] > 0)
{
theHand[antal] = i;
antal++;
}
}
}
}
}
}
}
}
return theHand;
}
public void calculate()
{
translateTo14(); //gör om int[52] till int[14]
for(int i = 0; i<taken14.length ; i++) //här kollas om det är fyrtal
if(taken14[i] == 4)
fyrtal = 1;
if(fyrtal != 1) //om det inte är fyrtal..
{
int tempTriss = -1;
int tempPar = -1;
int tempPar2 = -1;
for(int i = 0; i<taken14.length-1 ; i++) //här letas en triss upp
if(taken14[i]==3)
tempTriss = i; //och får värdet i
for(int i = 0; i<taken14.length-1; i++)
if(taken14[i]>=2 && i!=tempTriss) //sen letas ett par upp som får värdet i
tempPar = i;
if(tempTriss != -1 && tempPar != -1) //om de inte är -1 är det kåk
kåk = 1;
else //annars
{
int tempCount1 = 0;
int tempCount2 = 0;
int tempCount3 = 0;
int tempCount4 = 0;
for(int i = 0; i<13; i++) //kolla om färg
{
if(taken52[i]>0)
tempCount1++;
if(taken52[i+13]>0)
tempCount2++;
if(taken52[i+26]>0)
tempCount3++;
if(taken52[i+39]>0)
tempCount4++;
}
if((tempCount1 >=5) || (tempCount2 >=5) || (tempCount3 >=5) || (tempCount4 >=5))
färg = 1; //om det är färg...
else //annars..
{
for(int i = 0; i<taken14.length-4; i++)
if(taken14[i] > 0 && taken14[i+1] > 0 && taken14[i+2] > 0 && taken14[i+3] > 0 && taken14[i+4] > 0)
stege = 1; //om stege
if(stege != 1) //om inte stege..
{
if(tempTriss > -1) //kollar om stege..
triss = 1;
else //annars
{
if(tempPar > -1) //kollar om tvåpar..
{
for(int i = 0; i< taken14.length-1; i++)
if(i != tempPar && taken14[i] ==2)
tempPar2 = i;
}
if(tempPar > -1 && tempPar2 > -1)
tvåPar = 1;
else
if(tempPar > -1)
par = 1;
}
}
}
}
}
}
private void translateTo14()
{
for (int i = 0; i<52; i++)
taken14[i%13] += taken52[i];
taken14[13]=taken14[0];
}
}
en sak till:
compareToHand() är inte exakt enligt de riktiga reglerna.
alla korten jämförs om båda händerna är likadana.. men jag vet inte om det ska göras t.ex när 2 st har par i 3:or eller nåt?? I alla fall.. Hoppas du kan ha nytta av resten!
Tack för alla svar.
Men har lyckats göra allting nu, förutom en sak. Rättaren för stege. Vet att det inte borde vara nåt problem, men jag har kört fast.
for (x=0; x<3; x++) {
if ((valör.player[x] + 1 == valör.player[x+1]) && (valör.player[x] + 2 == valör.player[x+2]) && (valör.player[x] + 3 == valör.player[x+3]) && (valör.player[x] + 4 == valör.player[x+4])) {
poäng[0] = 4;
poäng[1] = valör.player[x+4];
}
else if ((valör.player[x] + 1 == valör.player[x+1]) && (valör.player[x] + 2 == valör.player[x+2]) && (valör.player[x] + 3 == valör.player[x+3]) && (valör.player[6] == 14) && (valör.player[x] == 2)) {
poäng[0] = 4;
poäng[1] = 5;
}
}
Såhär såg min kod ut fram tills idag för att rätta stege, men sen kom jag på att denna kod inte tar upp en del tänkbara alternativ.
Det är Hold'em Poker och då är det sju kort som gäller. Player[] innehåller alltså 7 platser (0-6) med ett kort i varje.
Min kod skriver inte ut stege om player ser ut som följer:
2,3,3,4,5,6,8.
Då är det en stege, men min kod hakar upp sig på paret i treor och tänker (kortet efter player[1] är inte ett större. Alltså ingen stege).
Hur ska jag komma förbi det här på ett smart sett?
gör såhär:
1: ha en array med 14 platser (en för varje kortvärde 1 till Ess)
2: kör igenom din hand med modulo 13 (förutsatt att du har Ess = 0, 2 = 1, 3 = 2...... Q = 11, K = 12), och öka varje gång det index du får (eller sätt det == 1 går lika bra)
Så bör du ha arrayen {0, 1, 2, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0}
3: sätt arrayen[13] = arrayen [0] (se till att ESS kan va både 1 & Ess)
4: i denna är det enkelt att kolla om du har 5 eller fler i rad, samt välja den högsta...
(detta gör jag faktiskt i koden jag postade innan)
for(int i = 0; i<taken14.length-4; i++)
if(taken14[i] > 0 && taken14[i+1] > 0 && taken14[i+2] > 0 && taken14[i+3] > 0 && taken14[i+4] > 0)
stege = 1;
sen får du ju ta reda på indexet för högsta kortet som ingår i stegen...
Om detta inte går att genomföra på din kod så får du berätta exakt hur du lagrar alla inblandade värden, typ vilket värde får ett ESS etc.
en annan sak.. att den hakar upp sig på treorna kan man som i min kod lösa genom att nästla if-satser
mer specifikt: i calculate() ser du vad jag menar..
fan att jag inte kan skriva allt på en gång ! =)
modulo 13 behöver man ju endast om man lagrar alla tagna korten i en array[52] från början... dvs ett Ess kan ha värden 0, 13, 26, 39 beroende på vilken färg det är....
LimeMedlem sedan sep. 2001961 inlägg Tjing!
Jag hade inte löst det med if-satser och poäng så som du har gjort.
Det finns en viss ordning i hur möjliga händer är ordnade:
- High card
- Pair
- Three of a kind
- o.s.v.
Jag hade implementerat det så att jag skapat ett basklass/interface Hand och sedan en subklass för varje möjlig handtyp. När man skapar subklassen så har varje klass i sig regler för hur man kan sätta ihop olika kort för att få en så hög hand som möjlig.
Par-klassen t.ex. skulle börja med att försöka skapa par av ess, kungar, damer o.s.v. tills den hittat ett par.
Samma sak med Triss-klassen.
Sedan låter man rättaren gå igenom varje sådan klass och försöka skapa den som har högsta rangordning. Om man vill kan man låta varje subklass av en hand även ha ett värde som direkt berättar vilken rang det är.
Om man då gör Hand1.equals(Hand2) så kan man då direkt kolla om Hand1 > Hand2 och slipper börja jämföra kortvärden med varandra.
I princip gör du redan detta men jag hade som sagt brutit ner det i mindre, mer hanterbara klasser för att slippa en massa stora if-satser.
HAHA! Och precis så bör man göra!
Men jag skrev denna som nybörjare (enlig BigBang modellen typ..)
Har funderat på att själv göra om hela applikationen som ett "riktigt" projekt för att få bättre struktur på det hela. XD
LimeMedlem sedan sep. 2001961 inlägg Hehe... jo... det är skillnad på bör och göra... ;-)