/*************************************************************************** * Copyright (C) 2006 by FThauer FHammer * * f.thauer@web.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "cardsvalue.h" using namespace std; CardsValue::CardsValue() { } CardsValue::~CardsValue() { } int CardsValue::holeCardsClass(int one, int two) { if((one-1)%13<(two-1)%13) { int temp = one; one = two; two = temp; } if((one-1)%13 == (two-1)%13) { if((one-1)%13+2 > 10) return 10; else { switch((one-1)%13+2) { case 10: return 9; case 9: return 8; case 8: return 7; case 7: return 6; default: return 5; } } } switch((one-1)%13+2) { //Ass case 14: { if((one-1)/13 == (two-1)/13) { switch((one-1)%13-(two-1)%13) { case 1: return 10; case 2: return 9; case 3: return 9; case 4: return 8; default: return 7; } } else { switch((one-1)%13-(two-1)%13) { case 1: return 9; case 2: return 8; case 3: return 7; case 4: return 7; default: return 4; } } } break; //K�ig case 13: { if((one-1)/13 == (two-1)/13) { switch((one-1)%13-(two-1)%13) { case 1: return 9; case 2: return 8; case 3: return 8; case 4: return 6; default: return 5; } } else { switch((one-1)%13-(two-1)%13) { case 1: return 7; case 2: return 6; case 3: return 6; default: return 4; } } } break; //Dame case 12: { if((one-1)/13 == (two-1)/13) { switch((one-1)%13-(two-1)%13) { case 1: return 8; case 2: return 7; case 3: return 6; case 4: return 5; default: return 4; } } else { switch((one-1)%13-(two-1)%13) { case 1: return 6; case 2: return 6; case 3: return 4; default: return 3; } } } break; //Bube case 11: { if((one-1)/13 == (two-1)/13) { switch((one-1)%13-(two-1)%13) { case 1: return 7; case 2: return 6; case 3: return 5; case 4: return 4; default: return 3; } } else { switch((one-1)%13-(two-1)%13) { case 1: return 6; case 2: return 5; case 3: return 4; default: return 2; } } } break; //10 case 10: { if((one-1)/13 == (two-1)/13) { switch((one-1)%13-(two-1)%13) { case 1: return 6; case 2: return 5; default: return 2; } } else { switch((one-1)%13-(two-1)%13) { case 1: return 5; case 2: return 4; default: return 1; } } } break; //Rest default: { if((one-1)%13 - (two-1)%13 <= 2) { if((one-1)/13 == (two-1)/13) return 5; else return 3; } else { if((one-1)%13 - (two-1)%13 == 3) return 2; else return 1; } } } } int CardsValue::holeCardsToIntCode(int* cards) { // Code der HoleCards ermitteln if(cards[0]%13 == cards[1]%13) { return ((cards[0]%13)*1000 + (cards[0]%13)*10); } else { if(cards[0]%13 < cards[1]%13) { if(cards[0]/13 == cards[1]/13) { return ((cards[0]%13)*1000 + (cards[1]%13)*10 + 1); } else { return ((cards[0]%13)*1000 + (cards[1]%13)*10); } } else { if(cards[0]/13 == cards[1]/13) { return ((cards[1]%13)*1000 + (cards[0]%13)*10 + 1); } else { return ((cards[1]%13)*1000 + (cards[0]%13)*10); } } } } int* intCodeToHoleCards(int code) { // one possibility !!! int* cards = new int[2]; cards[0] = code/1000; cards[1] = (code-cards[0]*1000)/10; if(cards[0]==cards[1]) { cards[1] +=13; } else { if(code%10 == 0) cards[1] +=13; } return cards; } int CardsValue::cardsValue(int* cards, int* position) { int array[7][3]; int j1, j2, j3, j4, j5, k1, k2, ktemp[3]; // Kartenwerte umwandeln (z.B. [ 11 (Karo K�ig) -> 0 11 ] oder [ 31 (Pik 7) -> 2 5 ] ) for(j1=0; j1<7; j1++) { array[j1][0] = cards[j1]/13; array[j1][1] = cards[j1]%13; array[j1][2] = j1; } // Karten nach Farben sortieren: Kreuz - Pik - Herz - Karo for(k1=0; k1<7; k1++) { for(k2=k1+1; k2<7; k2++) { if(array[k1][0] 8*100000000+3*1000000 if(position) { // Position-Array fuellen position[0] = array[j1][2]; for(j3=0; j3<4; j3++) { position[j3+1] = array[j2+j3][2]; } } return 800000000+3*1000000; } } } } // auf Flush (Klasse 5) testen for(j1=0; j1<3; j1++) { if(array[j1][0] == array[j1+1][0] && array[j1][0] == array[j1+2][0] && array[j1][0] == array[j1+3][0] && array[j1][0] == array[j1+4][0]) { // Flush -> 5*10000000 + h�ste Flush Karten mit absteigender Wertung if(position) { // Position-Array fuellen for(j2=0; j2<5; j2++) { position[j2] = array[j1+j2][2]; } } return 500000000+array[j1][1]*1000000+array[j1+1][1]*10000+array[j1+2][1]*100+array[j1+3][1]*10+array[j1+4][1]; } } // Karten fr den Vierling-, Full-House-, Drilling- und Paartest umsortieren for(k1=0; k1<7; k1++) { for(k2=k1+1; k2<7; k2++) { if(array[k1][1] > CardsValue::calcCardsChance(GameState beRoID, int* playerCards, int* boardCards) { int i,j; vector< vector > chance(2); chance[0].resize(10); chance[1].resize(10); for(i=0;i<10;i++) { chance[0][i] = 0; chance[1][i] = 0; } int cards[7]; int sum = 0; cards[0] = playerCards[0]; cards[1] = playerCards[1]; for(i=0;i<5;i++) cards[i+2] = boardCards[i]; switch(beRoID) { case GAME_STATE_PREFLOP: { ArrayData* myArrayData = new ArrayData; chance = myArrayData->getHandChancePreflop(holeCardsToIntCode(playerCards)); delete myArrayData; } break; case GAME_STATE_FLOP: { for(i=0;i<51;i++) { if(i!=cards[0] && i!=cards[1] && i!=cards[2] && i!=cards[3] && i!=cards[4]) { for(j=i+1;j<52;j++) { if(j!=cards[0] && j!=cards[1] && j!=cards[2] && j!=cards[3] && j!=cards[4]) { cards[5] = i; cards[6] = j; (chance[0][cardsValue(cards,0)/100000000])++; sum++; } } } } for(i=0;i<10;i++) { if(chance[0][i] > 0) chance[1][i] = 1; chance[0][i] = (int)(((double)chance[0][i]/(double)sum)*100.0+0.5); } } break; case GAME_STATE_TURN: { for(i=0;i<52;i++) { if(i!=cards[0] && i!=cards[1] && i!=cards[2] && i!=cards[3] && i!=cards[4] && i!=cards[5]) { cards[6] = i; (chance[0][cardsValue(cards,0)/100000000])++; sum++; } } for(i=0;i<10;i++) { if(chance[0][i] > 0) chance[1][i] = 1; chance[0][i] = (int)(((double)chance[0][i]/(double)sum)*100.0+0.5); } } break; case GAME_STATE_RIVER: { chance[0][cardsValue(cards,0)/100000000] = 100; chance[1][cardsValue(cards,0)/100000000] = 1; } break; default: { } } return chance; } //int** CardsValue::showdown(GameState beRoID, int** playerCards, int playerCount) { // // int i,j; // // int** chance = new int*[2]; // // for(i=0;i<10;i++) { // chance[i] = new int[2]; // for(j=0;j<2;j++) { // chance[i][j] = 0; // } // } // // int rand[5]; // // return chance; // //}