DECLARE SUB already.have.it ()
DECLARE SUB you.dont.have.a ()
DECLARE SUB sort.dice ()
DECLARE SUB first.roll ()
DECLARE SUB test.for.yatzee ()
DECLARE SUB which.dice ()
DECLARE SUB print.score ()
DECLARE SUB roll.dice ()
DECLARE SUB print.dice.and.needed.hands ()
DECLARE SUB desired.hand ()
DECLARE SUB score.one.thru.six ()
DECLARE SUB score.small.straight ()
DECLARE SUB score.large.straight ()
DECLARE SUB score.full.house ()
DECLARE SUB score.3.of.a.kind ()
DECLARE SUB score.4.of.a.kind ()
DECLARE SUB score.chance ()
DECLARE SUB delay ()
DECLARE SUB init ()
DECLARE SUB greetings ()

'       Yatzee

DIM SHARED score(80), sorted.dice(5), c(5), dice(5)
DIM SHARED a$(13), player$(4)

COMMON SHARED player, player$(), high, high$
COMMON SHARED c, y, z, sum, f, players, roll

init
greetings

DO
 FOR cycle = 1 TO 13
  y = 0
  FOR player = 1 TO players
   first.roll
   z = 1
   test.for.yatzee
   IF z = 0 THEN
    GOTO continue.play
   END IF
   FOR roll = 1 TO 2
    which.dice
    z = 1
    test.for.yatzee
    IF z = 0 THEN
     GOTO continue.play
    END IF
    z = 0
   NEXT roll
continue.play:
   y = y + 19
  NEXT player
 NEXT cycle
 print.score
LOOP

SUB already.have.it
 LOCATE 15, 1
 PRINT player$(player); " You already have your "; a$(f)
 delay
 LOCATE 15, 1
 PRINT STRING$(60, " ")
END SUB

SUB delay
 FOR dlay = 1 TO 1000
 NEXT dlay
END SUB

