|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 3881 (0xf29)
Types: TextFile
Names: »betting.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Poker/betting.c«
/*
** Handle all the betting being done.
*/
# include <stdio.h>
# include "betting.h"
# include "players.h"
# include "computer.h"
# define TRUE 1
# define FALSE 0
int betting( player, n_players, pot, first )
PLAYER player[]; /* all player information */
int n_players; /* # of players */
int *pot; /* current pot */
int first; /* player who gets to bet first */
{
int last_raiser=(-1); /* player who made last raise */
int n_active=0; /* # players active in betting (haven't folded) */
int n_raises=0; /* # of raises this hand so far */
int j=(-1); /* player currently betting */
int i;
int total_bet; /* total amount bet each player this hand */
char temp[80];
int done; /* has player entered something valid yet? */
int amount; /* how much more is player donating to pot? */
int cycle=FALSE; /* has bet been around circle once yet? */
int x;
int rounds=0;
i = first;
while ( i != first || !cycle )
{
if ( player[i].in )
{
if ( j == -1 )
{
total_bet = player[i].bet;
j = i;
}
sprintf( temp, "B%d%d", i, player[i].bet );
tellall( player, n_players, temp );
sprintf( temp, "$%d%d", i, player[i].cash );
tellall( player, n_players, temp );
n_active++;
}
if ( ++i == n_players )
{
cycle = TRUE;
i = 0;
}
}
tellall( player, n_players, "U" );
while( n_active > 1 && j != last_raiser )
{
sprintf( temp, "T%d", j );
tellall( player, n_players, temp );
sprintf( temp, "P%d", *pot );
tellall( player, n_players, temp );
sprintf( temp, "B%d%d", j, player[j].bet );
tellall( player, n_players, temp );
tellall( player, n_players, "U" );
sprintf( temp, "$%d%d", j, player[j].cash );
tellall( player, n_players, temp );
if ( j > 0 ) /* if not computer */
{
sprintf( temp, "?%d", total_bet - player[j].bet );
writeln( player[j].socket, temp );
}
tellall( player, n_players, "U" ); /* update displays */
/* get bet ... */
done = FALSE;
while ( !done )
{
if ( j > 0 )
readln( player[j].socket, temp );
else
computer_bet( player, n_players, n_active, n_raises, *pot, total_bet, temp );
done = TRUE;
switch ( temp[0] ) {
case 'Q' :
player[j].wantsout = TRUE;
done = FALSE;
break;
case 'S' :
player[j].sittingout = TRUE;
done = FALSE;
break;
case 'F' :
player[j].in = FALSE;
sprintf( temp, "H%d--fold--", j );
tellall( player, n_players, temp );
n_active--;
break;
case 'C' :
amount = total_bet - player[j].bet;
*pot += amount;
player[j].cash -= amount;
player[j].bet = total_bet;
sprintf( temp, "B%d%d", j, total_bet );
tellall( player, n_players, temp );
sprintf( temp, "H%dCall", j );
tellall( player, n_players, temp );
break;
case 'R' :
if ( ++n_raises > n_players )
{
sprintf( temp, "MMax # of raises; Call or fold." );
writeln( player[j].socket, temp );
--j;
break;
}
last_raiser = j;
amount = (total_bet += (x = atoi(temp+1))) - player[j].bet;
*pot += amount;
player[j].cash -= amount;
player[j].bet = total_bet;
sprintf( temp, "B%d%d", j, total_bet );
tellall( player, n_players, temp );
sprintf( temp, "H%dRaise %d", j, x);
tellall( player, n_players, temp );
break;
case 'P' :
sprintf( temp, "H%dPass", j );
tellall( player, n_players, temp );
break;
}
}
sprintf( temp, "$%d%d", j, player[j].cash );
tellall( player, n_players, temp );
sprintf( temp, "P%d", *pot );
tellall( player, n_players, temp );
tellall( player, n_players, "U" );
if ( ++j >= n_players )
{
++rounds;
j = 0;
}
while( !player[j].in )
if ( ++j >= n_players )
{
++rounds;
j = 0;
}
if ( last_raiser == -1 && ( rounds > 1 || ( rounds == 1 && j >= first ) ) )
break; /* all passed or folded */
}
if ( n_active <= 1 )
return( j );
else
return( -1 );
}