home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sunny 1,000 Collection
/
SUNNY1000.iso
/
Files
/
Dos
/
Chess
/
CHESSCLK.ZIP
/
CHESSCLK.CPP
next >
Wrap
C/C++ Source or Header
|
1995-04-15
|
8KB
|
310 lines
/****************************** Chess clock program ************************
Full-featured chess clock: Digital displays of time
Move counter
White and Black clocks separately settable
Times from 1 minute to 99 hours
Low-time warning (optional)
Flashing "tick" indicator (optional)
****************************************************************************/
// M\Cooper, 3425 Chessnut Ridge Rd., Grantsville, MD 21536-9801
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>
#include "oscr.hpp"
#include "chessclk.hpp"
#define XXPOS 60
#define YYPOS 37
//Base coordinates for time display
#define XWIDTH 580
#define YHEIGHT 25
#define XXMARGIN 50
#define LXMARGIN 26
//Whose_clock_is_running flag coordinates
void main()
{
randomize();
opening_screen();
play();
}
void CountdownTimer::clock_on()
{
time_t prev_sec;
int ch;
if( p == WHITE_ )
text_color = LIGHTBLUE;
else
text_color = DARKGRAY;
setcolor( text_color );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, 5 );
settextjustify( LEFT_TEXT, TOP_TEXT );
ShowFlag();
startn_t = time ( NULL ); //Click on stopwatch.
gotoxy( XXPOS * p + 1, YYPOS );
outtextxy( NAME_POS * p, 100, player [p] );
display_time(); //Otherwise initial time not displayed...
while( !( ch = kbhit() ) )
{
prev_sec = seconds;
if( running_flag) //Is this 2nd or later lap?
interval_t = time( NULL ) - startn_t;
else
interval_t = time( NULL ) - start_t;
running_t = total_seconds - interval_t;
convert( running_t );
if( seconds - prev_sec )
{
display_time();
if( !seconds )
if( minutes == warning )
if( !hours )
if( time_warning_flag )
blatt();
if( visual_ticking_flag ) // Show blinking box ticks?
{
setfillstyle( random ( PATTERNS ), random ( COLORS ) );
setcolor ( random ( COLORS ) );
setlinestyle( SOLID_LINE, 0xFFF, NORM_WIDTH );
bar( X_C - RADIUS, Y_C - RADIUS,
X_C + RADIUS, Y_C + RADIUS );
}
}
if( timeout() )
exit_();
}
ch = getch();
if( ch == ESC )
exit__(); // Quit.
total_seconds = hours * 3600 + minutes * 60 + seconds;
running_flag = ON; // Remember that clock was already running.
return;
}
void CountdownTimer::display_moves()
{
char buf[ 5 ];
static char ebuf[ 5 ];
if( moves > 1 )
{
setcolor( WHITE );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, 1 );
settextjustify( CENTER_TEXT, TOP_TEXT );
outtextxy( MOVES_X, MOVES_Y, ebuf );
}
sprintf( buf, "%003d", moves );
sprintf( ebuf, buf );
setcolor( LIGHTRED );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, 1 );
settextjustify( CENTER_TEXT, TOP_TEXT );
outtextxy( MOVES_X, MOVES_Y, buf );
return;
}
void graphics_setup( int background_color )
{
int grdriver = VGA,
grmode = VGAHI;
registerfarbgidriver( EGAVGA_driver_far );
registerfarbgifont( gothic_font_far );
registerfarbgifont( triplex_font_far );
initgraph( &grdriver, &grmode, "" );
setbkcolor( background_color );
}
void exit__()
{
closegraph();
exit( QUIT );
}
/***************Routine to erase old numbers*************/
void CountdownTimer::erase_numbers()
{
setcolor ( WHITE );
if( seconds == 59 )
outtextxy( p * BLK_TIME, Y_TIMEPOS, line_clear );
else
if( seconds == 9 || seconds == 19 || seconds == 29
|| seconds == 39 || seconds == 49 )
outtextxy( p * BLK_TIME + POS1_OFFSET, Y_TIMEPOS,
line_clear + 6 );
else
outtextxy( p * BLK_TIME + POS_OFFSET, Y_TIMEPOS,
line_clear + 7 );
return;
}
void play()
{
int hrs,
min;
char inputstr[ MAXLEN ],
inp;
clrscr();
textcolor ( LIGHTCYAN );
cprintf( "\n WHITE hours: " );
gets( inputstr );
hrs = atoi( inputstr );
cprintf( " WHITE minutes: " );
gets( inputstr );
min = atoi( inputstr );
CountdownTimer t1( hrs, min, WHITE_ );
textcolor( RED );
cprintf( "\n BLACK hours: " );
gets( inputstr );
hrs = atoi( inputstr );
cprintf( " BLACK minutes: " );
gets( inputstr );
min = atoi( inputstr );
CountdownTimer t2( hrs, min, BLACK_ );
textcolor( YELLOW );
cprintf( "\n\n Enable flashing clock ticks? " );
inp = getche();
if( inp == 'y' || inp == 'Y' )
t1.visual_ticking_flag = t2.visual_ticking_flag = ON;
else
t1.visual_ticking_flag = t2.visual_ticking_flag = OFF;
cprintf( "\n Enable time warning? " );
inp = getche();
if( inp == 'y' || inp == 'Y' )
{
t1.time_warning_flag = t2.time_warning_flag = ON;
cprintf( " At how many minutes? " );
gets( inputstr );
t1.warning = t2.warning = atoi( inputstr );
}
else
t1.time_warning_flag = t2.time_warning_flag = OFF;
textcolor( GREEN | BLINK );
_setcursortype( _NOCURSOR );
printf( "\n\n\n\n\n\n\n\n\n\n\n\n" );
cprintf( " PRESS A KEY TO BEGIN" );
while ( !getch() );
beep1(); //BEEP
graphics_setup( WHITE );
t1.initialize_clock();
t1.moves++;
t1.display_moves();
t1.clock_on();
beep1();
t2.initialize_clock();
t2.clock_on();
beep2();
while ( PLAY )
{
t1.moves++;
t1.display_moves();
t1.clock_on();
beep1();
t2.clock_on();
beep2();
}
} // End play()
void opening_screen()
{
char topline[] = "Chess Clock",
by_line[] = "by",
name_line[] = "M\\Cooper",
endline[] = "PRESS A KEY";
graphics_setup( CYAN );
settextstyle( GOTHIC_FONT, HORIZ_DIR, HEADLINE_SIZE );
settextjustify( CENTER_TEXT, CENTER_TEXT );
setcolor( MAGENTA );
outtextxy( TOPX, TOPY, topline );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, BY_LINE_SIZE );
setcolor( BLUE );
outtextxy( BY_LINE_X, BY_LINE_Y, by_line );
setfillstyle( BAR_PATTERN, BAR_COLOR );
bar3d( BAR_LEFT, BAR_TOP, BAR_RIGHT, BAR_BOTTOM, BAR_DEPTH, BAR_TOPFLAG );
setfillstyle( PIE_PATTERN, PIE_COLOR );
pieslice( PIE1_X, PIE_Y, PIE_STARTANGLE, PIE_ENDANGLE, PIE_RADIUS );
pieslice( PIE2_X, PIE_Y, PIE_STARTANGLE, PIE_ENDANGLE, PIE_RADIUS );
circle( PIE1_X, PIE_Y, CIRC_RAD );
circle( PIE2_X, PIE_Y, CIRC_RAD );
line( LINE1_X, LINE_Y1, LINE1_X, LINE_Y2 );
line( LINE2_X, LINE_Y1, LINE2_X, LINE2_Y2 );
setfillstyle( PIE_PATTERN, WHITE );
bar( B1_LEFT, B1_TOP, B1_RIGHT, B_BOTTOM );
bar( B2_LEFT, B2_TOP, B2_RIGHT, B_BOTTOM );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, NAME_LINE_SIZE );
setcolor( BLUE );
outtextxy( NAME_LINE_X, NAME_LINE_Y, name_line );
sleep( DELAY );
settextstyle( TRIPLEX_FONT, HORIZ_DIR, ENDLINE_SIZE );
setcolor( RED );
outtextxy( ENDLINE_X, ENDLINE_Y, endline );
getch();
closegraph();
return;
}
void CountdownTimer::ShowFlag()
{
//Show flag over clock in use.
setfillstyle( INTERLEAVE_FILL, LIGHTRED );
bar( XXPOS * p + LXMARGIN, YYPOS,
XXPOS * p + XWIDTH - LXMARGIN, YYPOS + YHEIGHT );
//Erase flag over clock *not* in use.
setfillstyle( SOLID_FILL, WHITE );
if( p == WHITE_ ) pp = BLACK_;
else pp = WHITE_;
bar( XXPOS * pp + LXMARGIN, YYPOS,
XXPOS * pp + XWIDTH - LXMARGIN, YYPOS + YHEIGHT );
return;
}