SUB desired.hand
start.over:
 CLS
 sum = dice(1) + dice(2) + dice(3) + dice(4) + dice(5)
 PRINT TAB(20); player$(player); " How would you like them ?"
 LOCATE 2, 50
 IF score(1 + y) = 0 THEN
  PRINT "1 = One's"
 ELSE
  COLOR 0, 15
  PRINT "One's ->"; score(1 + y)
  COLOR 15, 0
 END IF
 LOCATE 3, 1
 PRINT "1= "; dice(1)
 LOCATE 3, 50
 IF score(2 + y) = 0 THEN
  PRINT "2 = Two's"
 ELSE
  COLOR 0, 15
  PRINT "Two's ->"; score(2 + y)
  COLOR 15, 0
 END IF
 LOCATE 4, 1
 PRINT "2= "; dice(2)
 LOCATE 4, 50
 IF score(3 + y) = 0 THEN
  PRINT "3 = Three's"
 ELSE
  COLOR 0, 15
  PRINT "Three's ->"; score(3 + y)
  COLOR 15, 0
 END IF
 LOCATE 5, 1
 PRINT "3= "; dice(3)
 LOCATE 5, 50
 IF score(4 + y) = 0 THEN
  PRINT "4 = Four's"
 ELSE
  COLOR 0, 15
  PRINT "Four's ->"; score(4 + y)
  COLOR 15, 0
 END IF
 LOCATE 6, 1
 PRINT "4= "; dice(4)
 LOCATE 6, 50
 IF score(5 + y) = 0 THEN
  PRINT "5 = Five's"
 ELSE
  COLOR 0, 15
  PRINT "Five's ->"; score(5 + y)
  COLOR 15, 0
 END IF
 LOCATE 7, 1
 PRINT "5= "; dice(5)
 LOCATE 7, 50
 IF score(6 + y) = 0 THEN
  PRINT "6 = Six's"
 ELSE
  COLOR 0, 15
  PRINT "Six's ->"; score(6 + y)
  COLOR 15, 0
 END IF
 LOCATE 8, 1
 PRINT "Total= "; sum
 LOCATE 8, 50
 IF score(7 + y) = 0 THEN
  PRINT "7 = Small Straight"
 ELSE
  COLOR 0, 15
  PRINT "Small Straight ->"; score(7 + y)
  COLOR 15, 0
 END IF
 LOCATE 9, 50
 IF score(8 + y) = 0 THEN
  PRINT "8 = Large Straight"
 ELSE
  COLOR 0, 15
  PRINT "Large Straight ->"; score(8 + y)
  COLOR 15, 0
 END IF
 LOCATE 10, 50
 IF score(9 + y) = 0 THEN
  PRINT "9 = Full House"
 ELSE
  COLOR 0, 15
  PRINT "Full House ->"; score(9 + y)
  COLOR 15, 0
 END IF
 LOCATE 11, 50
 IF score(10 + y) = 0 THEN
  PRINT "10 = 3 of a Kind"
 ELSE
  COLOR 0, 15
  PRINT "3 of a Kind ->"; score(10 + y)
  COLOR 15, 0
 END IF
 LOCATE 12, 50
 IF score(11 + y) = 0 THEN
  PRINT "11 = 4 of a Kind"
 ELSE
  COLOR 0, 15
  PRINT "4 of a Kind ->"; score(11 + y)
  COLOR 15, 0
 END IF
 LOCATE 13, 50
 IF score(12 + y) = 0 THEN
  PRINT "12 = Chance"
 ELSE
  COLOR 0, 15
  PRINT "Chance ->"; score(12 + y)
  COLOR 15, 0
 END IF

 INPUT f$
 f = VAL(f$)
 SELECT CASE f
  CASE 0           'Can't use it
   EXIT SUB
  CASE 1 TO 6      ' One's thru Six's
   IF score(f + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   FOR c = 1 TO 5
    IF dice(c) = f THEN
     score(f + y) = score(f + y) + f
    END IF
   NEXT c
   IF score(f + y) = 0 THEN
    PRINT player$(player); " There are no "; a$(f); " in your hand"
    delay
    LOCATE 15, 1
    PRINT STRING$(60, " ")
    GOTO start.over
   END IF
  CASE 7           'Small Straight
   IF score(7 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   sort.dice
   IF sorted.dice(2) = sorted.dice(3) THEN
    IF sorted.dice(1) = sorted.dice(2) - 1 AND sorted.dice(2) = sorted.dice(4) - 1 AND sorted.dice(4) = sorted.dice(5) - 1 THEN
     score(7 + y) = 30
     EXIT SUB
    END IF
   END IF
   IF sorted.dice(3) = sorted.dice(4) THEN
    IF sorted.dice(1) = sorted.dice(2) - 1 AND sorted.dice(2) = sorted.dice(3) - 1 AND sorted.dice(3) = sorted.dice(5) - 1 THEN
     score(7 + y) = 30
     EXIT SUB
    END IF
   END IF
   IF sorted.dice(1) = sorted.dice(2) - 1 AND sorted.dice(2) = sorted.dice(3) - 1 AND sorted.dice(3) = sorted.dice(4) - 1 THEN
    score(7 + y) = 30
    EXIT SUB
   END IF
   IF sorted.dice(2) = sorted.dice(3) - 1 AND sorted.dice(3) = sorted.dice(4) - 1 AND sorted.dice(4) = sorted.dice(5) - 1 THEN
    score(7 + y) = 30
    EXIT SUB
   END IF
   you.dont.have.a
   GOTO start.over
  CASE 8           'Large Straight
   IF score(8 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   sort.dice
   IF sorted.dice(1) = sorted.dice(2) - 1 AND sorted.dice(2) = sorted.dice(3) - 1 AND sorted.dice(3) = sorted.dice(4) - 1 AND sorted.dice(4) = sorted.dice(5) - 1 THEN
    score(8 + y) = 40
    EXIT SUB
   ELSE
    you.dont.have.a
    GOTO start.over
   END IF
  CASE 9           'Full House
   IF score(9 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   sort.dice
   IF sorted.dice(1) = sorted.dice(2) AND sorted.dice(2) = sorted.dice(3) AND sorted.dice(4) = sorted.dice(5) THEN
    score(9 + y) = 25
    EXIT SUB
   END IF
   IF sorted.dice(1) = sorted.dice(2) AND sorted.dice(3) = sorted.dice(4) AND sorted.dice(4) = sorted.dice(5) THEN
    score(9 + y) = 25
    EXIT SUB
   END IF
   you.dont.have.a
   GOTO start.over
  CASE 10          '3 of a Kind
   IF score(10 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   sort.dice
   IF sorted.dice(1) = sorted.dice(2) AND sorted.dice(2) = sorted.dice(3) THEN
    score(10 + y) = sum
    EXIT SUB
   END IF
   IF sorted.dice(2) = sorted.dice(3) AND sorted.dice(3) = sorted.dice(4) THEN
    score(10 + y) = sum
    EXIT SUB
   END IF
   IF sorted.dice(3) = sorted.dice(4) AND sorted.dice(4) = sorted.dice(5) THEN
    score(10 + y) = sum
    EXIT SUB
   END IF
  CASE 11          '4 of a Kind
   IF score(11 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   sort.dice
   IF sorted.dice(1) = sorted.dice(2) AND sorted.dice(2) = sorted.dice(3) AND sorted.dice(3) = sorted.dice(4) THEN
    score(11 + y) = sum
    EXIT SUB
   END IF
   IF sorted.dice(2) = sorted.dice(3) AND sorted.dice(3) = sorted.dice(4) AND sorted.dice(4) = sorted.dice(5) THEN
    score(11 + y) = sum
    EXIT SUB
   END IF
  CASE 12         'Chance
   IF score(12 + y) <> 0 THEN
    already.have.it
    GOTO start.over
   END IF
   score(12 + y) = sum
   EXIT SUB
  CASE ELSE
   GOTO start.over
  END SELECT
END SUB

SUB first.roll
 FOR m = 1 TO 5
  c(m) = 1
 NEXT m
 roll.dice
 print.dice.and.needed.hands
END SUB

SUB greetings
try.again:
 x$ = ""
 CLS
 PRINT
 PRINT TAB(25); "Yatzee"
 PRINT
 PRINT TAB(26); "By Tybee Evans"
 PRINT
 PRINT
 PRINT TAB(15); "Please enter the number of players ( 1-4 ) ";
 INPUT x$
 IF x$ < "1" OR x$ > "4" THEN GOTO try.again
 players = VAL(x$)
 PRINT
 PRINT
 FOR player = 1 TO players
  PRINT "Player # "; player; " Please enter your name ";
  INPUT player$(player)
 NEXT player
END SUB

SUB init
 COLOR 15, 0
 RANDOMIZE TIMER
 a$(1) = "One's"
 a$(2) = "Two's"
 a$(3) = "Three's"
 a$(4) = "Four's"
 a$(5) = "Five's"
 a$(6) = "Six's"
 a$(7) = "Small Straight"
 a$(8) = "Large Strait"
 a$(9) = "Full House"
 a$(10) = "Three of a Kind"
 a$(11) = "Four of a Kind"
 a$(12) = "Chance"
END SUB

SUB print.dice.and.needed.hands
 CLS
 sum = dice(1) + dice(2) + dice(3) + dice(4) + dice(5)
 PRINT TAB(25); player$(player); " you need"
 LOCATE 2, 50
 IF score(1 + y) = 0 THEN
  PRINT "One's"
 ELSE
  COLOR 0, 15
  PRINT "One's ->"; score(1 + y)
  COLOR 15, 0
 END IF
 LOCATE 3, 1
 PRINT "1 = "; dice(1)
 LOCATE 3, 50
 IF score(2 + y) = 0 THEN
  PRINT "Two's"
 ELSE
  COLOR 0, 15
  PRINT "Two's ->"; score(2 + y)
  COLOR 15, 0
 END IF
 LOCATE 4, 1
 PRINT "2 = "; dice(2)
 LOCATE 4, 50
 IF score(3 + y) = 0 THEN
  PRINT "Three's"
 ELSE
  COLOR 0, 15
  PRINT "Three's ->"; score(3 + y)
  COLOR 15, 0
 END IF
 LOCATE 5, 1
 PRINT "3 = "; dice(3)
 LOCATE 5, 50
 IF score(4 + y) = 0 THEN
  PRINT "Four's"
 ELSE
  COLOR 0, 15
  PRINT "Four's ->"; score(4 + y)
  COLOR 15, 0
 END IF
 LOCATE 6, 1
 PRINT "4 = "; dice(4)
 LOCATE 6, 50
 IF score(5 + y) = 0 THEN
  PRINT "Five's"
 ELSE
  COLOR 0, 15
  PRINT "Five's ->"; score(5 + y)
  COLOR 15, 0
 END IF
 LOCATE 7, 1
 PRINT "5 = "; dice(5)
 LOCATE 7, 50
 IF score(6 + y) = 0 THEN
  PRINT "Six's"
 ELSE
  COLOR 0, 15
  PRINT "Six's ->"; score(6 + y)
  COLOR 15, 0
 END IF
 LOCATE 8, 1
 PRINT "Total= "; sum
 LOCATE 8, 50
 IF score(7 + y) = 0 THEN
  PRINT "Small Straight"
 ELSE
  COLOR 0, 15
  PRINT "Small Straight ->"; score(7 + y)
  COLOR 15, 0
 END IF
 LOCATE 9, 50
 IF score(8 + y) = 0 THEN
  PRINT "Large Straight"
 ELSE
  COLOR 0, 15
  PRINT "Large Straight ->"; score(8 + y)
  COLOR 15, 0
 END IF
 LOCATE 10, 1
 PRINT "Which dice would you"
 LOCATE 10, 50
 IF score(9 + y) = 0 THEN
  PRINT "Full House"
 ELSE
  COLOR 0, 15
  PRINT "Full House ->"; score(9 + y)
  COLOR 15, 0
 END IF
 LOCATE 11, 1
 PRINT "    like to roll again"
 LOCATE 11, 50
 IF score(10 + y) = 0 THEN
  PRINT "3 of a Kind"
 ELSE
  COLOR 0, 15
  PRINT "3 of a Kind ->"; score(10 + y)
  COLOR 15, 0
 END IF
 LOCATE 12, 50
 IF score(11 + y) = 0 THEN
  PRINT "4 of a Kind"
 ELSE
  COLOR 0, 15
  PRINT "4 of a Kind ->"; score(11 + y)
  COLOR 15, 0
 END IF
 LOCATE 13, 1
 PRINT "When your ready to"
 LOCATE 13, 50
 IF score(12 + y) = 0 THEN
  PRINT "Chance"
 ELSE
  COLOR 0, 15
  PRINT "Chance ->"; score(12 + y)
  COLOR 15, 0
 END IF
 LOCATE 14, 1
 PRINT "    roll them enter 0"
 LOCATE 14, 50
 IF score(13 + y) = 0 THEN
  PRINT "Yatzee"
 ELSE
  COLOR 0, 15
  PRINT "Yatzee ->"; score(13 + y)
  COLOR 15, 0
 END IF
END SUB

SUB print.score
 y = 0
 FOR a = 0 TO 3
  score(14 + y) = score(1 + y) + score(2 + y) + score(3 + y) + score(4 + y) + score(5 + y) + score(6 + y)
  IF score(14 + y) > 63 THEN
   score(15 + y) = 35
  ELSE
   score(15 + y) = 0
  END IF
  score(16 + y) = score(14 + y) + score(15 + y)
  score(17 + y) = score(7 + y) + score(8 + y) + score(9 + y) + score(10 + y) + score(11 + y) + score(12 + y) + score(13 + y)
  score(18 + y) = score(16 + y) + score(17 + y)
  IF score(18 + y) > high THEN
   high = score(18 + y)
   high$ = player$(a + 1)
  END IF
  y = y + 19
 NEXT a

 CLS
 PRINT "High Score = "; high; " by "; high$
 LOCATE 3, 20
 PRINT "Final scores"
 LOCATE 5, 20
 PRINT "Subtotal + Bonus = Subtotal + Subtotal = Total"
 y = 0
 b = 0
 FOR a = 7 TO 10
  b = b + 1
  IF player$(b) <> "" THEN
   LOCATE a, 5
   PRINT player$(b)
   LOCATE a, 22
   PRINT score(14 + y)
   LOCATE a, 33
   PRINT score(15 + y)
   LOCATE a, 41
   PRINT score(16 + y)
   LOCATE a, 53
   PRINT score(17 + y)
   LOCATE a, 62
   PRINT score(18 + y)
  END IF
  y = y + 19
 NEXT a
play.again:
 LOCATE 20, 15
 INPUT "Would you like to play again "; a$
 a$ = LEFT$(a$, 1)
 SELECT CASE a$
  CASE "Y", "y"
   FOR a = 0 TO 80
    score(a) = 0
   NEXT a
   INPUT "Same Players "; a$
   a$ = LEFT$(a$, 1)
   SELECT CASE a$
    CASE "Y", "y"
     EXIT SUB
    CASE "N", "n"
     RUN
   END SELECT
  CASE "N", "n"
   END
 END SELECT
END SUB

SUB roll.dice
 FOR m = 1 TO 5
  IF c(m) = 1 THEN
   dice(m) = INT(RND(6) * 6) + 1
   c(m) = 0
  END IF
 NEXT m
END SUB

SUB sort.dice
FOR m = 1 TO 5
 sorted.dice(m) = dice(m)
NEXT m
sort.again:
 ex = 0
 IF sorted.dice(1) > sorted.dice(2) THEN
  SWAP sorted.dice(1), sorted.dice(2)
  ex = 1
 END IF
 IF sorted.dice(2) > sorted.dice(3) THEN
  SWAP sorted.dice(2), sorted.dice(3)
  ex = 1
 END IF
 IF sorted.dice(3) > sorted.dice(4) THEN
  SWAP sorted.dice(3), sorted.dice(4)
  ex = 1
 END IF
 IF sorted.dice(4) > sorted.dice(5) THEN
  SWAP sorted.dice(4), sorted.dice(5)
  ex = 1
 END IF
IF ex <> 0 THEN GOTO sort.again

END SUB

SUB test.for.yatzee
 IF dice(1) = dice(2) AND dice(2) = dice(3) AND dice(3) = dice(4) AND dice(4) = dice(5) THEN
  z = 0
  score(13 + y) = score(13 + y) + 50
 END IF
END SUB

SUB which.dice
 z = 0
 IF roll = 2 THEN z = 1
input.dice:
 LOCATE 14, 50
 IF score(13 + y) = 0 THEN
  PRINT "Yatzee"
 ELSE
  COLOR 0, 15
  PRINT "Yatzee"
  COLOR 15, 0
 END IF
 INPUT l$
 LOCATE 15, 1
 PRINT "    "
 IF l$ < "0" OR l$ > "5" THEN
  GOTO input.dice
 END IF
 l = VAL(l$)
 FOR m = 1 TO 5
  IF l = m AND c(m) = 1 THEN
   c(m) = 0
   LOCATE 2 + m, 9
   PRINT " ";
   GOTO input.dice
  END IF
  IF l = m THEN
   c(m) = 1
   LOCATE 2 + m, 9
   PRINT "<";
   GOTO input.dice
  END IF
 NEXT m
 IF l = 0 THEN
  GOSUB roll.them
  EXIT SUB
 END IF
EXIT SUB

roll.them:
 roll.dice
 test.for.yatzee
 IF z THEN
  desired.hand
 ELSE
  print.dice.and.needed.hands
 END IF
RETURN

END SUB

SUB you.dont.have.a
 PRINT player$(player); " You don't have a "; a$(f)
 delay
 LOCATE 15, 1
 PRINT STRING$(60, " ")
END SUB


