void show (hand *h, int reveal) { card *c; if (clist_length(h->cards) == 0) { printf("[no cards]\n"); return; } else { if (reveal) { printf(" %s\n", card_name(*h->cards.first)); } else { printf(" one face down card\n"); } } for (c=h->cards.first->next; c!=NULL; c=c->next) printf(" %s\n", card_name(*c)); showvalue(h, reveal); if (h->bet > 0) printf ("Bet: $%0.2f\n", h->bet); }
int hit (hand *h) { card c = draw(); printf("%s\n", card_name(c)); add(h, c); showvalue(h, 1); if (busted(h)) { printf("[BUST]\n"); return 0; } else { return handvalue(h); } }
int main (int argc, char **argv) { hand h; printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); printf("%s\n", card_name(draw())); h = hand_new(); printf("Hit:\n"); hit(&h); hit(&h); hit(&h); exit(0); }
// YOLOYOLO int main() { printf("\n\n\n----- STARTING A NEW GAME -----"); init(); printf("\nInitialization complete."); srand(alt_timestamp()); // TODO change in de2 env int i; int new_player_count = 2; bool first_game = true; GameState state = SETUP; for (;;) { switch (state) { case SETUP: printf("\n\n----- ENTERING SETUP STATE -----\n\n"); initialize_dealer(new_player_count); printf("Initialized dealer."); joining_period(); /* Move dealer chip to the next player */ if (dealer_chip == dealer->number_players-1) dealer_chip = 0; else dealer_chip++; state = DEAL_HANDS; break; case DEAL_HANDS: printf("\n\n ----- ENTERING DEAL_HANDS STATE -----\n\n"); deal_hands(); send_player_hands(); for (i=0; i<dealer->number_players; i++) { printf("\n\nDealt cards for Player %d: Suite %d, Value %d & Suite %d, Value %d", i, dealer->players[i].hand[0].suite, dealer->players[i].hand[0].value, dealer->players[i].hand[1].suite, dealer->players[i].hand[1].value); } state = ANTY_CALL; break; case FLOP: flop(); printf("\n\n----------------------------------------"); printf("\nFLOP (%s) (%s) (%s) \n", card_name(dealer->cards_on_table[0]), card_name(dealer->cards_on_table[1]), card_name(dealer->cards_on_table[2])); state = BET; break; case TURN: turn(); printf("\n\n----------------------------------------"); printf("\nTURN (%s) (%s) (%s) (%s) \n", card_name(dealer->cards_on_table[0]), card_name(dealer->cards_on_table[1]), card_name(dealer->cards_on_table[2]), card_name(dealer->cards_on_table[3])); state = BET; break; case RIVER: river(); printf("\n\n----------------------------------------"); printf("\nRIVER (%s) (%s) (%s) (%s) (%s) \n", card_name(dealer->cards_on_table[0]), card_name(dealer->cards_on_table[1]), card_name(dealer->cards_on_table[2]), card_name(dealer->cards_on_table[3]), card_name(dealer->cards_on_table[4])); state = BET; break; case ANTY_CALL: printf("\nCalling anty from all players"); get_bet_for_player(dealer_chip); if (dealer_chip == dealer->number_players-1) { for (i=0; i<dealer->number_players-1; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } else { for (i=dealer_chip+1; i<dealer->number_players; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } for (i=0; i<dealer_chip; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } /* Put bet money into the pot */ for (i=0; i<dealer->number_players; i++) { dealer->pot += dealer->players[i].money; dealer->players[i].money = 0; dealer->current_bet = 0; } printf("\n----------------------------------------\n"); printf("\nPOT %d", dealer->pot); printf("\n----------------------------------------\n"); state = BET; break; case BET: for (i=0; i<dealer->number_players; i++) { if (dealer->players[i].active && dealer->players[i].total_money > 0) sprintf(dealer->players[i].message, " "); } /* Betting Round 1 */ get_bet_for_player(dealer_chip); if (dealer_chip == dealer->number_players-1) { for (i=0; i<dealer->number_players-1; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } else { for (i=dealer_chip+1; i<dealer->number_players; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } for (i=0; i<dealer_chip; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } /* If still betting, continue that */ while (still_betting()) { for (i=dealer_chip; i<dealer->number_players; i++) { if (player_still_playing(i)) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } for (i=0; i<dealer_chip; i++) { if (player_still_playing(i)) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } switch (dealer->number_cards_on_table) { case 0: state = FLOP; break; case 3: state = TURN; break; case 4: state = RIVER; break; case 5: state = GAME_OVER; break; } HOTSTUFF:; /* Put bet money into the pot */ for (i=0; i<dealer->number_players; i++) { dealer->pot += dealer->players[i].money; dealer->players[i].money = 0; dealer->current_bet = 0; } printf("\n----------------------------------------\n"); printf("\nPOT %d", dealer->pot); printf("\n----------------------------------------\n"); break; case GAME_OVER: if (dealer->number_active_players > 1) { rank_poker_hands(); split_pot(); } else { last_man_standing(); } send_game_results(); printf("\n\nWaiting for response from all players.\n"); receive_replay_status(); state = SETUP; free(dealer->deck); free(dealer->players); free(dealer); free(ph); break; } game_screen(); } return 0; }
void rank_poker_hands() { int i, j, k, m, l; ph = malloc(sizeof(PokerHand)*dealer->number_players); Card null_card; null_card.value = -1; null_card.suite = -1; printf("\n"); for (i=0; i<dealer->number_players; i++) { printf("\nPlayer %d: %s and %s", i, card_name(dealer->players[i].hand[0]), card_name(dealer->players[i].hand[1])); } printf("\n\nCards on table %s, %s, %s, %s and %s\n", card_name(dealer->cards_on_table[0]), card_name(dealer->cards_on_table[1]), card_name(dealer->cards_on_table[2]), card_name(dealer->cards_on_table[3]), card_name(dealer->cards_on_table[4]) ); for (i=0; i<dealer->number_players && dealer->players[i].active; i++) { ph[i].type = UNDETERMINED; ph[i].value = -1; ph[i].value_secondary = -1; for (j=0; j<5; j++) ph[i].hand[j] = null_card; ph[i].kicker = null_card; int num_filled = 0; /* Create hash maps */ int suite_count[4]; Card by_suite[4][7]; for (j=0; j<4; j++) suite_count[j]=0; int value_count[13]; Card by_value[13][4]; // For value count, 0-12 represents Two to Ace for (j=0; j<13; j++) value_count[j]=0; by_suite[dealer->players[i].hand[0].suite][suite_count[dealer->players[i].hand[0].suite]] = dealer->players[i].hand[0]; suite_count[dealer->players[i].hand[0].suite]++; by_suite[dealer->players[i].hand[1].suite][suite_count[dealer->players[i].hand[1].suite]] = dealer->players[i].hand[1]; suite_count[dealer->players[i].hand[1].suite]++; for (j=0; j<dealer->number_cards_on_table; j++) { by_suite[dealer->cards_on_table[j].suite][suite_count[dealer->cards_on_table[j].suite]] = dealer->cards_on_table[j]; suite_count[dealer->cards_on_table[j].suite]++; } int val = dealer->players[i].hand[0].value == 0 ? 12 : dealer->players[i].hand[0].value - 1; by_value[val][value_count[val]] = dealer->players[i].hand[0]; value_count[val]++; val = dealer->players[i].hand[1].value == 0 ? 12 : dealer->players[i].hand[1].value - 1; by_value[val][value_count[val]] = dealer->players[i].hand[1]; value_count[val]++; for (j=0; j<dealer->number_cards_on_table; j++) { val = dealer->cards_on_table[j].value == 0 ? 12 : dealer->cards_on_table[j].value - 1; by_value[val][value_count[val]] = dealer->cards_on_table[j]; value_count[val]++; } /* Check for best hand */ for (j=0; j<4; j++) { if (suite_count[j] >= 5) { /* Flush */ if (ph[i].type < FLUSH) { ph[i].type = FLUSH; ph[i].hand[0] = by_suite[j][0]; ph[i].hand[1] = by_suite[j][1]; ph[i].hand[2] = by_suite[j][2]; ph[i].hand[3] = by_suite[j][3]; ph[i].hand[4] = by_suite[j][4]; ph[i].value = ph[i].hand[0].value; for (k=0; k<5; k++) { if (comp_value(ph[i].hand[k].value, ph[i].value) == 1) ph[i].value = ph[i].hand[k].value; } num_filled = 5; } } } /* Straight */ for (j=12; j>=4; j--) { if (j == 4 && value_count[12]>=1 && value_count[j]>=1 && value_count[j-1]>=1 && value_count[j-2]>=1 && value_count[j-3]>=1) { ph[i].type = STRAIGHT; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j-1][0]; ph[i].hand[2] = by_value[j-2][0]; ph[i].hand[3] = by_value[j-3][0]; ph[i].hand[4] = by_value[12][0]; num_filled = 5; break; } else if (value_count[j]>=1 && value_count[j-1]>=1 && value_count[j-2]>=1 && value_count[j-3]>=1 && value_count[j-4]>=1) { ph[i].type = STRAIGHT; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j-1][0]; ph[i].hand[2] = by_value[j-2][0]; ph[i].hand[3] = by_value[j-3][0]; ph[i].hand[4] = by_value[j-4][0]; num_filled = 5; break; } } /* 4 of a kind */ for (j=12; j>=0; j--) { if (value_count[j] == 4 && ph[i].type < FOUR_OF_A_KIND) { ph[i].type = FOUR_OF_A_KIND; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j][1]; ph[i].hand[2] = by_value[j][2]; ph[i].hand[3] = by_value[j][3]; num_filled = 4; break; } } /* Full house and 3 of a kind */ for (j=12; j>=0; j--) { if (value_count[j] == 3) { /* Check for 3 of a kind */ for (k=12; k>=0 && k!=j; k--) { if (value_count[k] == 2 && ph[i].type < FULL_HOUSE) { ph[i].type = FULL_HOUSE; ph[i].value = j; ph[i].value_secondary = k; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j][1]; ph[i].hand[2] = by_value[j][2]; ph[i].hand[3] = by_value[k][0]; ph[i].hand[4] = by_value[k][1]; num_filled = 5; break; } } /* If not full house, is a 3 of a kind */ if (ph[i].type < THREE_OF_A_KIND || (ph[i].type == THREE_OF_A_KIND && comp_value(ph[i].value, j) == -1)) { ph[i].type = THREE_OF_A_KIND; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j][1]; ph[i].hand[2] = by_value[j][2]; num_filled = 3; } } } for (j=12; j>=0; j--) { if (value_count[j] == 2) { /* Check for two pair */ for (k=12; k>=0 && k!=j; k--) { if (value_count[k] == 2 && ph[i].type < TWO_PAIR) { ph[i].type = TWO_PAIR; ph[i].value = j; ph[i].value_secondary = k; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j][1]; ph[i].hand[2] = by_value[k][0]; ph[i].hand[3] = by_value[k][1]; num_filled = 4; break; } } /* If not 2 pair, is a single pair */ if (ph[i].type < PAIR) { ph[i].type = PAIR; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; ph[i].hand[1] = by_value[j][1]; num_filled = 2; break; } } } for (j=12; j>=0; j--) { if (value_count[j] >= 1 && ph[i].type < HIGH_CARD ) { ph[i].type = HIGH_CARD; ph[i].value = j; ph[i].hand[0] = by_value[j][0]; num_filled = 1; break; } } /* Fill up remaining spots in best hand */ for (j=12; j>=0 && num_filled<5; j--) { for (k=0; k<value_count[j] && num_filled<5; k++) { int flag = 0; for (l=0; l<num_filled; l++) { if (by_value[j][k].value == ph[i].hand[l].value && by_value[j][k].suite == ph[i].hand[l].suite) flag = 1; } if (flag == 0) { ph[i].hand[num_filled] = by_value[j][k]; num_filled++; } } } /* Kicker */ for (j=12; j>=0; j--) { for (k=0; k<value_count[j] && ph[i].kicker.value == -1; k++) { int flag = 0; for (l=0; l<num_filled; l++) { if (by_value[j][k].value == ph[i].hand[l].value && by_value[j][k].suite == ph[i].hand[l].suite) flag = 1; } if (flag == 0) { ph[i].kicker = by_value[j][k]; } } } } for (i=0; i<dealer->number_players && dealer->players[i].active; i++) { char *s; switch (ph[i].type) { case ROYAL_FLUSH: s = "Royal Flush"; break; case STRAIGHT_FLUSH: s = "Straight Flush"; break; case FOUR_OF_A_KIND: s = "Four of a Kind"; break; case FULL_HOUSE: s = "Full House"; break; case FLUSH: s = "Flush"; break; case STRAIGHT: s = "Straight"; break; case THREE_OF_A_KIND: s = "Three of a Kind"; break; case TWO_PAIR: s = "Two Pair"; break; case PAIR: s = "Pair"; break; case HIGH_CARD: s = "High Card"; break; case UNDETERMINED: printf("\nError: Player hand should not be UNDETERMINED"); break; } printf("\nPlayer %d: %s with %s, %s, %s, %s, %s and kicker %s", i, s, card_name(ph[i].hand[0]), card_name(ph[i].hand[1]), card_name(ph[i].hand[2]), card_name(ph[i].hand[3]), card_name(ph[i].hand[4]), card_name(ph[i].kicker)); } printf("\n"); }
static SCM open_card(SCM device) { // soundcard acquisition and configuration char *dname; snd_pcm_t *handle; ALSA_CARD *card; snd_pcm_sw_params_t *sparams; SOURCE_HANDLE *src; snd_pcm_format_t f, format; SCM smob; int i, ret, dir; unsigned int rate, buffer_time; dname = scm_to_locale_string(device); for (i = 0; i < 10; i++) { ret = snd_pcm_open(&handle, dname, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); if (ret >= 0) break; } if (ret < 0) { log_msg("ALSA: can't open %s (%s)\n", dname, snd_strerror(ret)); free(dname); return SCM_BOOL_F; } card = (ALSA_CARD *)my_malloc(sizeof(ALSA_CARD), "alsa card"); card->device = dname; card->name = card_name(card->device); card->ringbuf = NULL; init_source(&card->base); card->handle = handle; card->running = 0; snd_pcm_hw_params_malloc(&card->hparams); snd_pcm_hw_params_any(card->handle, card->hparams); for (f = format = 0; f < SND_PCM_FORMAT_LAST; f++) { ret = snd_pcm_hw_params_test_format(card->handle, card->hparams, f); if (ret == 0) { log_msg("ALSA: - %s\n", snd_pcm_format_name(f)); format = f; } } ret = snd_pcm_hw_params_set_access(card->handle, card->hparams, SND_PCM_ACCESS_RW_INTERLEAVED); if (ret < 0) log_msg("ALSA: access %s\n", snd_strerror(ret)); ret = snd_pcm_hw_params_set_format(card->handle, card->hparams, format); log_msg("ALSA: format: %s\n", snd_pcm_format_description(format)); if (ret < 0) log_msg("ALSA: format error %s\n", snd_strerror(ret)); snd_pcm_hw_params_get_buffer_time_max(card->hparams, &buffer_time, 0); rate = sampling_rate; ret = snd_pcm_hw_params_set_rate(card->handle, card->hparams, rate, 0); log_msg("ALSA: rate %d\n", rate); if (ret < 0) log_msg("ALSA: rate error %s\n", snd_strerror(ret)); snd_pcm_hw_params_set_channels(card->handle, card->hparams, QMX_CHANNELS); card->blocksize = BLOCKSIZE; snd_pcm_hw_params_set_period_size(card->handle, card->hparams, card->blocksize, 0); log_msg("ALSA: period %ld\n", card->blocksize); snd_pcm_hw_params_set_buffer_time_near(card->handle, card->hparams, &buffer_time, &dir); log_msg("ALSA: buffer time %u\n", buffer_time); if ((ret = snd_pcm_hw_params(card->handle, card->hparams)) < 0) { log_msg("ALSA: can't set hardware: %s\n", snd_strerror(ret)); close_card(card); return SCM_BOOL_F; } else log_msg("ALSA: hardware configd\n"); snd_pcm_sw_params_malloc(&sparams); snd_pcm_sw_params_current(card->handle, sparams); snd_pcm_sw_params_set_avail_min(card->handle, sparams, card->blocksize); snd_pcm_sw_params_set_start_threshold(card->handle, sparams, 0U); if ((ret = snd_pcm_sw_params(card->handle, sparams)) < 0) { log_msg("ALSA: can't set software: %s\n", snd_strerror(ret)); } else log_msg("ALSA: software configd\n"); snd_pcm_sw_params_free(sparams); card->link = cards; cards = card; src = (SOURCE_HANDLE *)my_gc_malloc(sizeof(SOURCE_HANDLE), "alsa_card", "alsa card handle"); src->body = (void *)card; src->src = &card->base; log_msg("ALSA: opened %s '%s'\n", card->device, card->name); SCM_NEWSMOB(smob, alsa_card_tag, src); return smob; }
int main (int argc, char** argv) { struct gameState G; struct gameState *p = &G; srand(atoi(argv[1])); int a[20] = {adventurer, council_room, feast, gardens, mine, remodel, smithy, village, baron, great_hall, minion, steward, tribute, ambassador, cutpurse, embargo, outpost, salvager, sea_hag, treasure_map}; int j[10], k[10]; int i, ii; for(i=0; i<10; i++){ int loop = 1; while(loop){ j[i] = rand()%20; for(ii=0; ii<i; ii++){ if(j[ii] == j[i]){ loop++; break; } } loop--; } } for(i=0; i<10; i++){ k[i] = a[j[i]]; } for(i=0; i<10; i++){ printf("%s ", card_name(k[i])); //printf("%d %s\n", k[i], card_name(k[i])); } printf("\n"); int players = rand()%3+2; printf("Players: %d\n\n", players); printf ("Starting game.\n"); initializeGame(players, k, atoi(argv[1]), p); i = 0; while (!isGameOver(p)) { int active = whoseTurn(p); printf("Player %d\n", active); i = 0; while(p->numActions > 0){ int playing = rand()%p->handCount[active]+1; if(i > 100){ playing = p->handCount[active]; } if(playing == p->handCount[active]){ //Chance to stop playing cards early printf("Stop playing cards early\n"); break; } else{ if(playCard(playing, rand()%20, rand()%20, rand()%20, p) != -1){ printf("Playing %s\n", card_name(handCard(playing,p))); } } i++; } while(p->numBuys > 0){ int action = rand()%18; if(i > 100){ action = 17;; } if(action <= 6){ //Attempting to get a utility card, i.e. silver or province if(buyCard(action, p) != -1){ printf("Buying %s\n", card_name(action)); } } else if(action == 17){ //Chance to end turn early printf("Stop buying cards early\n"); break; } else{ //Attempt to buy one of the randomly selected cards if(buyCard(k[action-7], p) != -1){ printf("Buying %s\n", card_name(k[action-7])); } } i++; } printf("END_TURN\n\n"); printf ("Player %d: %d\n", active, scoreFor(active, p)); printf("Deck Size: %d\nDiscard Size: %d\n\n", p->deckCount[active], p->discardCount[active]); endTurn(p); } // end of While printf ("Finished game.\n"); printf ("Player 0: %d\nPlayer 1: %d\n", scoreFor(0, p), scoreFor(1, p)); return 0; }
/* Main */ int main() { srand(time(NULL)); int i; // TODO change in de2 env GameState state = SETUP; //test_rank_poker_hands(); return 0; for (;;) { switch (state) { case SETUP: initialize_dealer(2); /* Move dealer chip to the next player */ if (dealer_chip == dealer->number_players-1) dealer_chip = 0; else dealer_chip++; state = DEAL_HANDS; break; case DEAL_HANDS: deal_hands(); for (i=0; i<dealer->number_players; i++) { printf("\n\nDealt cards for Player %d: %s and %s", i, card_name(dealer->players[i].hand[0]), card_name(dealer->players[i].hand[1])); } state = BET; break; case FLOP: flop(); printf("\n\n----------------------------------------"); printf("\nFLOP %s, %s and %s", card_name(dealer->cards_on_table[0]), card_name(dealer->cards_on_table[1]), card_name(dealer->cards_on_table[2])); state = BET; break; case TURN: turn(); printf("\n\n----------------------------------------"); printf("\nTURN %s", card_name(dealer->cards_on_table[3])); state = BET; break; case RIVER: river(); printf("\n\n----------------------------------------"); printf("\nRIVER %s", card_name(dealer->cards_on_table[4])); state = BET; break; case BET: /* Betting Round 1 */ get_bet_for_player(dealer_chip); if (dealer_chip == dealer->number_players-1) { for (i=0; i<dealer->number_players-1; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } else { for (i=dealer_chip+1; i<dealer->number_players; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } for (i=0; i<dealer_chip; i++) { if (dealer->players[i].active) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } /* If still betting, continue that */ while (still_betting()) { for (i=dealer_chip; i<dealer->number_players; i++) { if (player_still_playing(i)) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } for (i=0; i<dealer_chip; i++) { if (player_still_playing(i)) { get_bet_for_player(i); if (dealer->number_active_players == 1) {state = GAME_OVER; goto HOTSTUFF;} } } } switch (dealer->number_cards_on_table) { case 0: state = FLOP; break; case 3: state = TURN; break; case 4: state = RIVER; break; case 5: state = GAME_OVER; break; } HOTSTUFF:; /* Put bet money into the pot */ for (i=0; i<dealer->number_players; i++) { dealer->pot += dealer->players[i].money; dealer->players[i].money = 0; dealer->current_bet = 0; } printf("\n----------------------------------------\n"); printf("\nPOT %d", dealer->pot); printf("\n----------------------------------------\n"); break; case GAME_OVER: if (dealer->number_active_players > 1) { rank_poker_hands(); split_pot(); } else { last_man_standing(); } free(dealer->deck); free(dealer->players); free(dealer); free(ph); printf("\n\nContinue play? (0 - No, 1 - Yes) "); int m; scanf("%d", &m); if (m==0) return 0; else state = SETUP; break; } } }