Writing winner logic.

This commit is contained in:
2021-10-08 22:26:19 -07:00
parent 37cb960484
commit aff317b904
3 changed files with 119 additions and 25 deletions

View File

@ -561,39 +561,45 @@ card_t debug_pokerWinnerCompare(poker2playerwinning_t *left, poker2playerwinning
return highCardLeft;//Greater or Equal to.
}
void pokerWinnerDetermine(poker2_t *poker) {
uint8_t i, j, number, highNumber;
void pokerWinnerDetermineForPot(
poker2_t *poker,
poker2pot_t *pot,
poker2playerwinning_t winners[POKER_PLAYER_COUNT_MAX],
uint8_t winnerPlayers[POKER_PLAYER_COUNT_MAX],
uint8_t *winnerCount,
uint8_t participants[POKER_PLAYER_COUNT_MAX],
uint8_t *participantCount
) {
uint8_t i, j, countPlayers, countWinners, number, highNumber;
poker2playerwinning_t *left, *right;
poker2player_t *player;
card_t card, highCard;
bool isWinner;
poker->winnerCount = 0;
countPlayers = 0;
countWinners = 0;
highCard = 0xFF;
// Get winning sets
for(i = 0; i < poker->playerCount; i++) {
left = poker->winners + i;
left->type = POKER_WINNING_TYPE_NULL;
player = poker->players + i;
if(!pokerPlayerIsInRound(player)) continue;
// Get the players' winning state.
pokerWinnerGetForPlayer(poker, player, left);
// Get participating players and their hands.
for(i = 0; i < pot->playerCount; i++) {
player = poker->players + pot->players[i];
if(player->state & (POKER_PLAYER_STATE_FOLDED|POKER_PLAYER_STATE_OUT)) {
continue;
}
participants[countPlayers] = pot->players[i];
pokerWinnerGetForPlayer(poker, player, winners + countPlayers++);
}
// Compare against each player
for(i = 0; i < poker->playerCount; i++) {
left = poker->winners + i;
if(left->type == POKER_WINNING_TYPE_NULL) continue;
// Compare participating players
for(i = 0; i < countPlayers; i++) {
left = winners + i;
isWinner = true;
highNumber = 0xFF;
for(j = 0; j < poker->playerCount; j++) {
for(j = 0; j < countPlayers; j++) {
if(i == j) continue;
right = poker->winners + j;
if(right->type == POKER_WINNING_TYPE_NULL) continue;
right = winners + j;
// Am I the better hand / Is it the better hand?
if(left->type < right->type) continue;
@ -603,7 +609,7 @@ void pokerWinnerDetermine(poker2_t *poker) {
}
// Equal, compare hands.
card = pokerWinnerCompare(left, right);
card = debug_pokerWinnerCompare(left, right);
if(card == 0xFF) {
isWinner = false;
break;
@ -619,5 +625,9 @@ void pokerWinnerDetermine(poker2_t *poker) {
if(!isWinner) continue;
left->kicker = highCard;
winnerPlayers[countWinners++] = participants[i];
}
*participantCount = countPlayers;
*winnerCount = countWinners;
}

View File

@ -117,9 +117,6 @@ typedef struct {
uint8_t playerDealer;
uint8_t playerSmallBlind;
uint8_t playerBigBlind;
poker2playerwinning_t winners[POKER_PLAYER_COUNT_MAX];
uint8_t winnerCount;
} poker2_t;
@ -162,4 +159,13 @@ void debug_WinnerFillRemaining(poker2playerwinning_t *winning);
void pokerWinnerGetForPlayer(
poker2_t *poker, poker2player_t *player, poker2playerwinning_t *winning
);
card_t debug_pokerWinnerCompare(poker2playerwinning_t *left, poker2playerwinning_t *right);
card_t debug_pokerWinnerCompare(poker2playerwinning_t *left, poker2playerwinning_t *right);
void pokerWinnerDetermineForPot(
poker2_t *poker,
poker2pot_t *pot,
poker2playerwinning_t winners[POKER_PLAYER_COUNT_MAX],
uint8_t winnerPlayers[POKER_PLAYER_COUNT_MAX],
uint8_t *winnerCount,
uint8_t participants[POKER_PLAYER_COUNT_MAX],
uint8_t *participantCount
);