/* Program: MINE.C Author : Kim Moser Date : 4/25/89 System : IBM PC / Borland Turbo-C 2.0 Descrip: Mine Field (game) Usage : MINE [-t] SWITCH MEANING t Display title screen quickly (default when monochrome monitor in use) */ #include "kmvid.h" #include #include #include #include #include #include int fast=1; /* @@@ */ #define MS 90 /* How many miliseconds to delay between shades of color */ void fadeatcenter( y, f, b, s ) scrncoord y; color f, b; char *s; { struct { char line[80]; } str[20]; int i=0,k=0,j=0; /* Indices into s, str, and str[k].line, respectively */ /* Parse 's' into local array: */ for ( i=0; s[i]!='\0'; i++ ) { if (s[i]=='\n') { /* New line */ /* Seal off this string and point to next: */ str[k++].line[j] = '\0'; j=0; /* Start at first char of new string */ /* Point to next char in 's' [assumed not to be '\n']: */ i++; } str[k].line[j++] = s[i]; } str[k].line[j] = '\0'; /* Seal off last string */ /* 'k' now contains number of menu choices */ /* Fade: */ if ( (vidmode()!=7) && !(fast) ) { /* Not a monochrome system, or user requested fast title screen */ set_color( BLUE, BLACK ); for (i=0; i<=k; i++) writeatcenter( y+i, str[i].line ); delay(MS); set_color( LIGHTBLUE, BLACK ); for (i=0; i<=k; i++) writeatcenter( y+i, str[i].line ); delay(MS); set_color( LIGHTCYAN, BLACK ); for (i=0; i<=k; i++) writeatcenter( y+i, str[i].line ); delay(MS); set_color( WHITE, BLACK ); for (i=0; i<=k; i++) writeatcenter( y+i, str[i].line ); delay(1000); } set_color( f, b ); for (i=0; i<=k; i++) { writeatcenter( y+i, str[i].line ); } } void intro(void) { clearscr( WHITE, BLACK ); fadeatcenter( 6, WHITE, BLACK, "MINE FIELD" ); fadeatcenter( 7, LIGHTGRAY, BLACK, "The computer game" ); fadeatcenter( 10, BLUE, BLACK, "Based on an earlier program\nby" ); fadeatcenter( 12, LIGHTBLUE, BLACK, "Kim Moser and Erik Francois" ); fadeatcenter( 15, CYAN, BLACK, "IBM PC version\nby" ); fadeatcenter( 17, LIGHTCYAN, BLACK, "Kim Moser" ); fadeatcenter( 18, LIGHTGREEN, BLACK, "4/25/89 (v1.0)" ); } #define NORTH 1 #define EAST 2 #define SOUTH 3 #define WEST 4 #define NE 5 #define NW 6 #define SE 7 #define SW 8 #define MINECHAR '*' #define MINEFORE WHITE /* @@@ ^^^ change to black when done */ #define MINEBACK BLACK #define SPACECHAR ' ' #define SPACEFORE BLACK #define SPACEBACK BLACK #define BRICKCHAR '\xFE' #define BRICKFORE RED #define BRICKBACK BLACK #define CRATERCHAR 'o' #define CRATERFORE LIGHTGRAY #define CRATERBACK BLACK #define PLAYERCHAR '\x02' #define PLAYERFORE WHITE #define PLAYERBACK BLACK char UNDERCHAR=SPACECHAR; /* What is "under" player's feet */ color UNDERFORE; color UNDERBACK; int LEVEL=9; /* 0..3 */ scrncoord X1=2, Y1=3, X2, Y2; scrncoord PX, PY; int MOVED=0; /* Set to 1 by walk() */ int GAMEOVER=0; long int BRICKS=10; /* How many bricks player is holding */ int rnd(low,high) int low,high; /* Returns a random number 'n' such that 'low' <= 'n' <= 'high' */ { if (low>high) return rnd(high,low); else return( random(high-low+1)+low ); } void setupfield(void) /* Sets up field with mines and bricks */ { int i; int posX, posY; randomize(); /* Set up field */ set_color(MINEFORE,MINEBACK); for (i=0; i