101 lines
2.5 KiB
C
101 lines
2.5 KiB
C
/**
|
|
* Copyright (c) 2022 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "poker.h"
|
|
|
|
pokerplayer_t POKER_PLAYERS[POKER_PLAYER_COUNT_MAX];
|
|
uint8_t POKER_DECK[CARD_DECK_SIZE];
|
|
uint8_t POKER_DECK_SIZE;
|
|
|
|
uint8_t POKER_COMMUNITY[POKER_COMMUNITY_SIZE_MAX];
|
|
uint8_t POKER_COMMUNITY_SIZE;
|
|
|
|
uint8_t POKER_PLAYER_DEALER;
|
|
uint8_t POKER_PLAYER_SMALL_BLIND;
|
|
uint8_t POKER_PLAYER_BIG_BLIND;
|
|
|
|
uint16_t POKER_GAME_BLINDS_CURRENT;
|
|
uint16_t POKER_GAME_POT;
|
|
|
|
void pokerInit() {
|
|
uint8_t i;
|
|
|
|
// Set up players
|
|
for(i = 0; i < POKER_PLAYER_COUNT_MAX; i++) {
|
|
POKER_PLAYERS[i].chips = 10000;
|
|
POKER_PLAYERS[i].state = 0;
|
|
}
|
|
|
|
// Set up the initial state.
|
|
// TODO: Should this be randomized?
|
|
POKER_PLAYER_DEALER = 0;
|
|
POKER_GAME_POT = 0;
|
|
|
|
POKER_GAME_BLINDS_CURRENT = 10;
|
|
|
|
// Reset the round state (For the first round)
|
|
pokerNewRound();
|
|
}
|
|
|
|
void pokerNewRound() {
|
|
uint8_t i, j, k;
|
|
uint8_t found;
|
|
|
|
// Reset round state
|
|
POKER_COMMUNITY_SIZE = 0;
|
|
|
|
// Fill deck
|
|
for(i = 0; i < CARD_DECK_SIZE; i++) POKER_DECK[i] = i;
|
|
POKER_DECK_SIZE = CARD_DECK_SIZE;
|
|
|
|
// Shuffle Deck
|
|
for(i = CARD_DECK_SIZE-1; i > 0; i--) {
|
|
k = POKER_DECK[i];
|
|
j = rand() % (i+1);
|
|
POKER_DECK[i] = POKER_DECK[j];
|
|
POKER_DECK[j] = k;
|
|
}
|
|
|
|
// Reset Players and decide new blinds.
|
|
found = 0;
|
|
POKER_PLAYER_DEALER++;
|
|
|
|
for(i = 0; i < POKER_PLAYER_COUNT_MAX; i++) {
|
|
POKER_PLAYERS[i].state &= ~(
|
|
POKER_PLAYER_STATE_FOLDED |
|
|
POKER_PLAYER_STATE_HAS_BET_THIS_ROUND
|
|
);
|
|
|
|
// Have we found the dealer, small blind, and big blind players?
|
|
if(found != 3 && (POKER_PLAYERS[i].state & POKER_PLAYER_STATE_OUT) == 0){
|
|
k = (POKER_PLAYER_DEALER + i) % POKER_PLAYER_COUNT_MAX;
|
|
|
|
if(found == 0) {// Have we found the dealer?
|
|
POKER_PLAYER_DEALER = i;
|
|
found++;
|
|
} else if(found == 1) {// Have we found the small blind?
|
|
POKER_PLAYER_SMALL_BLIND = i;
|
|
found++;
|
|
} else if(found == 2) {// Have we found the big blind?
|
|
POKER_PLAYER_BIG_BLIND = i;
|
|
found++;
|
|
}
|
|
}
|
|
|
|
// Deal two cards to the player.
|
|
for(j = 0; j < POKER_PLAYER_HAND_SIZE_MAX; j++) {
|
|
POKER_PLAYERS[i].hand[j] = POKER_DECK[POKER_DECK_SIZE--];
|
|
}
|
|
}
|
|
}
|
|
|
|
void pokerTakeBlinds() {
|
|
// TODO: I need to make sure the blind players even have the chips to blind.
|
|
POKER_PLAYERS[POKER_PLAYER_SMALL_BLIND].chips -= POKER_GAME_BLINDS_CURRENT;
|
|
POKER_PLAYERS[POKER_PLAYER_BIG_BLIND].chips -= (POKER_GAME_BLINDS_CURRENT*2);
|
|
POKER_GAME_POT += POKER_GAME_BLINDS_CURRENT * 3;
|
|
} |