|
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: 6808 (0x1a98) Types: TextFile Names: »p_hand.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Poker2/p_hand.c«
#include "poker.h" /* p_hand.c what is in the hand */ flush flusher(hand) playing_card *hand; /* Identify the xistence of a (partial)flush, and record the cards involved */ { flush result; int count1,count2,x_posn; int suit_matrix[4][HAND_SIZE + 1]; /* suit_matrix holds the no. of cards in each suit */ result.flush_of = 0; /* clear suit_matrix */ for(count1=0;count1<4;count1++) suit_matrix[count1][0] = 0; /* fill in suit_matrix */ for(count1=0;count1 < HAND_SIZE;count1++) { x_posn = hand[count1].suit_value; suit_matrix[x_posn][(++suit_matrix[x_posn][0])] = count1; } for(count1=0;count1<4;count1++) if((result.flush_of = suit_matrix[count1][0]) >= 3) { for(count2=1;count2 <= result.flush_of; count2++) result.cards[count2 - 1] = suit_matrix[count1][count2]; break; } return result; }/* flusher */ int high_straight(hand) playing_card *hand; /* Identify the existence of a five card straight */ { int have,ace; int total,mean,count; total=0; ace=0; ace = (hand[0].face_value == 1); for(count=0;count<HAND_SIZE;count++) total += hand[count].face_value; mean = total/HAND_SIZE; have=1; if(!(total == 47 && ace)) /* i.e not AKQJT */ for (count=0;count<HAND_SIZE;count++) if (hand[count].face_value > (mean + 2) || hand[count].face_value < (mean - 2)) have =0; return have; }/* high straight */ prile pairs(hand) playing_card *hand; /* find any pairs, or groupings of pairs */ { int count,card_count,res,card; int check[13]; prile result; for(count=0;count<13;count++) check[count] = 0; /* clear check */ res = 2; result.no_of_cards = 0; check[hand[0].face_value - 1] = 2; for(count=1;count<HAND_SIZE;count++) { card = hand[count].face_value - 1; if (check[card] >= 2) { res *= check[card]; check[card] = res; } else check[card] = 2; } result.p_type = res; if (res > 2) { card_count = 0; for(count =0;count<HAND_SIZE;count++) if(check[hand[count].face_value - 1] > 2) result.cards[card_count++] = count; } return result; }/* pairs */ run runs(in_hand,pair,posn) playing_card *in_hand; int pair; int posn; /* Identify any partial runs, of length >= 3 */ /* It uses a sliding window, of varying size, to isolate */ /* any runs, then does specific checks at the end for open */ /* runs, such as 34_67 */ { playing_card hand[HAND_SIZE]; int start,window,sum,mean; int remove,compare,limit; int straight,count; int diff,begin; run result; for(count=0;count<HAND_SIZE;count++) /* move in_hand to hand */ /* so as not to corrupt hand */ hand[count] = in_hand[count]; start = 0; window = 3; result.length = 0; result.open_str = 0; begin = 0; if (pair) /* if a pair is present */ { if(posn == 0) /* check if card is first in hand */ /* then find a card to compare suits with */ compare = 2; else compare = posn - 1; /* preserve any straight flushes */ if(hand[posn].suit == hand[compare].suit) remove = posn + 1; else remove = posn; /* shift chosen card to right of hand */ for(count=remove+1;count < HAND_SIZE;count++) swap((hand + count -1),(hand+count)); } limit = HAND_SIZE - pair; /* 4 or 5 */ /* limit is the number of cards, in the possibly altered hand */ do { sum =0; for (count = start;count < (start + window);count++) sum += hand[count].face_value; mean = sum/window; straight = 1; /* disprove that a straight is present */ diff = window/2; for(count = start;(count < (start + window) && straight );count++) straight = !(hand[count].face_value < mean - diff || hand[count].face_value > mean + diff); /* i.e is there a run present */ if (straight) { result.length = window++; begin = start; } else start++; } while(start + window <= limit); if(result.length > 0) /* identify cards in run */ for (count = 0;count < result.length;count++) result.card[count] = begin + count; if(result.length == 3) /* look for open straight */ { if (begin > 0) { /* check card to left */ if(hand[(begin - 1)].face_value == hand[begin].face_value - 2) { result.card[ result.length++ ] = begin - 1; result.open_str = 1; } if((begin + 2) < (limit - 1)) /* check card to right if 3 run is in middle of hand */ if(hand[limit].face_value == hand[limit - 1].face_value + 2) { result.card[ result.length++ ] = limit; result.open_str = 1; } } else /* begin = 0 */ if (hand[3].face_value == hand[2].face_value + 2) { result.card[result.length++ ] = 3; result.open_str = 1; } } if(hand[0].face_value == 1) /* handle any possible top straight */ { if(hand[limit].face_value == 13 && hand[limit-1].face_value == 12) if (hand[limit-2].face_value == 11) { result.length = 4; result.card[0] = 0; result.card[1] = limit-2; result.card[2] = limit-1; result.card[3] = limit; } else { result.length = 3; result.card[0] = 0; result.card[1] = limit-1; result.card[2] = limit; } else /* look for TJQA */ { if (hand[limit].face_value == 12 && hand[limit-1].face_value == 11) if (hand[limit-2].face_value == 10) { result.length = 4; result.card[0] = 0; result.card[1] = limit-2; result.card[2] = limit-1; result.card[3] = limit; result.open_str = 1; } } } if(pair) /* undo shifting of cards */ /* by incrementing the positon of cards to the right of the */ /* moved card */ for(count=0;count<result.length;count++) result.card[count] += (count >= remove); return result; }/* runs */ high high_cards(hand) playing_card *hand; /* find all the High cards, i.e. >= 10 */ { int count; high result; result.number = 0; for(count=0;count<HAND_SIZE;count++) if(hand[count].face_value >= 10 || hand[count].face_value == 1) result.cards[result.number++] = count; if(result.number == 1) /* choose a 2nd card to keep,but don`t report */ result.cards[1] = (hand[0].face_value == 1)?4:3; if(result.number == 0) { result.cards[0] = 3; result.cards[1] = 4; /* keep top highest two cards */ } return result; }/* high cards */