This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/win/watzee/wdice.c

158 lines
4.4 KiB
C

#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "watzee.h"
/*
* GetDiceBitmaps -- load the dice bitmaps and scale them
*/
extern void GetDiceBitmaps( HWND hwnd )
/*************************************/
{
BITMAP bitmap1;
BITMAP bitmap2;
HANDLE hinstance;
HDC hdc;
HDC hdcmem1;
HDC hdcmem2;
HBITMAP hbitmap1;
HBITMAP hbitmap2;
char bitmapname[6];
short i;
hinstance = GET_HINST( hwnd );
hdc = CreateIC( "DISPLAY", NULL, NULL, NULL );
hdcmem1 = CreateCompatibleDC( hdc );
hdcmem2 = CreateCompatibleDC( hdc );
for( i = 0; i < 6; i++ ) {
sprintf( bitmapname, "DICE%d", i+1 );
hbitmap1 = LoadBitmap( hinstance, bitmapname );
GetObject( hbitmap1, sizeof( BITMAP ), (LPSTR) &bitmap1 );
bitmap2 = bitmap1;
bitmap2.bmWidth = CharWidth * 3;
bitmap2.bmHeight = CharHeight * 3;
bitmap2.bmWidthBytes = ( ( bitmap2.bmWidth + 15 ) / 16 ) * 2;
hbitmap2 = CreateBitmapIndirect( &bitmap2 );
SelectObject( hdcmem1, hbitmap1 );
SelectObject( hdcmem2, hbitmap2 );
StretchBlt( hdcmem2, 0, 0, bitmap2.bmWidth, bitmap2.bmHeight,
hdcmem1, 0, 0, bitmap1.bmWidth, bitmap1.bmHeight, SRCCOPY );
SetWindowLong( hwnd, i * sizeof( DWORD ), (DWORD)hbitmap2 );
}
DeleteDC( hdcmem1 );
DeleteDC( hdcmem2 );
DeleteObject( hbitmap1 );
DeleteDC( hdc );
}
/*
* RollDice -- for the dice that have been selected, pick random values for
* them (between 1 and 6, ofcourse), and redraw the dice bitmaps
*/
extern void RollDice( HWND hwnd, HDC hdc )
/****************************************/
{
short i;
short j;
srand( (unsigned short) time( NULL ) );
for( i = 0; i < 150; i++ ) {
for( j = 0; j < 5; j++ ) {
if( ( DieCheckMeansRoll && Dice[j].is_checked )
|| ( !DieCheckMeansRoll && !Dice[j].is_checked ) ) {
Dice[j].value = (short)(rand()%6+1);
}
}
DrawDice( hwnd, hdc );
}
if( ResetDieChecks || CurrentRoll != 1 ) {
for( i = 0; i < 5; i++ ) {
CheckDlgButton( hwnd, IDW_DICE1+i, FALSE );
Dice[i].is_checked = FALSE;
}
}
}
/*
* GetDiceInfo -- after the dice have been rolled, collect some stats about
* them, such as how many 1's, 2's, 3's, etc. there are,
* and whether they form a straight, full house, Watzee, etc.
*/
extern void GetDiceInfo( void )
/*****************************/
{
short dice_sum;
short die_count[7];
short this_die;
BOOL got_three_kind;
BOOL got_four_kind;
BOOL got_full_house;
BOOL got_small_straight;
BOOL got_large_straight;
BOOL got_watzee;
short i;
dice_sum = 0;
got_three_kind = FALSE;
got_four_kind = FALSE;
got_watzee = FALSE;
got_full_house = FALSE;
got_small_straight = FALSE;
got_large_straight = FALSE;
for( i = 0; i < 7; i++ ) {
die_count[i] = 0;
}
for( i = 0; i < 5; i++ ) {
this_die = Dice[i].value;
dice_sum += this_die;
die_count[ this_die ]++;
}
for( i = ACES; i <= SIXES; i++ ) {
DiceInfo.count[i] = die_count[i];
if( die_count[i] >= 3 ) {
got_three_kind = TRUE;
}
if( die_count[i] >= 4 ) {
got_four_kind = TRUE;
}
if( die_count[i] == 5 ) {
got_watzee = TRUE;
}
}
if( got_three_kind ) {
for( i = ACES; i <= SIXES; i++ ) {
if( die_count[i] == 2 ) {
got_full_house = TRUE;
break;
}
}
}
if( die_count[3] && die_count[4] ) {
if( ( die_count[1] && die_count[2] )
|| ( die_count[2] && die_count[5] )
|| ( die_count[5] && die_count[6] ) ) {
got_small_straight = TRUE;
}
}
if( (die_count[1] || die_count[6]) && die_count[2] && die_count[3] &&
die_count[4] && die_count[5] ) {
got_large_straight = TRUE;
}
DiceInfo.sum = dice_sum;
DiceInfo.got_three_kind = got_three_kind;
DiceInfo.got_four_kind = got_four_kind;
DiceInfo.got_full_house = got_full_house;
DiceInfo.got_small_straight = got_small_straight;
DiceInfo.got_large_straight = got_large_straight;
DiceInfo.got_watzee = got_watzee;
}