home *** CD-ROM | disk | FTP | other *** search
- {-------------------------------}
- { ROLLEM }
- { }
- { A dice game in Turbo Pascal }
- { }
- { by Jeff Duntemann }
- { }
- { Last modified: 12/4/84 }
- {-------------------------------}
-
- PROGRAM ROLLEM;
-
- CONST DICE_FACES : ARRAY[0..5,0..2] OF STRING[5] =
- ((' ',' o ',' '), { 1 }
- ('o ',' ',' o'), { 2 }
- (' o',' o ','o '), { 3 }
- ('o o',' ','o o'), { 4 }
- ('o o',' o ','o o'), { 5 }
- ('o o o',' ','o o o')); { 6 }
-
- TYPE GRAFREC = RECORD
- UL_CORNER,
- UR_CORNER,
- LL_CORNER,
- LR_CORNER,
- H_BAR,
- V_BAR,
- LINE_CROSS,
- T_DOWN,
- T_UP,
- T_RIGHT,
- T_LEFT : STRING[4]
- END;
-
- STRING80 = STRING[80];
-
-
- VAR GRAFCHARS : GRAFREC;
- TOSS : INTEGER;
- BANNER : STRING80;
- DICE : INTEGER;
- DICE_X : INTEGER;
- I : INTEGER;
- CH : CHAR;
- QUIT : BOOLEAN;
-
-
- PROCEDURE DEFINE_CHARS(VAR GRAFCHARS : GRAFREC);
-
- BEGIN
- WITH GRAFCHARS DO
- BEGIN
- UL_CORNER := CHR(201);
- UR_CORNER := CHR(187);
- LL_CORNER := CHR(200);
- LR_CORNER := CHR(188);
- H_BAR := CHR(205);
- V_BAR := CHR(186);
- LINE_CROSS := CHR(206);
- T_DOWN := CHR(203);
- T_UP := CHR(202);
- T_RIGHT := CHR(185);
- T_LEFT := CHR(204)
- END
- END;
-
-
- PROCEDURE MAKE_BOX(X,Y,WIDTH,HEIGHT : INTEGER;
- GRAFCHARS : GRAFREC);
-
- VAR I,J : INTEGER;
-
- BEGIN
- IF X < 0 THEN X := (80-WIDTH) DIV 2; { Negative X centers box }
- WITH GRAFCHARS DO
- BEGIN { Draw top line }
- GOTOXY(X,Y); WRITE(UL_CORNER);
- FOR I := 3 TO WIDTH DO WRITE(H_BAR);
- WRITE(UR_CORNER);
- { Draw bottom line }
- GOTOXY(X,(Y+HEIGHT)-1); WRITE(LL_CORNER);
- FOR I := 3 TO WIDTH DO WRITE(H_BAR);
- WRITE(LR_CORNER);
- { Draw sides }
- FOR I := 1 TO HEIGHT-2 DO
- BEGIN
- GOTOXY(X,Y+I); WRITE(V_BAR);
- GOTOXY((X+WIDTH)-1,Y+I); WRITE(V_BAR)
- END
- END
- END;
-
-
- PROCEDURE ROLL(X,Y : INTEGER;
- NUMBER_OF_DICE : INTEGER;
- VAR TOSS : INTEGER);
-
- VAR I,J,THROW,X_OFFSET : INTEGER;
-
- BEGIN
- IF (NUMBER_OF_DICE * 9)+X >= 80 THEN { Too many dice horizontally }
- NUMBER_OF_DICE := (80-X) DIV 9; { will scramble the CRT display! }
- FOR I := 1 TO NUMBER_OF_DICE DO
- BEGIN
- X_OFFSET := (I-1)*9; { Nine space offset for each die }
- MAKE_BOX(X+X_OFFSET,Y,7,5,GRAFCHARS); { Draw a die }
- THROW := RANDOM(6); { "Toss" it }
- FOR J := 0 TO 2 DO { and fill it with dots }
- BEGIN
- GOTOXY(X+1+X_OFFSET,Y+1+J);
- WRITE(DICE_FACES[THROW,J])
- END
- END
- END;
-
-
-
- BEGIN
- RANDOMIZE; { Seed the pseudorandom number generator }
- CLRSCR; { Clear the entire screen }
- QUIT := FALSE; { Initialize the quit flag }
- DEFINE_CHARS(GRAFCHARS); { Go get box-draw characters for this machine }
- BANNER := 'GONNA ROLL THE BONES!';
- MAKE_BOX(-1,1,LENGTH(BANNER)+4,3,GRAFCHARS); { Draw banner box }
- GOTOXY((80-LENGTH(BANNER)) DIV 2,2); WRITE(BANNER); { Put banner in it }
- REPEAT
- REPEAT
- FOR I := 6 TO 18 DO { Clear the game portion of screen }
- BEGIN
- GOTOXY(1,I);
- CLREOL
- END;
- GOTOXY(1,6);
- WRITE('>>How many dice will we roll this game? (1-5, or 0 to exit): ');
- READLN(DICE);
- IF DICE = 0 THEN QUIT := TRUE ELSE { Zero dice sets quit flag }
- IF (DICE < 1) OR (DICE > 5) THEN { Show error for dice out of range }
- BEGIN
- GOTOXY(0,23);
- WRITE('>>The legal range is 1-5 dice!')
- END
- UNTIL (DICE >= 0) AND (DICE <= 5);
- GOTOXY(0,23); CLREOL; { Get rid of any leftover error messages }
- IF NOT QUIT THEN { Play the game! }
- BEGIN
- DICE_X := (80-(9*DICE)) DIV 2; { Calculate centered X for dice }
- REPEAT
- GOTOXY(1,16); CLREOL;
- ROLL(DICE_X,9,DICE,TOSS); { Roll & draw dice }
- GOTOXY(1,16); WRITE('>>Roll again? (Y/N): ');
- READLN(CH);
- UNTIL NOT (CH IN ['Y','y']);
- GOTOXY(1,18); WRITE('>>Play another game? (Y/N): ');
- READLN(CH);
- IF NOT (CH IN ['Y','y']) THEN QUIT := TRUE
- END
- UNTIL QUIT { Quit flag set ends the game }
- END.
-