!*************************** AMUS Program Label ******************************
! Filename: YATZEE.BAS Date: 08/05/91
! Category: GAME Hash Code: 772-303-323-766 RUN Version: 1.0(101)
! Initials: ULTR/US Name: DAVID PALLMANN
! Company: ULTRASOFT CORPORATION Telephone #: 5163484848
! Related Files: YATZEE.SBR
! Min. Op. Sys.: AMOSL 1.3B/AMOS32 1.0 Expertise Level: BEG
! Special: Needs Put YATZEE.SBR in BAS:, load into memory for faster execut.
! Description: Alpha version of the popular dice game YAHTZEE
!*****************************************************************************
!****************************************************************************
!* *
!* "YAHTZEE" *
!* Computer Version of the Dice Game *
!* *
!****************************************************************************
!David Pallmann, UltraSoft Corporation
!
!Requires YATZEE.SBR
MOVE: IF MOVES=13 THEN GOTO END'GAME
MOVES = MOVES+1
FIRST'ROLL:
ROLLS = 1
PRINT TAB(6,62); SPACE(16);
PRINT TAB(8,62); SPACE(16);
PRINT TAB(10,62); SPACE(16);
CALL CLEAR'INSTRUCTIONS
ROW = 6
FOR I = 1 TO 5 : FLAG(I) = 1 : NEXT I
CALL GET'ROLL
CALL SORT
PRINT TAB(-1,12);
FOR I = 1 TO 5
PRINT TAB(ROW,I*3+61); STR(ROLL(I));
NEXT I
FR2: PRINT TAB(16,59); "Enter Y or N for";
PRINT TAB(17,59); "each die. If you";
PRINT TAB(18,59); "do not wish to";
PRINT TAB(19,59); "roll again, press";
PRINT TAB(20,59); "Q.";
ROW = 8
PRINT TAB(-1,11);
FOR I = 1 TO 5
FLAG(I) = 0
PRINT TAB(ROW,I*3+62); TAB(-1,31);
PRINT TAB(ROW,I*3+60); TAB(-1,30); STR(ROLL(I)); TAB(-1,31);
PRINT TAB(ROW,I*3+61);
FR2A: XCALL YATZEE, CHAR
CHAR = UCS(CHAR)
IF CHAR="N" OR CHAR=" " THEN GOTO FR3
IF CHAR="Y" OR CHAR="R" THEN GOTO FR2B
IF CHAR="Q" OR CHAR=CHR(27) OR CHAR=CHR(11) OR CHAR=CHR(10) &
THEN I = 5 : GOTO FR4
PRINT CHR(7);
GOTO FR2A
FR2B: PRINT TAB(-1,12);
PRINT TAB(ROW,I*3+60); " "; STR(ROLL(I)); " ";
PRINT TAB(-1,11);
FLAG(I) = 1
GOTO FR4
FR3: PRINT TAB(ROW,I*3+60); " "; STR(ROLL(I)); " ";
FR4: NEXT I
IF CHAR="Q" OR CHAR=CHR(27) OR CHAR=CHR(11) OR CHAR=CHR(10) THEN GOTO SELECT
IF FLAG(1)=FLAG(2) AND FLAG(2)=FLAG(3) AND FLAG(3)=FLAG(4) AND &
FLAG(4)=FLAG(5) AND FLAG(1)=0 THEN GOTO SELECT
SECOND'ROLL:
ROLLS = 2
CALL CLEAR'INSTRUCTIONS
ROW = 8
CALL GET'ROLL
PRINT TAB(-1,12);
FOR I = 1 TO 5
PRINT TAB(ROW,I*3+61); STR(ROLL(I));
NEXT I
SR2: PRINT TAB(16,59); "Enter Y or N for";
PRINT TAB(17,59); "each die. If you";
PRINT TAB(18,59); "do not wish to";
PRINT TAB(19,59); "roll again, press";
PRINT TAB(20,59); "Q.";
ROW = 10
PRINT TAB(-1,11);
FOR I = 1 TO 5
FLAG(I) = 0
PRINT TAB(ROW,I*3+62); TAB(-1,31);
PRINT TAB(ROW,I*3+60); TAB(-1,30); STR(ROLL(I)); TAB(-1,31);
PRINT TAB(ROW,I*3+61);
SR2A: XCALL YATZEE, CHAR
CHAR = UCS(CHAR)
IF CHAR="N" OR CHAR=" " THEN GOTO SR3
IF CHAR="Y" OR CHAR="R" THEN GOTO SR2B
IF CHAR="Q" OR CHAR=CHR(27) OR CHAR=CHR(11) OR CHAR=CHR(10) &
THEN I = 5 : GOTO FR4
PRINT CHR(7);
GOTO SR2A
SR2B: PRINT TAB(-1,12);
PRINT TAB(ROW,I*3+60); " "; STR(ROLL(I)); " ";
PRINT TAB(-1,11);
FLAG(I) = 1
GOTO SR4
SR3: PRINT TAB(ROW,I*3+60); " "; STR(ROLL(I)); " ";
SR4: NEXT I
IF CHAR="Q" OR CHAR=CHR(27) OR CHAR=CHR(11) OR CHAR=CHR(10) THEN GOTO SELECT
IF FLAG(1)=FLAG(2) AND FLAG(2)=FLAG(3) AND FLAG(3)=FLAG(4) AND &
FLAG(4)=FLAG(5) AND FLAG(1)=0 THEN GOTO SELECT
THIRD'ROLL:
ROLLS = 3
CALL GET'ROLL
PRINT TAB(-1,12);
FOR I = 1 TO 5
PRINT TAB(ROW,I*3+61); STR(ROLL(I));
NEXT I
SELECT: PRINT TAB(-1,29); TAB(-1,12);
CALL CLEAR'INSTRUCTIONS
PRINT TAB(16,59); "Use ARROW KEYS to";
PRINT TAB(17,59); "to select scoring";
PRINT TAB(18,59); "you wish to apply";
PRINT TAB(19,59); "this roll to.";
PRINT TAB(21,59); "Press SPACE BAR";
PRINT TAB(22,59); "to post score.";
ROW = 4
COL = 14
INDEX = 1
DIR = 1
MARK: IF SCORE(INDEX)<>-1 AND DIR=0 THEN GOTO UP
IF SCORE(INDEX)<>-1 THEN GOTO DOWN
CALL GET'SCORE
PRINT TAB(ROW,COL+6); TAB(-1,33); TAB(ROW,COL); TAB(-1,32);
PRINT USING "#####", SCORE;
PRINT TAB(-1,33);
GET: XCALL YATZEE, CHAR
CHAR = UCS(CHAR)
IF CHAR=CHR(11) THEN GOTO UP
IF CHAR=CHR(10) OR CHAR=CHR(13) THEN GOTO DOWN
IF CHAR=" " OR CHAR="Y" THEN GOTO RECORD
IF CHAR="Q" OR CHAR=CHR(27) THEN GOTO QUIT
IF (CHAR="R" OR CHAR=CHR(8) OR CHAR=CHR(12)) AND ROLLS=1 THEN GOTO BACK'1
IF (CHAR="R" OR CHAR=CHR(8) OR CHAR=CHR(12)) AND ROLLS=2 THEN GOTO BACK'2
PRINT CHR(7);
GOTO GET
UP: DIR = 0
IF SCORE(INDEX)=-1 THEN PRINT TAB(ROW,COL); SPACE(7);
IF INDEX=1 THEN INDEX = 13 : ROW = 16 : COL = 45 : GOTO MARK
INDEX = INDEX-1
ROW = ROW-2
IF INDEX<>6 THEN GOTO MARK
ROW = 14 : COL = 14
GOTO MARK
DOWN: DIR = 1
IF SCORE(INDEX)=-1 THEN PRINT TAB(ROW,COL); SPACE(7);
IF INDEX=13 THEN INDEX = 1 : ROW = 4 : COL = 14 : GOTO MARK
INDEX = INDEX+1
ROW = ROW+2
IF INDEX<>7 THEN GOTO MARK
ROW = 4 : COL = 45
GOTO MARK
RECORD: SCORE(INDEX) = SCORE
SHOW'SCORE:
PRINT TAB(ROW,COL);
PRINT USING "###### ", SCORE(INDEX);
TOP = 0
FOR I = 1 TO 6
IF SCORE(I)<>-1 THEN TOP = TOP+SCORE(I)
NEXT I
PRINT TAB(16,14);
PRINT USING "######"; TOP;
IF TOP>=63 THEN TOP = TOP+35 : PRINT TAB(18,14); " 35";
PRINT TAB(20,14);
PRINT USING "######"; TOP;
PRINT TAB(20,45);
PRINT USING "######"; TOP;
BOTTOM = 0
FOR I = 7 TO 13
IF SCORE(I)<>-1 THEN BOTTOM = BOTTOM+SCORE(I)
NEXT I
PRINT TAB(18,45);
PRINT USING "######"; BOTTOM;
PRINT TAB(20,45);
PRINT USING "######"; TOP;
PRINT TAB(22,45);
PRINT USING "######"; TOP+BOTTOM;
CALL CLEAR'INSTRUCTIONS
GOTO MOVE
END'GAME:
LOOKUP "YATZEE.DAT", I
IF I=0 THEN GOTO NEW'HIGH'SCORE
OPEN #1, "YATZEE.DAT", INPUT
INPUT #1, HIGH'SCORE, HIGH'NAME
CLOSE #1
IF (TOP+BOTTOM)<=HIGH'SCORE THEN GOTO ANOTHER
NEW'HIGH'SCORE:
PRINT TAB(24,1); "New high score! Please enter your name: ";
XCALL YATZEE, 24, 42, "*", 1, 30, "F", NAME, KEY
ON KEY GOTO ANOTHER
HIGH'SCORE = TOP+BOTTOM
HIGH'NAME = NAME
OPEN #1, "YATZEE.DAT", OUTPUT
PRINT #1, STR(TOP+BOTTOM);
PRINT #1, ","; CHR(34); NAME; CHR(34)
CLOSE #1
ANOTHER:
PRINT TAB(24,1); "Would you like to play again? "; TAB(-1,9); TAB(-1,28);
A1: XCALL YATZEE, CHAR
CHAR = UCS(CHAR)
IF CHAR="Y" OR CHAR=" " OR CHAR=CHR(13) THEN GOTO NEW'GAME
IF CHAR<>"N" AND CHAR<>"Q" AND CHAR<>CHR(27) THEN GOTO A1
! GOTO QUIT
QUIT: PRINT TAB(-1,28); TAB(-1,12); TAB(-1,0);
END
!**********
!* SORT *
!**********
!Function: Sort rolls into ascending order
SORT: I = 1
S1: IF I=5 THEN RETURN
IF ROLL(I+1)>=ROLL(I) THEN GOTO S2
J = ROLL(I)
ROLL(I) = ROLL(I+1)
ROLL(I+1) = J
IF I=1 THEN GOTO S1
I = I-1
GOTO S1
S2: I = I+1
GOTO S1
!************************
!* CLEAR'INSTRUCTIONS *
!************************
!Clear instruction box text from screen
CLEAR'INSTRUCTIONS:
FOR ROW = 16 TO 22
PRINT TAB(ROW,59); SPACE(19);
NEXT ROW
RETURN
!**************
!* GET'ROLL *
!**************
!Function: (Re-)roll 1-5 dice based on FLAG(1) through FLAG(5)
GET'ROLL:
FOR I = 1 TO 5
IF FLAG(I)=0 THEN GOTO GR1
ROLL(I) = INT(RND(0)*6)+1
FLAG(I) = 0
GR1: NEXT I
RETURN
GET'SCORE:
SCORE = 0
ON INDEX GOTO SCORE'1, SCORE'2, SCORE'3, SCORE'4, SCORE'5, SCORE'6, &
SCORE'3K, SCORE'4K, SCORE'FH, SCORE'SS, SCORE'LS, SCORE'Y, SCORE'C
END
SCORE'1:
FOR I = 1 TO 5
IF ROLL(I)=1 THEN SCORE = SCORE+1
NEXT I
GOTO GS'RTN
SCORE'2:
FOR I = 1 TO 5
IF ROLL(I)=2 THEN SCORE = SCORE+2
NEXT I
GOTO GS'RTN
SCORE'3:
FOR I = 1 TO 5
IF ROLL(I)=3 THEN SCORE = SCORE+3
NEXT I
GOTO GS'RTN
SCORE'4:
FOR I = 1 TO 5
IF ROLL(I)=4 THEN SCORE = SCORE+4
NEXT I
GOTO GS'RTN
SCORE'5:
FOR I = 1 TO 5
IF ROLL(I)=5 THEN SCORE = SCORE+5
NEXT I
GOTO GS'RTN
SCORE'6:
FOR I = 1 TO 5
IF ROLL(I)=6 THEN SCORE = SCORE+6
NEXT I
GOTO GS'RTN
SCORE'3K:
CALL SORT
IF ROLL(1)=ROLL(2) AND ROLL(2)=ROLL(3) THEN GOTO SCORE'C
IF ROLL(2)=ROLL(3) AND ROLL(3)=ROLL(4) THEN GOTO SCORE'C
IF ROLL(3)=ROLL(4) AND ROLL(4)=ROLL(5) THEN GOTO SCORE'C
GOTO GS'RTN
SCORE'4K:
CALL SORT
IF ROLL(1)=ROLL(2) AND ROLL(2)=ROLL(3) AND ROLL(3)=ROLL(4) THEN GOTO SCORE'C
IF ROLL(2)=ROLL(3) AND ROLL(3)=ROLL(4) AND ROLL(4)=ROLL(5) THEN GOTO SCORE'C
GOTO GS'RTN
SCORE'FH:
CALL SORT
IF ROLL(1)=ROLL(2) AND ROLL(3)=ROLL(4) AND ROLL(4)=ROLL(5) AND ROLL(1)<>ROLL(5) THEN SCORE = 25 : GOTO GS'RTN
IF ROLL(4)=ROLL(5) AND ROLL(1)=ROLL(2) AND ROLL(2)=ROLL(3) AND ROLL(1)<>ROLL(5) THEN SCORE = 25 : GOTO GS'RTN
GOTO GS'RTN
SCORE'SS:
CALL SORT
STRING = ""
FOR I = 1 TO 5
STRING = STRING+STR(ROLL(I))
NEXT I
STRING = " "+STRING+" "
FOR I = 1 TO 6
SS1: J = INSTR(1,STRING,STR(I)+STR(I))
IF J=0 THEN GOTO SS2
STRING = STRING[1,J-1]+STRING[J+1,LEN(STRING)]
GOTO SS1
SS2: NEXT I
STRING = STRING[2,LEN(STRING)-1]
IF INSTR(1,STRING,"1234")>0 THEN SCORE = 30 : GOTO GS'RTN
IF INSTR(1,STRING,"2345")>0 THEN SCORE = 30 : GOTO GS'RTN
IF INSTR(1,STRING,"3456")>0 THEN SCORE = 30 : GOTO GS'RTN
GOTO GS'RTN
SCORE'LS:
CALL SORT
STRING = ""
FOR I = 1 TO 5
STRING = STRING+STR(ROLL(I))
NEXT I
IF STRING = "12345" THEN SCORE = 40 : GOTO GS'RTN
IF STRING = "23456" THEN SCORE = 40 : GOTO GS'RTN
GOTO GS'RTN
SCORE'Y:
IF ROLL(1)=ROLL(2) AND ROLL(2)=ROLL(3) AND ROLL(3)=ROLL(4) AND &
ROLL(4)=ROLL(5) THEN SCORE = 50
GOTO GS'RTN