|
|
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 p
Length: 8381 (0x20bd)
Types: TextFile
Names: »poker.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Poker2/poker.c«
/************************************************/
/* */
/* Five card Draw Poker */
/* */
/* Written by Nic Smith (csx43@uk.ac.kl.seq1) */
/* As a final year project to illustrate */
/* intelligent game play. */
/* */
/************************************************/
/* */
/* The files that need to be compiled together */
/* and there main uses are : */
/* */
/* poker.h : include file for structure */
/* definitons and configuration */
/* locating rules. */
/* poker.c : top level of code that pulls */
/* together all the main procedures*/
/* p_deal.c : handles the shuffling, sorting */
/* and dealing of the cards. */
/* p_hand.c : hand recognition routines. */
/* p_strat.c: the strategy used to decide which*/
/* hand type to play with, and how */
/* to improve the given hand. */
/* input.c : accepts most input from the */
/* opponent. */
/* p_decide.c: makes decisions based on */
/* imperfect information, such as */
/* call/raise etc. decisions made */
/* using probabilities in 'percent'*/
/* array. */
/* p_scr.c : screen handling functions. This */
/* uses the 'curses' library */
/* poker_rules : Text file that contains the */
/* rules and instructions for the */
/* game. */
/* */
/************************************************/
#include "poker.h"
#include <signal.h>
#define source 0
/* This is the file descriptor for input i.e. terminal */
/* Most procedures can be reused to convert the program */
/* to machine-machine play. This can be used to improve */
/* and test the strategy. */
#define init_stake 250
/* obviously the initial stake given to each player */
#define VOID 0
#define STAY 1
#define DROP 2
#define CALL 3
#define flag int
/********************************/
/* */
/* possible responses : */
/* */
/* 1 = stay */
/* 2 = drop */
/* 3 = call */
/* 4-8 = bet 1-5 resp. */
/* 9-13 = raise 1-5 resp. */
/* */
/********************************/
playing_card my_hand[HAND_SIZE], your_hand[HAND_SIZE];
int your_stake,my_stake,pot;
int action,last_action;
int amount,last_bet,total_bet;
int turn;
flag i_go_first,whos_go,winner,first_deal;
flag ante_again;
describe mine,yours;
long rand();
describe evaluate();
int SDB(who)
flag who;
{/* stay, drop or bet */
/* used for returning both computer and opponent decisions */
/* it will either call upon the user input routines are the*/
/* decision making routines. */
int response;
if(!who) /* i.e opponent go */
response = choose_SDB(source,&amount);
else
{
if (stay(mine.hand_value,last_action,
first_deal,(my_stake - init_stake)))
response = STAY;
else
{
if(drop(first_deal,yours.reject,mine.hand_value,
last_action,(my_stake - init_stake),turn))
response = DROP;
else /* bet */
response = 3 + increase(mine.hand_value,first_deal,
yours.reject);
}
i_do(response);
}
return response;
}/* SDB */
int RCD(who)
flag who;
{ /* raise call or drop */
/* used for returning both computer and opponent decisions */
/* it will either call upon the user input routines are the*/
/* decision making routines. */
int response;
if(!who)
response = choose_RCD(source,&amount,turn);
else
{
if(drop(first_deal,yours.reject,mine.hand_value,
last_action,(my_stake - init_stake),turn))
response = DROP;
else
{
if(calling(mine.hand_value,turn,first_deal,yours.reject))
response = CALL;
else /* raise */
response = 8 + increase(mine.hand_value,first_deal,
yours.reject);
}
i_do(response);
}
return response;
}/*RCD*/
void ante()
{/* ante is 5 */
/* used for intial ante and re-ante, so does not reset pot */
your_stake -= 5;
my_stake -= 5;
pot += 10;
inform_ante(pot);
}/* ante */
main()
{
int another_go;
srand(getpid());
i_go_first = rand()%01; /* a 1 means the computer goes first, a 0 means */
/* opponent goes first */
another_go = 1; /*set to ensure that at least one game is played */
initialise_screen();
title_screen(); /* can be altered to show owners mail address */
instruct(); /* ask if instructions are required, and display if */
/* necessary. The full pathname for poker_rules */
/* must be set in here (p_scr.c). */
initialise_cards();
do
{
draw_screen();
your_stake=my_stake=300;
pot =0;
do
{
new_deal();
deal_two_hands (your_hand,my_hand);
clear_my_hand(); /* remove computer's old hand from screen */
show_hand(your_hand,0); /* display hand at top of screen */
action = VOID;
ante_again =0;
ante();
money(your_stake,my_stake,pot); /* update money situation on screen */
for(first_deal =1;first_deal >= 0 && !ante_again && action!=DROP;
first_deal--)
{
last_bet=0;
total_bet=0;
last_action=VOID;
whos_go = i_go_first;
mine = evaluate(my_hand,first_deal);
turn=1; /* there is a limited number of betting turns allowed */
action = SDB(whos_go);
if(action == STAY)
{
turn ++;
whos_go = !whos_go;
last_action = STAY;
action = SDB(whos_go);
if(action == STAY)
if(first_deal)
ante_again = 1;
else
action = CALL;
}
if(!ante_again)
{
while(action!=DROP && action != CALL)
{
if (whos_go) /* my_go */
amount = (action > 8)?((action - 8) * 5):
((action - 3) * 5);
total_bet = amount + last_bet;
last_bet = amount;
pot += total_bet;
if(whos_go)
my_stake -= total_bet;
else
your_stake -= total_bet;
money(your_stake,my_stake,pot);
turn++;
whos_go = !whos_go;
last_action = action;
action = RCD(whos_go);
} /* while */
if(action == DROP)
{
if(whos_go)
your_stake += pot;
else
my_stake += pot;
pot = 0;
money(your_stake,my_stake,pot);
winner = !whos_go;
}
if(action == CALL)
{
if(whos_go)
my_stake -= last_bet;
else
your_stake -= last_bet;
pot += last_bet;
money(your_stake,my_stake,pot);
if(first_deal)
{
re_deal(my_hand,mine);
i_take(mine.reject);
get_user_changes(source,&yours.reject,
yours.exchange);
re_deal(your_hand,yours);
show_hand(your_hand,0);
}
else
{
yours = evaluate(your_hand,first_deal);
winner = det_winner(mine.hand_value,yours.hand_value,
my_hand,your_hand);
}
}/* call */
}/* not ante again */
}/*for*/
if(!ante_again)
{
if(action != DROP)
show_hand(my_hand,1);
show_winner(winner);
if(winner == 1)
my_stake += pot;
if(winner == 0)
your_stake += pot;
if(winner != -1)
pot = 0;
money(your_stake,my_stake,pot);
if((my_stake <= 0 || your_stake <= 0) && !ante_again)
{
if(my_stake == your_stake)
winner = -1;
else
winner = my_stake > your_stake;
show_over_win(winner);
}
another_go = ano_yes_no(source);
i_go_first = !i_go_first;
}
}/* 2nd do */
while((my_stake > 0 && your_stake > 0) && (ante_again || another_go));
}/* first do */
while(another_go);
if(my_stake > 0 && your_stake > 0)
{
if(my_stake == your_stake)
winner = -1;
else
winner = my_stake > your_stake;
show_over_win(winner);
}
die();
}/* end of main */