Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Jaze

Pages: [1] 2
1
QB64 Discussion / Time Calculator
« on: April 14, 2022, 08:05:31 pm »
Code: QB64: [Select]
  1. _TITLE "Time Calculator" ' I do wonder if I should start planning before I begin to code...
  2. 'Author: Jaze James McAskill (mcaskilljaze@gmail.com)
  3. 'License: Freeware if anyone can remember what that is.
  4. '            All I ask is that if you copy part or all
  5. '           of this code you keep my name on it
  6.  
  7. CONST TRUE% = 1
  8. CONST FALSE% = -1
  9. CONST AM% = -1
  10. CONST PM% = 1
  11.  
  12.  
  13. WIDTH 80, 50
  14.  
  15.  
  16. DIM SHARED LeftArrowKey$: LeftArrowKey$ = CHR$(0) + "K"
  17. DIM SHARED RightArrowKey$: RightArrowKey$ = CHR$(0) + "M"
  18. DIM SHARED UpArrowKey$: UpArrowKey$ = CHR$(0) + "H"
  19. DIM SHARED DownArrowKey$: DownArrowKey$ = CHR$(0) + "P"
  20. CONST UpKeyHit% = 18432
  21. CONST DownKeyHit% = 20480
  22. CONST LeftKeyHit% = 19200
  23. CONST RightKeyHit% = 19712
  24.  
  25.  
  26. LOCATE 20, 1
  27.  
  28.  
  29. CALL Menu
  30.  
  31. FUNCTION GetDateAndTime$ (Header$)
  32.   HaltAndDisplay% = 0: UserCommand$ = "": HeaderCopy$ = "": Instructions$ = "": HighlightedOption% = 0
  33.   yPos% = 0: xPos% = 0: GDTMonth% = 0: GDTDay% = 0: GDTYear% = 0: O% = 0: OP$ = "": MaxOption% = 0
  34.   GDTHours% = 0: GDTMinutes% = 0: GDTSeconds% = 0: GDTRtn$ = ""
  35.   MW$ = "": SomeKey% = 0: TimerStarted% = 0: FirstTime% = 0: Increment% = 0: TimeElapsed% = 0
  36.  
  37.   HaltAndDisplay% = TRUE: yPos% = 15: xPos% = 17: HighlightedOption% = 1: MaxOption% = 6
  38.   GDTMonth% = VAL(LEFT$(DATE$, 2)): GDTDay% = VAL(MID$(DATE$, 4, 2)): GDTYear% = VAL(RIGHT$(DATE$, 4))
  39.   GDTHours% = VAL(LEFT$(TIME$, 2)): GDTMinutes% = VAL(MID$(TIME$, 4, 2)): GDTSeconds% = VAL(RIGHT$(TIME$, 2))
  40.   TimerStarted% = FALSE%: Increment% = 1
  41.   DO
  42.     UserCommand$ = INKEY$
  43.     IF HaltAndDisplay% = TRUE% THEN
  44.       xPos% = 17: yPos% = 15
  45.       HeaderCopy$ = Header$
  46.       COLOR 14, 1: CLS
  47.       COLOR 15
  48.       IF LEN(Header$) >= 50 THEN
  49.         LOCATE 3, 1: PRINT LongCenter(HeaderCopy$, 50, FALSE%)
  50.       ELSE LOCATE 3, Center(HeaderCopy$): PRINT HeaderCopy$: END IF
  51.       COLOR 12, 1: Instructions$ = "Use the arrow keys to select the date and time - Push "
  52.       Instructions$ = Instructions$ + CHR$(34) + "X" + CHR$(34) + " to exit to the system - Push [ESC] to reset - Push [ENTER] to confirm"
  53.       LOCATE 46, 1: PRINT LongCenter$(Instructions$, 50, FALSE)
  54.  
  55.       LOCATE yPos% - 5, xPos%: IF HighlightedOption% = 1 THEN
  56.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Month"
  57.       MW$ = "": MW$ = MonthWord$(GDTMonth% - 1): COLOR 14, 1
  58.       LOCATE yPos% - 2, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  59.       MW$ = "": MW$ = MonthWord$(GDTMonth%): COLOR 10, 0
  60.       LOCATE yPos%, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  61.       MW$ = "": MW$ = MonthWord$(GDTMonth% + 1): COLOR 14, 1
  62.       LOCATE yPos% + 2, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  63.  
  64.       LOCATE yPos% - 5, xPos% + 20: IF HighlightedOption% = 2 THEN
  65.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Day"
  66.       COLOR 14, 1: O% = 0: O% = CorrectDay(GDTMonth%, GDTDay% - 1, GDTYear%)
  67.       OP$ = "": OP$ = S$(O%) + Suffix$(O%)
  68.       LOCATE yPos% - 2, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  69.       COLOR 10, 0: OP$ = "": O% = 0: OP$ = S$(GDTDay%) + Suffix$(GDTDay%)
  70.       LOCATE yPos%, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  71.       COLOR 14, 1: O% = 0: O% = CorrectDay(GDTMonth%, GDTDay% + 1, GDTYear%)
  72.       OP$ = "": OP$ = S$(O%) + Suffix$(O%)
  73.       LOCATE yPos% + 2, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  74.  
  75.       LOCATE yPos% - 5, xPos% + 40: IF HighlightedOption% = 3 THEN
  76.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Year"
  77.       COLOR 14, 1: O% = 0: O% = GDTYear% - 1: IF O% = -1 THEN O% = 9999
  78.       LOCATE yPos% - 2, CenterBetween(S$(O%), xPos% + 40, xPos% + 44): PRINT S$(O%)
  79.       COLOR 10, 0: LOCATE yPos%, CenterBetween(S$(GDTYear%), xPos% + 40, xPos% + 44): PRINT S$(GDTYear%)
  80.       COLOR 14, 1: O% = 0: O% = GDTYear% + 1: IF O% > 9999 THEN O% = 0
  81.       LOCATE yPos% + 2, CenterBetween(S$(O%), xPos% + 40, xPos% + 44): PRINT S$(O%)
  82.  
  83.       COLOR 10, 1: a$ = "": a$ = WrittenOutDate$(GDTMonth%, GDTDay%, GDTYear%) + " at " + ClockString$(GDTHours%, GDTMinutes%, GDTSeconds%)
  84.       LOCATE yPos% + 9, Center(a$): PRINT a$
  85.  
  86.       yPos% = yPos% + 21
  87.  
  88.       IF HighlightedOption% = 4 THEN
  89.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  90.       LOCATE yPos% - 5, xPos%: PRINT "Hours"
  91.       LOCATE yPos% - 2, xPos% + 2
  92.       COLOR 14, 1:
  93.       IF GDTHours% - 1 = -1 THEN
  94.         PRINT "11"
  95.       ELSEIF GDTHours% - 1 = 0 THEN PRINT "12"
  96.       ELSEIF GDTHours% - 1 > 0 AND GDTHours% - 1 <= 12 THEN PRINT S$(GDTHours% - 1)
  97.       ELSEIF GDTHours% - 1 >= 13 AND GDTHours% - 1 <= 23 THEN PRINT S$(GDTHours% - 1 - 12): END IF
  98.       LOCATE yPos%, xPos% + 2: COLOR 10, 0
  99.       IF GDTHours% = 0 THEN
  100.         PRINT "12"
  101.       ELSEIF GDTHours% > 0 AND GDTHours% <= 12 THEN PRINT S$(GDTHours%)
  102.       ELSEIF GDTHours% > 12 AND GDTHours% < 24 THEN PRINT S$(GDTHours% - 12): END IF
  103.       LOCATE yPos% + 2, xPos% + 2: COLOR 14, 1
  104.       IF GDTHours% + 1 >= 1 AND GDTHours% + 1 < 13 THEN
  105.         PRINT S$(GDTHours% + 1)
  106.       ELSEIF GDTHours% + 1 >= 13 AND GDTHours% + 1 <= 24 THEN PRINT S$(GDTHours% + 1 - 12): END IF
  107.  
  108.       IF HighlightedOption% = 5 THEN
  109.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  110.       LOCATE yPos% - 5, xPos% + 16: PRINT "Minutes"
  111.       LOCATE yPos% - 2, xPos% + 18: COLOR 14, 1
  112.       IF GDTMinutes% - 1 = -1 THEN
  113.         PRINT "59"
  114.       ELSEIF GDTMinutes% - 1 >= 0 AND GDTMinutes% - 1 <= 59 THEN
  115.         IF GDTMinutes% - 1 < 10 THEN PRINT "0";:
  116.         PRINT S$(GDTMinutes% - 1)
  117.       END IF
  118.       LOCATE yPos%, xPos% + 18: COLOR 10, 0: IF GDTMinutes% < 10 THEN PRINT "0";
  119.       PRINT S$(GDTMinutes%)
  120.       LOCATE yPos% + 2, xPos% + 18: COLOR 14, 1
  121.       IF GDTMinutes% + 1 >= 0 AND GDTMinutes% + 1 <= 59 THEN
  122.         IF GDTMinutes% + 1 < 10 THEN PRINT "0";
  123.         PRINT S$(GDTMinutes% + 1)
  124.       ELSEIF GDTMinutes% + 1 = 60 THEN PRINT "00"
  125.       END IF
  126.  
  127.       IF HighlightedOption% = 6 THEN
  128.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  129.       LOCATE yPos% - 5, xPos% + 32: PRINT "Seconds"
  130.       LOCATE yPos% - 2, xPos% + 36: COLOR 14, 1
  131.       IF GDTSeconds% - 1 = -1 THEN
  132.         PRINT "59"
  133.       ELSEIF GDTSeconds% - 1 >= 0 AND GDTSeconds% <= 59 THEN
  134.         PRINT S$(GDTSeconds% - 1)
  135.       END IF
  136.       LOCATE yPos%, xPos% + 36: COLOR 10, 0
  137.       PRINT S$(GDTSeconds%)
  138.       LOCATE yPos% + 2, xPos% + 36: COLOR 14, 1
  139.       IF gdtseonds% + 1 >= 0 AND GDTSeconds% + 1 <= 59 THEN
  140.         PRINT S$(GDTSeconds% + 1)
  141.       ELSEIF GDTSeconds% + 1 = 60 THEN PRINT "0": END IF
  142.  
  143.       LOCATE yPos% - 2, xPos% + 50: COLOR 14, 1
  144.       IF GDTHours% - 1 >= 0 AND GDTHours% - 1 <= 11 THEN
  145.       PRINT "AM": ELSE PRINT "PM": END IF
  146.       LOCATE yPos%, xPos% + 50: COLOR 10, 0
  147.       IF GDTHours% < 12 THEN
  148.       PRINT "AM": ELSE PRINT "PM": END IF
  149.       LOCATE yPos% + 2, xPos% + 50: COLOR 14, 1
  150.       IF GDTHours% + 1 >= 0 AND GDTHours% + 1 <= 11 OR GDTHours% + 1 = 24 THEN
  151.       PRINT "AM": ELSE: PRINT "PM": END IF
  152.  
  153.       HaltAndDisplay% = FALSE
  154.     END IF
  155.  
  156.     SomeKey% = _KEYHIT
  157.     IF SomeKey% = UpKeyHit% OR SomeKey% = DownKeyHit% THEN
  158.       IF TimerStarted% = FALSE% THEN
  159.         FirstTime% = TIMER
  160.         TimerStarted% = TRUE%
  161.       END IF
  162.     END IF
  163.     IF SomeKey% < 0 THEN
  164.       FirstTime% = 0
  165.       Increment% = 1
  166.       TimeElapsed% = 0
  167.       TimerStarted% = FALSE%
  168.     END IF
  169.     TimeElapsed% = ABS(TIMER - FirstTime%)
  170.     IF TimeElapsed% = 2 THEN
  171.       IF HighlightedOption% = 2 THEN Increment% = 2 'Day
  172.       IF HighlightedOption% = 3 THEN Increment% = 10 'Year
  173.       IF HighlightedOption% = 5 THEN Increment% = 2 'minutes
  174.       IF HighlightedOption% = 6 THEN Increment% = 2 'seconds
  175.     ELSEIF TimeElapsed% = 3 THEN
  176.       IF HighlightedOption% = 3 THEN Increment% = 25
  177.     ELSEIF TimeElapsed% = 4 THEN
  178.       IF HighlightedOption% = 3 THEN Increment% = 50
  179.     END IF
  180.  
  181.     SELECT CASE UserCommand$
  182.       CASE LeftArrowKey$
  183.         HighlightedOption% = HighlightedOption% - 1
  184.         IF HighlightedOption% = 0 THEN HighlightedOption% = MaxOption%
  185.         HaltAndDisplay% = TRUE%
  186.       CASE RightArrowKey$
  187.         HighlightedOption% = HighlightedOption% + 1
  188.         IF HighlightedOption% > MaxOption% THEN HighlightedOption% = 1
  189.         HaltAndDisplay% = TRUE%
  190.       CASE UpArrowKey$
  191.         IF HighlightedOption% = 1 THEN
  192.           GDTMonth% = GDTMonth% - Increment%
  193.           IF GDTMonth% <= 0 THEN GDTMonth% = 12
  194.           IF GDTMonth% = 4 OR GDTMonth% = 6 OR GDTMonth% = 9 OR GDTMonth% = 11 THEN
  195.             IF GDTDay% = 31 THEN GDTDay% = 30:
  196.           ELSEIF GDTMonth% = 2 THEN
  197.             IF GDTDay% > 29 AND GDTYear% MOD 4 = 0 THEN
  198.               GDTDay% = 29
  199.             ELSEIF GDTDay% >= 29 AND GDTYear% MOD 4 <> 0 THEN GDTDay% = 28
  200.             END IF
  201.           END IF
  202.         ELSEIF HighlightedOption% = 2 THEN
  203.           GDTDay% = GDTDay% - Increment%
  204.           IF GDTDay% <= 0 THEN
  205.             IF GDTMonth% = 4 OR GDTMonth% = 6 OR GDTMonth% = 9 OR GDTMonth% = 11 THEN
  206.               GDTDay% = 30
  207.             ELSEIF GDTMonth% = 2 AND GDTYear% MOD 4 = 0 THEN GDTDay% = 29
  208.             ELSEIF GDTMonth% = 2 AND GDTYear% MOD 4 <> 0 THEN GDTDay% = 28
  209.             ELSE GDTDay% = 31: END IF
  210.           END IF
  211.         ELSEIF HighlightedOption% = 3 THEN
  212.           GDTYear% = GDTYear% - Increment%
  213.           IF GDTYear% < 0 THEN GDTYear% = 9999
  214.           GDTDay% = CorrectDay%(GDTMonth%, GDTDay%, GDTYear%)
  215.         ELSEIF HighlightedOption% = 4 THEN
  216.           GDTHours% = GDTHours% - 1
  217.           IF GDTHours% < 0 THEN GDTHours% = 23
  218.         ELSEIF HighlightedOption% = 5 THEN
  219.           GDTMinutes% = GDTMinutes% - Increment%
  220.           IF GDTMinutes% < 0 THEN GDTMinutes% = 59
  221.         ELSEIF HighlightedOption% = 6 THEN
  222.           GDTSeconds% = GDTSeconds% - Increment%
  223.           IF GDTSeconds% < 0 THEN GDTSeconds% = 59
  224.         END IF
  225.         HaltAndDisplay% = TRUE%
  226.       CASE DownArrowKey$
  227.         IF HighlightedOption% = 1 THEN
  228.           GDTMonth% = GDTMonth% + Increment%
  229.           IF GDTMonth% > 12 THEN GDTMonth% = 1
  230.           GDTDay% = CorrectDay%(GDTMonth%, GDTDay%, GDTYear%)
  231.         ELSEIF HighlightedOption% = 2 THEN
  232.           GDTDay% = GDTDay% + Increment%
  233.           IF GDTDay% >= 29 THEN GDTDay% = CorrectDay(GDTMonth%, GDTDay%, GDTYear%)
  234.         ELSEIF HighlightedOption% = 3 THEN
  235.           GDTYear% = GDTYear% + Increment%
  236.           IF GDTYear% > 9999 THEN GDTYear% = 0
  237.           GDTDay% = CorrectDay%(GDTMonth%, GDTDay%, GDTYear%)
  238.         ELSEIF HighlightedOption% = 4 THEN
  239.           GDTHours% = GDTHours% + 1
  240.           IF GDTHours% = 24 THEN GDTHours% = 0
  241.         ELSEIF HighlightedOption% = 5 THEN
  242.           GDTMinutes% = GDTMinutes% + Increment%
  243.           IF GDTMinutes% >= 60 THEN GDTMinutes% = 0
  244.         ELSEIF HighlightedOption% = 6 THEN
  245.           GDTSeconds% = GDTSeconds% + Increment%
  246.           IF GDTSeconds% >= 60 THEN GDTSeconds% = 0
  247.         END IF
  248.         HaltAndDisplay% = TRUE%
  249.       CASE CHR$(27)
  250.         GDTMonth% = VAL(LEFT$(DATE$, 2))
  251.         GDTDay% = VAL(MID$(DATE$, 4, 2))
  252.         GDTYear% = VAL(RIGHT$(DATE$, 4))
  253.         GDTHours% = VAL(LEFT$(TIME$, 2))
  254.         GDTMinutes% = VAL(MID$(TIME$, 4, 2))
  255.         GDTSeconds% = VAL(RIGHT$(TIME$, 2))
  256.         HaltAndDisplay% = TRUE%
  257.       CASE "X", "x"
  258.         SYSTEM
  259.       CASE CHR$(13)
  260.         GDTRtn$ = ""
  261.         IF GDTYear% < 10 THEN
  262.           GDTRtn$ = "000"
  263.         ELSEIF GDTYear% >= 10 AND GDTYear% < 100 THEN GDTRtn$ = "00"
  264.         ELSEIF GDTYear% >= 100 AND GDTYear% < 1000 THEN GDTRtn$ = "0": END IF
  265.         GDTRtn$ = GDTRtn$ + S$(GDTYear%) + ":"
  266.         tempDay% = 0: tempDay% = DaysPassedJanFromMonthDayYear(GDTMonth%, GDTDay%, GDTYear%)
  267.         IF tempDay% < 10 THEN
  268.           GDTRtn$ = GDTRtn$ + "00"
  269.         ELSEIF tempDay% >= 10 AND tempDay% < 100 THEN GDTRtn$ = GDTRtn$ + "0": END IF
  270.         GDTRtn$ = GDTRtn$ + S$(tempDay%) + ":"
  271.         IF GDTHours% < 10 THEN GDTRtn$ = GDTRtn$ + "0"
  272.         GDTRtn$ = GDTRtn$ + S$(GDTHours%) + ":"
  273.         IF GDTMinutes% < 10 THEN GDTRtn$ = GDTRtn$ + "0"
  274.         GDTRtn$ = GDTRtn$ + S$(GDTMinutes%) + ":"
  275.         IF GDTSeconds% < 10 THEN GDTRtn$ = GDTRtn$ + "0"
  276.         GDTRtn$ = GDTRtn$ + S$(GDTSeconds%)
  277.     END SELECT
  278.   LOOP UNTIL UserCommand$ = CHR$(13)
  279.   GetDateAndTime$ = GDTRtn$
  280.  
  281. FUNCTION ClockString$ (CSHours%, CSMinutes%, CSSeconds%)
  282.   DisplayHours$ = "": CSRtn$ = "": AmPm$ = ""
  283.  
  284.   IF CSHours% = 0 THEN
  285.     DisplayHours$ = "12"
  286.     AmPm$ = "AM"
  287.   ELSEIF CSHours% >= 1 AND CSHours% <= 11 THEN
  288.     DisplayHours$ = S$(CSHours%)
  289.     AmPm$ = "AM"
  290.   ELSEIF CSHours% = 12 THEN
  291.     DisplayHours$ = "12"
  292.     AmPm$ = "PM"
  293.   ELSEIF CSHours% > 12 AND CSHours% <= 23 THEN
  294.     DisplayHours$ = S$(CSHours% - 12)
  295.     AmPm$ = "PM"
  296.   END IF
  297.  
  298.   CSRtn$ = DisplayHours$ + ":"
  299.   IF CSMinutes% < 10 THEN CSRtn$ = CSRtn$ + "0"
  300.   CSRtn$ = CSRtn$ + S$(CSMinutes%) + " " + AmPm$ + " and " + S$(CSSeconds%) + " second"
  301.   IF CSSeconds% <> 1 THEN CSRtn$ = CSRtn$ + "s"
  302.  
  303.   ClockString$ = CSRtn$
  304.  
  305.  
  306. FUNCTION GetDate$ (Header$)
  307.   xPos% = 0: yPos% = 0: MaxOption% = 0: HighlightedOption% = 0
  308.   HaltAndDisplay% = 0: UserCommand$ = "": Instructions$ = "": TimerStarted% = 0: FirstTime% = 0: TimeElapsed% = 0
  309.   GDMonth% = 0: GDDay% = 0: GDYear% = 0: MW$ = "": Increment% = 0: MinOption% = 0: HeaderCopy$ = "": GDRtn$ = ""
  310.  
  311.   HaltAndDisplay% = TRUE%: yPos% = 22: xPos% = 19: HighlightedOption% = 1: Increment% = 1
  312.   MaxOption% = 3: MinOption% = 1: HeaderCopy$ = Header$
  313.   GDMonth% = VAL(LEFT$(DATE$, 2)): GDDay% = VAL(MID$(DATE$, 4, 2)): GDYear% = VAL(RIGHT$(DATE$, 4))
  314.   TimerStarted% = FALSE
  315.  
  316.   DO
  317.     UserCommand$ = INKEY$
  318.     IF HaltAndDisplay% = TRUE% THEN
  319.       HeaderCopy$ = Header$
  320.       COLOR 14, 1: CLS
  321.       COLOR 15
  322.       IF LEN(Header$) >= 50 THEN
  323.         LOCATE 7, 1: PRINT LongCenter(HeaderCopy$, 50, FALSE%)
  324.       ELSE LOCATE 7, Center(HeaderCopy$): PRINT HeaderCopy$: END IF
  325.       COLOR 12, 1: Instructions$ = "Use the arrow keys to select the date - Push [ESC] to reset - Push "
  326.       Instructions$ = Instructions$ + CHR$(34) + "X" + CHR$(34) + " to exit to the system - "
  327.       Instructions$ = Instructions$ + "Push [ENTER] when you have selected the desired date"
  328.       LOCATE yPos% + 20, 1: PRINT LongCenter$(Instructions$, 60, FALSE%)
  329.  
  330.       LOCATE yPos% - 5, xPos%: IF HighlightedOption% = 1 THEN
  331.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Month"
  332.       MW$ = "": MW$ = MonthWord$(GDMonth% - 1): COLOR 14, 1
  333.       LOCATE yPos% - 2, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  334.       MW$ = "": MW$ = MonthWord$(GDMonth%): COLOR 10, 0
  335.       LOCATE yPos%, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  336.       MW$ = "": MW$ = MonthWord$(GDMonth% + 1): COLOR 14, 1
  337.       LOCATE yPos% + 2, CenterBetween(MW$, xPos% - 3, xPos% + 8): PRINT MW$
  338.  
  339.       LOCATE yPos% - 5, xPos% + 20: IF HighlightedOption% = 2 THEN
  340.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Day"
  341.       COLOR 14, 1: O% = 0: O% = CorrectDay(GDMonth%, GDDay% - 1, GDYear%)
  342.       OP$ = "": OP$ = S$(O%) + Suffix$(O%)
  343.       LOCATE yPos% - 2, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  344.       COLOR 10, 0: OP$ = "": O% = 0: OP$ = S$(GDDay%) + Suffix$(GDDay%)
  345.       LOCATE yPos%, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  346.       COLOR 14, 1: O% = 0: O% = CorrectDay(GDMonth%, GDDay% + 1, GDYear%)
  347.       OP$ = "": OP$ = S$(O%) + Suffix$(O%)
  348.       LOCATE yPos% + 2, CenterBetween(OP$, xPos% + 19, xPos% + 22): PRINT OP$
  349.  
  350.       LOCATE yPos% - 5, xPos% + 40: IF HighlightedOption% = 3 THEN
  351.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Year"
  352.       COLOR 14, 1: O% = 0: O% = GDYear% - 1: IF O% = -1 THEN O% = 9999
  353.       LOCATE yPos% - 2, CenterBetween(S$(O%), xPos% + 40, xPos% + 44): PRINT S$(O%)
  354.       COLOR 10, 0: LOCATE yPos%, CenterBetween(S$(GDYear%), xPos% + 40, xPos% + 44): PRINT S$(GDYear%)
  355.       COLOR 14, 1: O% = 0: O% = GDYear% + 1: IF O% > 9999 THEN O% = 0
  356.       LOCATE yPos% + 2, CenterBetween(S$(O%), xPos% + 40, xPos% + 44): PRINT S$(O%)
  357.  
  358.       COLOR 10, 0: a$ = "": a$ = WrittenOutDate$(GDMonth%, GDDay%, GDYear%)
  359.       LOCATE yPos% + 10, Center(a$): PRINT a$
  360.  
  361.       HaltAndDisplay% = FALSE%
  362.     END IF
  363.  
  364.     SomeKey% = _KEYHIT
  365.     IF SomeKey% = UpKeyHit% OR SomeKey% = DownKeyHit% THEN
  366.       IF TimerStarted% = FALSE% THEN
  367.         FirstTime% = TIMER
  368.         TimerStarted% = TRUE%
  369.       END IF
  370.     END IF
  371.     IF SomeKey% < 0 THEN
  372.       FirstTime% = 0
  373.       Increment% = 1
  374.       TimeElapsed% = 0
  375.       TimerStarted% = FALSE%
  376.     END IF
  377.     TimeElapsed% = ABS(TIMER - FirstTime%)
  378.     IF TimeElapsed% = 2 THEN
  379.       IF HighlightedOption% = 3 THEN Increment% = 15
  380.     ELSEIF TimeElapsed% = 3 THEN
  381.       IF HighlightedOption% = 2 THEN Increment% = 2
  382.       IF HighlightedOption% = 3 THEN Increment% = 25
  383.     ELSEIF TimeElapsed% = 4 THEN
  384.       IF HighlightedOption% = 3 THEN Increment% = 35
  385.     ELSEIF TimeElapsed% = 6 THEN
  386.       IF HighlightedOption% = 3 THEN Increment% = 65
  387.     END IF
  388.  
  389.     SELECT CASE UserCommand$
  390.       CASE UpArrowKey$
  391.         IF HighlightedOption% = 1 THEN
  392.           GDMonth% = GDMonth% - Increment%
  393.           IF GDMonth% <= 0 THEN GDMonth% = 12
  394.           IF GDMonth% = 4 OR GDMonth% = 6 OR GDMonth% = 9 OR GDMonth% = 11 THEN
  395.             IF GDDay% = 31 THEN GDDay% = 30:
  396.           ELSEIF GDMonth% = 2 THEN
  397.             IF GDDay% > 29 AND GDYear% MOD 4 = 0 THEN
  398.               GDDay% = 29
  399.             ELSEIF GDDay% >= 29 AND GDYear% MOD 4 <> 0 THEN GDDay% = 28
  400.             END IF
  401.           END IF
  402.         ELSEIF HighlightedOption% = 2 THEN
  403.           GDDay% = GDDay% - Increment%
  404.           IF GDDay% <= 0 THEN
  405.             IF GDMonth% = 4 OR GDMonth% = 6 OR GDMonth% = 9 OR GDMonth% = 11 THEN
  406.               GDDay% = 30
  407.             ELSEIF GDMonth% = 2 AND GDYear% MOD 4 = 0 THEN GDDay% = 29
  408.             ELSEIF GDMonth% = 2 AND GDYear% MOD 4 <> 0 THEN GDDay% = 28
  409.             ELSE GDDay% = 31: END IF
  410.           END IF
  411.         ELSEIF HighlightedOption% = 3 THEN
  412.           GDYear% = GDYear% - Increment%
  413.           IF GDYear% < 0 THEN GDYear% = 9999
  414.           GDDay% = CorrectDay%(GDMonth%, GDDay%, GDYear%)
  415.         END IF
  416.         HaltAndDisplay% = TRUE%
  417.       CASE DownArrowKey$
  418.         IF HighlightedOption% = 1 THEN
  419.           GDMonth% = GDMonth% + Increment%
  420.           IF GDMonth% > 12 THEN GDMonth% = 1
  421.           GDDay% = CorrectDay%(GDMonth%, GDDay%, GDYear%)
  422.         ELSEIF HighlightedOption% = 2 THEN
  423.           GDDay% = GDDay% + Increment%
  424.           IF GDDay% >= 29 THEN GDDay% = CorrectDay(GDMonth%, GDDay%, GDYear%)
  425.         ELSEIF HighlightedOption% = 3 THEN
  426.           GDYear% = GDYear% + Increment%
  427.           IF GDYear% > 9999 THEN GDYear% = 0
  428.           GDDay% = CorrectDay%(GDMonth%, GDDay%, GDYear%)
  429.         END IF
  430.         HaltAndDisplay% = TRUE%
  431.       CASE RightArrowKey$
  432.         HighlightedOption% = HighlightedOption% + 1
  433.         IF HighlightedOption% > MaxOption% THEN HighlightedOption% = MinOption%
  434.         HaltAndDisplay% = TRUE%
  435.       CASE LeftArrowKey$
  436.         HighlightedOption% = HighlightedOption% - 1
  437.         IF HighlightedOption% < MinOption% THEN HighlightedOption% = MaxOption%
  438.         HaltAndDisplay% = TRUE%
  439.       CASE CHR$(27)
  440.         GDMonth% = VAL(LEFT$(DATE$, 2))
  441.         GDDay% = VAL(MID$(DATE$, 4, 2))
  442.         GDYear% = VAL(RIGHT$(DATE$, 4))
  443.       CASE "X", "x"
  444.         SYSTEM
  445.       CASE CHR$(13)
  446.         GDRtn$ = ""
  447.         GDRtn$ = MakeFormattedDATE$(GDMonth%, GDDay%, GDYear%)
  448.     END SELECT
  449.   LOOP UNTIL UserCommand$ = CHR$(13)
  450.   GetDate$ = GDRtn$
  451.  
  452. FUNCTION MakeFormattedDATE$ (MFMonth%, MFDay%, MFYear%)
  453.   MFDRtn$ = ""
  454.  
  455.   IF MFMonth% < 10 THEN MFDRtn$ = "0"
  456.   MFDRtn$ = MFDRtn$ + S$(MFMonth%) + "/"
  457.   IF MFDay% < 10 THEN MFDRtn$ = MFDRtn$ + "0"
  458.   MFDRtn$ = MFDRtn$ + S$(MFDay%) + "/"
  459.   IF MFYear% < 10 THEN
  460.     MFDRtn$ = MFDRtn$ + "000"
  461.   ELSEIF MFYear% >= 10 AND MFYear% < 100 THEN MFDRtn$ = MFDRtn$ + "00"
  462.   ELSEIF MFYear% >= 100 AND MFYear% < 1000 THEN MFDRtn$ = MFDRtn$ + "0": END IF
  463.   MFDRtn$ = MFDRtn$ + S$(MFYear%)
  464.  
  465.   MakeFormattedDATE$ = MFDRtn$
  466.  
  467.  
  468. FUNCTION WrittenOutDate$ (WODMonth%, WODDay%, WODYear%)
  469.   WODRtn$ = ""
  470.   WODRtn$ = MonthWord$(WODMonth%)
  471.   WODRtn$ = WODRtn$ + " "
  472.   WODRtn$ = WODRtn$ + S$(WODDay%) + Suffix(WODDay%)
  473.   WODRtn$ = WODRtn$ + ", "
  474.   WODRtn$ = WODRtn$ + S$(WODYear%)
  475.  
  476.   WrittenOutDate$ = WODRtn$
  477.  
  478. FUNCTION CorrectDay% (CDMonth%, CDDay%, CDYear%)
  479.   CDRtn% = 0
  480.  
  481.   SELECT CASE CDDay%
  482.     CASE IS <= 0
  483.       IF CDMonth% = 1 OR CDMonth% = 3 OR CDMonth% = 5 OR CDMonth% = 7 OR CDMonth% = 8 OR CDMonth% = 10 OR CDMonth% = 12 THEN
  484.         CDRtn% = 31
  485.       ELSEIF CDMonth% = 4 OR CDMonth% = 6 OR CDMonth% = 9 OR CDMonth% = 11 THEN
  486.         CDRtn% = 30
  487.       ELSEIF CDMonth% = 2 THEN
  488.         IF CDYear% MOD 4 = 0 THEN
  489.         CDRtn% = 29: ELSE CDRtn% = 28: END IF
  490.       END IF
  491.     CASE 29
  492.       IF CDMonth% = 2 AND CDYear% MOD 4 <> 0 THEN
  493.         CDRtn% = 1
  494.       ELSE CDRtn% = CDDay%: END IF
  495.     CASE 30
  496.       IF CDMonth% = 2 AND CDYear% MOD 4 = 0 THEN
  497.       CDRtn% = 1: ELSE CDRtn% = CDDay%: END IF
  498.     CASE 31
  499.       IF CDMonth% = 4 OR CDMonth% = 6 OR CDMonth% = 9 OR CDMonth% = 11 THEN
  500.         CDRtn% = 1
  501.       ELSE CDRtn% = CDDay%: END IF
  502.     CASE IS >= 32
  503.       CDRtn% = 1
  504.     CASE ELSE
  505.       CDRtn% = CDDay%
  506.   CorrectDay% = CDRtn%
  507.  
  508. FUNCTION CenterBetween% (text$, MinX%, MaxX%)
  509.   CBRtn% = 0
  510.   IF LEN(text$) + MinX% >= MaxX% THEN
  511.     CBRtn% = MinX%
  512.   ELSE
  513.     CBRtn% = INT((MaxX% - MinX% - LEN(text$)) / 2) + MinX%
  514.   END IF
  515.   CenterBetween = CBRtn%
  516.  
  517. SUB FromNowUntil
  518.   FNUMonth% = 0: FNUDay% = 0: FNUYear% = 0: FNUHour% = 0: FNUMinute% = 0: FNUSecond% = 0
  519.   FNUHeader$ = "": FNUTargetFormatDATE$ = "": FNUTargetMonth% = 0: FNUTargetDay% = 0: FNUTargetYear% = 0
  520.   FNUTargetFormatTIME$ = "": FNUTargetHour% = 0: FNUTargetMinute% = 0: FNUTargetSecond% = 0: FNUTargetDayCopy% = 0
  521.   FNUFinalDay% = 0: FNUFinalMonth% = 0: FNUFinalYear% = 0: FNUFinalHour% = 0: FNUFinalMinute% = 0: FNUFinalSecond% = 0
  522.   a$ = "": LeftChar$ = ""
  523.  
  524.   FNUMonth% = VAL(LEFT$(DATE$, 2))
  525.   FNUDay% = VAL(MID$(DATE$, 4, 2))
  526.   FNUYear% = VAL(RIGHT$(DATE$, 4))
  527.   FNUDay% = DaysPassedJanFromMonthDayYear(FNUMonth%, FNUDay%, FNUYear%)
  528.   FNUHour% = VAL(LEFT$(TIME$, 2))
  529.   FNUMinute% = VAL(MID$(TIME$, 4, 2))
  530.   FNUSecond% = VAL(RIGHT$(TIME$, 2))
  531.  
  532.   FNUHeader$ = "Select A Target Date$"
  533.   FNUTargetFormatDATE$ = GetDate$(FNUHeader$)
  534.   FNUTargetMonth% = VAL(LEFT$(FNUTargetFormatDATE$, 2))
  535.   FNUTargetDay% = VAL(MID$(FNUTargetFormatDATE$, 4, 2))
  536.   FNUTargetDayCopy% = FNUTargetDay%
  537.   FNUTargetYear% = VAL(RIGHT$(FNUTargetFormatDATE$, 4))
  538.   FNUTargetDay% = DaysPassedJanFromMonthDayYear(FNUTargetMonth%, FNUTargetDay%, FNUTargetYear%)
  539.  
  540.   FNUHeader$ = ""
  541.   FNUHeader$ = "Select A Target Time On " + WrittenOutDate$(FNUTargetMonth%, FNUTargetDayCopy%, FNUTargetYear%)
  542.   FNUTargetFormatTIME$ = GetTime$(FNUHeader$)
  543.   FNUTargetHour% = VAL(LEFT$(FNUTargetFormatTIME$, 2))
  544.   FNUTargetMinute% = VAL(MID$(FNUTargetFormatTIME$, 4, 4))
  545.   FNUTargetSecond% = VAL(RIGHT$(FNUTargetFormatTIME$, 2))
  546.  
  547.   FNUFinalSecond% = FNUTargetSecond% - FNUSecond%
  548.   IF FNUFinalSecond% < 0 THEN
  549.     FNUTargetMinute% = FNUTargetMinute% - 1
  550.     FNUFinalSecond% = FNUFinalSecond% + 60
  551.   END IF
  552.   FNUFinalMinute% = FNUTargetMinute% - FNUMinute%
  553.   IF FinalMinute% < 0 THEN
  554.     FNUTargetHour% = FNUTargetHour% - 1
  555.     FNUFinalMinute% = FNUFinalMinute% + 60
  556.   END IF
  557.   FNUFinalHour% = FNUTargetHour% - FNUHour%
  558.   IF FNUFinalHour% < 0 THEN
  559.     FNUFinalHour% = FNUFinalHour% + 60
  560.     FNUTargetDay% = FNUTargetDay% - 1
  561.   END IF
  562.   FNUFinalDay% = FNUTargetDay% - FNUDay%
  563.   IF FNUFinalDay% < 0 THEN
  564.     FNUFinalDay% = FNUFinalDay% + 366
  565.     FNUTargetYear% = FNUTargetYear% - 1
  566.   END IF
  567.   FNUFinalYear% = FNUTargetYear% - FNUYear%
  568.  
  569.   COLOR 14, 1: CLS
  570.   IF FNUFinalYear% < 0 THEN
  571.     a$ = "": a$ = "The selected date and time is before now"
  572.     LOCATE 25, Center(a$)
  573.     PRINT a$
  574.   ELSE
  575.     a$ = "": a$ = MakeElapsedTimeShort$(FNUFinalYear%, FNUFinalDay%, FNUFinalHour%, FNUFinalMinute%, FNUFinalSecond%)
  576.     a$ = ElapsedTimeWrittenOut$(a$)
  577.     IF VAL(LEFT$(a$, 2)) = 1 THEN
  578.       b$ = "There is"
  579.     ELSE b$ = "There are": END IF
  580.     LOCATE 15, Center(b$): PRINT b$
  581.     LOCATE 20, Center(a$): PRINT a$
  582.     LOCATE 25, Center("until"): PRINT "until"
  583.     a$ = "": a$ = WrittenOutDate$(FNUTargetMonth%, FNUTargetDayCopy%, FNUTargetYear%)
  584.     LOCATE 30, Center(a$): PRINT a$
  585.     LOCATE 32, Center("at"): PRINT "at"
  586.     a$ = "": a$ = ClockString$(FNUTargetHour%, FNUTargetMinute%, FNUTargetSecond%)
  587.     LOCATE 34, Center(a$): PRINT a$
  588.   END IF
  589.  
  590.   a$ = "": a$ = "Hit any key to continue"
  591.   LOCATE 48, Center(a$): PRINT a$: ll$ = P$
  592.  
  593. FUNCTION MakeElapsedTimeShort$ (MEYears%, MEDays%, MEHours%, MEMinutes%, MESeconds%)
  594.   METSRtn$ = ""
  595.  
  596.   IF MEYears% < 10 THEN
  597.     METSRtn$ = "000"
  598.   ELSEIF MEYears% >= 10 AND MEYears% < 100 THEN METSRtn$ = "00"
  599.   ELSEIF MEYears% >= 100 AND MEYears% < 1000 THEN METSRtn$ = "0": END IF
  600.   METSRtn$ = METSRtn$ + S$(MEYears%) + ":"
  601.  
  602.   IF MEDays% < 10 THEN
  603.     METSRtn$ = METSRtn$ + "00"
  604.   ELSEIF MEDays% >= 10 AND MEDays% < 100 THEN
  605.   METSRtn$ = METSRtn$ + "0": END IF
  606.   METSRtn$ = METSRtn$ + S$(MEDays%) + ":"
  607.  
  608.   IF MEHours% < 10 THEN METSRtn$ = METSRtn$ + "0"
  609.   METSRtn$ = METSRtn$ + S$(MEHours%) + ":"
  610.  
  611.   IF MEMinutes% < 10 THEN METSRtn$ = METSRtn$ + "0"
  612.   METSRtn$ = METSRtn$ + S$(MEMinutes%) + ":"
  613.  
  614.   IF MESeconds% < 10 THEN METSRtn$ = METSRtn$ + "0"
  615.   METSRtn$ = METSRtn$ + S$(MESeconds%)
  616.  
  617.   MakeElapsedTimeShort$ = METSRtn$
  618.  
  619. FUNCTION ElapsedTimeWrittenOut$ (TimeShortString$)
  620.   ETWORtn$ = "": Years3% = 0: Days3% = 0: Hours3% = 0: Minutes3% = 0: Seconds3% = 0
  621.  
  622.   Years3% = VAL(LEFT$(TimeShortString$, 4))
  623.   Days3% = VAL(MID$(TimeShortString$, 6, 3))
  624.   Hours3% = VAL(MID$(TimeShortString$, 10, 2))
  625.   Minutes3% = VAL(MID$(TimeShortString$, 13, 2))
  626.   Seconds3% = VAL(RIGHT$(TimeShortString$, 2))
  627.  
  628.   IF Years3% <> 0 THEN
  629.     IF Years3% >= 1000 AND Years3% <= 9999 THEN
  630.       lftNum% = INT(Years3% / 1000)
  631.       ETWORtn$ = S$(lftNum%) + ","
  632.       rtNum% = Years3% - (lftNum% * 1000)
  633.       IF rtNum% < 10 THEN
  634.         ETWORtn$ = ETWORtn$ + "00"
  635.       ELSEIF rtNum% >= 10 AND rtNum% < 100 THEN
  636.         ETWORtn$ = ETWORtn$ + "0"
  637.       END IF
  638.       ETWORtn$ = ETWORtn$ + S$(rtNum%)
  639.     ELSE
  640.       ETWORtn$ = S$(Years3%)
  641.     END IF
  642.     ETWORtn$ = ETWORtn$ + " Year"
  643.     IF Years3% <> 1 THEN ETWORtn$ = ETWORtn$ + "s"
  644.     IF Days3% <> 0 AND (Hours3% <> 0 OR Minutes3% <> 0 OR Seconds3% <> 0) THEN
  645.       ETWORtn$ = ETWORtn$ + ", "
  646.     ELSEIF Days3% <> 0 AND (Hours3% = 0 AND Minutes3% = 0 AND Seconds3% = 0) THEN
  647.       ETWORtn$ = ETWORtn$ + " and "
  648.     ELSEIF Hours3% <> 0 AND (Minutes3% <> 0 OR Seconds3% <> 0) THEN
  649.       ETWORtn$ = ETWORtn$ + ", "
  650.     ELSEIF Hours3% <> 0 AND Minutes3% = 0 AND Seconds3% = 0 THEN
  651.       ETWORtn$ = ETWORtn$ + " and "
  652.     ELSEIF Minutes3% <> 0 AND Seconds3% <> 0 THEN
  653.       ETWORtn$ = ETWORtn$ + ", "
  654.     ELSEIF Minutes3% <> 0 XOR Seconds3% <> 0 THEN
  655.       ETWORtn$ = ETWORtn$ + " and "
  656.     END IF
  657.   END IF
  658.   IF Days3% <> 0 THEN
  659.     ETWORtn$ = ETWORtn$ + S$(Days3%) + " Day"
  660.     IF Days3% <> 1 THEN ETWORtn$ = ETWORtn$ + "s"
  661.     IF Hours3% <> 0 AND (Minutes3% <> 0 OR Seconds3% <> 0) THEN
  662.       ETWORtn$ = ETWORtn$ + ", "
  663.     ELSEIF Hours3% <> 0 AND Minutes3% = 0 AND Seconds3% = 0 THEN
  664.       ETWORtn$ = ETWORtn$ + " and "
  665.     ELSEIF Minutes3% <> 0 AND Seconds3% <> 0 THEN
  666.       ETWORtn$ = ETWORtn$ + ", "
  667.     ELSEIF Minutes3% <> 0 XOR Seconds3% <> 0 THEN
  668.       ETWORtn$ = ETWORtn$ + " and "
  669.     END IF
  670.   END IF
  671.   IF Hours3% <> 0 THEN
  672.     ETWORtn$ = ETWORtn$ + S$(Hours3%) + " hour"
  673.     IF Hours3% <> 1 THEN ETWORtn$ = ETWORtn$ + "s"
  674.     IF Minutes3% <> 0 AND Seconds3% <> 0 THEN
  675.       ETWORtn$ = ETWORtn$ + ", "
  676.     ELSEIF Minutes3% <> 0 XOR Seconds3% <> 0 THEN
  677.       ETWORtn$ = ETWORtn$ + " and "
  678.     END IF
  679.   END IF
  680.   IF Minutes3% <> 0 THEN
  681.     ETWORtn$ = ETWORtn$ + S$(Minutes3%) + " minute"
  682.     IF Minutes3% <> 1 THEN ETWORtn$ = ETWORtn$ + "s"
  683.     IF Seconds3% <> 0 THEN ETWORtn$ = ETWORtn$ + " and "
  684.   END IF
  685.   IF Seconds3% <> 0 THEN
  686.     ETWORtn$ = ETWORtn$ + S$(Seconds3%) + " second"
  687.     IF Seconds3% <> 1 THEN ETWORtn$ = ETWORtn$ + "s"
  688.   END IF
  689.   IF Years3% = 0 AND Days3% = 0 AND Hours3% = 0 AND Minutes3% = 0 AND Seconds3% = 0 THEN ETWORtn$ = "Nothing"
  690.   ElapsedTimeWrittenOut$ = ETWORtn$
  691.  
  692.  
  693. FUNCTION GetTime$ (GTHeader$)
  694.   HaltAndDisplay% = 0: GTHeaderCopy$ = "": Instructions$ = "": xPos% = 0: yPos% = 0: HighlightedOption% = 0
  695.   GTHours% = 0: GTMinutes% = 0: GTSeconds% = 0: SomeKey% = 0: TimerStarted% = 0: GTClock$ = ""
  696.   FirstTime% = 0: Increment% = 0: TimeElapsed% = 0: UserCommand$ = "": MaxOption% = 0: GTRtn$ = ""
  697.  
  698.   HaltAndDisplay% = TRUE%: xPos% = 13: yPos% = 25: HighlightedOption% = 1
  699.   GTHours% = VAL(LEFT$(TIME$, 2)): GTMinutes% = VAL(MID$(TIME$, 4, 2)): GTSeconds% = VAL(RIGHT$(TIME$, 2))
  700.   Increment% = 1: TimerStarted% = FALSE%: MaxOption% = 3
  701.  
  702.  
  703.   DO
  704.     UserCommand$ = INKEY$
  705.  
  706.     IF HaltAndDisplay% = TRUE% THEN
  707.       GTHeaderCopy$ = GTHeader$
  708.       COLOR 14, 1: CLS
  709.       COLOR 15
  710.       IF LEN(GTHeader$) >= 50 THEN
  711.         LOCATE 6, 1: PRINT LongCenter(GTHeaderCopy$, 50, FALSE%)
  712.       ELSE
  713.         LOCATE 7, Center(GTHeaderCopy$)
  714.         PRINT GTHeaderCopy$
  715.       END IF
  716.       COLOR 12, 1: Instructions$ = "Use the arrow keys to select the time. Push [ESC] to reset. Push "
  717.       Instructions$ = Instructions$ + CHR$(34) + "X" + CHR$(34) + " to exit to the system. Push [ENTER] when you have selected the desired time"
  718.       LOCATE 44, 1: PRINT LongCenter$(Instructions$, 60, FALSE%)
  719.  
  720.       IF HighlightedOption% = 1 THEN
  721.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  722.       LOCATE yPos% - 5, xPos%: PRINT "Hours"
  723.       LOCATE yPos% - 2, xPos% + 2
  724.       COLOR 14, 1:
  725.       IF GTHours% - 1 = -1 THEN
  726.         PRINT "11"
  727.       ELSEIF GTHours% - 1 = 0 THEN PRINT "12"
  728.       ELSEIF GTHours% - 1 > 0 AND GTHours% - 1 <= 12 THEN PRINT S$(GTHours% - 1)
  729.       ELSEIF GTHours% - 1 >= 13 AND GTHours% - 1 <= 23 THEN PRINT S$(GTHours% - 1 - 12): END IF
  730.       LOCATE yPos%, xPos% + 2: COLOR 10, 0
  731.       IF GTHours% = 0 THEN
  732.         PRINT "12"
  733.       ELSEIF GTHours% > 0 AND GTHours% <= 12 THEN PRINT S$(GTHours%)
  734.       ELSEIF GTHours% > 12 AND GTHours% < 24 THEN PRINT S$(GTHours% - 12): END IF
  735.       LOCATE yPos% + 2, xPos% + 2: COLOR 14, 1
  736.       IF GTHours% + 1 >= 1 AND GTHours% + 1 < 13 THEN
  737.         PRINT S$(GTHours% + 1)
  738.       ELSEIF GTHours% + 1 >= 13 AND GTHours% + 1 <= 24 THEN PRINT S$(GTHours% + 1 - 12): END IF
  739.  
  740.       IF HighlightedOption% = 2 THEN
  741.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  742.       LOCATE yPos% - 5, xPos% + 16: PRINT "Minutes"
  743.       LOCATE yPos% - 2, xPos% + 18: COLOR 14, 1
  744.       IF GTMinutes% - 1 = -1 THEN
  745.         PRINT "59"
  746.       ELSEIF GTMinutes% - 1 >= 0 AND GTMinutes% - 1 <= 59 THEN
  747.         IF GTMinutes% - 1 < 10 THEN PRINT "0";:
  748.         PRINT S$(GTMinutes% - 1)
  749.       END IF
  750.       LOCATE yPos%, xPos% + 18: COLOR 10, 0: IF GTMinutes% < 10 THEN PRINT "0";
  751.       PRINT S$(GTMinutes%)
  752.       LOCATE yPos% + 2, xPos% + 18: COLOR 14, 1
  753.       IF GTMinutes% + 1 >= 0 AND GTMinutes% + 1 <= 59 THEN
  754.         IF GTMinutes% + 1 < 10 THEN PRINT "0";
  755.         PRINT S$(GTMinutes% + 1)
  756.       ELSEIF GTMinutes% + 1 = 60 THEN PRINT "00"
  757.       END IF
  758.  
  759.       IF HighlightedOption% = 3 THEN
  760.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  761.       LOCATE yPos% - 5, xPos% + 32: PRINT "Seconds"
  762.       LOCATE yPos% - 2, xPos% + 36: COLOR 14, 1
  763.       IF GTSeconds% - 1 = -1 THEN
  764.         PRINT "59"
  765.       ELSEIF GTSeconds% - 1 >= 0 AND GTSeconds% <= 59 THEN
  766.         IF GTSeconds% - 1 < 10 THEN PRINT "0";
  767.         PRINT S$(GTSeconds% - 1)
  768.       END IF
  769.       LOCATE yPos%, xPos% + 36: COLOR 10, 0: IF GTSeconds% < 10 THEN PRINT "0";
  770.       PRINT S$(GTSeconds%)
  771.       LOCATE yPos% + 2, xPos% + 36: COLOR 14, 1
  772.       IF GTSeconds% + 1 >= 0 AND GTSeconds% + 1 <= 59 THEN
  773.         IF GTSeconds% + 1 < 10 THEN PRINT "0";
  774.         PRINT S$(GTSeconds% + 1)
  775.       ELSEIF GTSeconds% + 1 = 60 THEN PRINT "00": END IF
  776.  
  777.       LOCATE yPos% - 2, xPos% + 50: COLOR 14, 1
  778.       IF GTHours% - 1 >= 0 AND GTHours% - 1 <= 11 THEN
  779.       PRINT "AM": ELSE PRINT "PM": END IF
  780.       LOCATE yPos%, xPos% + 50: COLOR 10, 0
  781.       IF GTHours% < 12 THEN
  782.       PRINT "AM": ELSE PRINT "PM": END IF
  783.       LOCATE yPos% + 2, xPos% + 50: COLOR 14, 1
  784.       IF GTHours% + 1 >= 0 AND GTHours% + 1 <= 11 OR GTHours% + 1 = 24 THEN
  785.       PRINT "AM": ELSE: PRINT "PM": END IF
  786.  
  787.       GTClock$ = ClockString$(GTHours%, GTMinutes%, GTSeconds%)
  788.       COLOR 10, 0: LOCATE ypos + 34, Center(GTClock$): PRINT GTClock$
  789.  
  790.       HaltAndDisplay% = FALSE%
  791.     END IF
  792.  
  793.     SomeKey% = _KEYHIT
  794.     IF SomeKey% = UpKeyHit% OR SomeKey% = DownKeyHit% THEN
  795.       IF TimerStarted% = FALSE% THEN
  796.         FirstTime% = TIMER
  797.         TimerStarted% = TRUE%
  798.       END IF
  799.     END IF
  800.     IF SomeKey% < 0 THEN
  801.       FirstTime% = 0
  802.       Increment% = 1
  803.       TimeElapsed% = 0
  804.       TimerStarted% = FALSE%
  805.     END IF
  806.     TimeElapsed% = ABS(TIMER - FirstTime%)
  807.     IF TimeElapsed% = 2 THEN
  808.       IF HighlightedOption% = 2 OR HighlightedOption% = 3 THEN Increment% = 3
  809.     END IF
  810.  
  811.     SELECT CASE UserCommand$
  812.       CASE UpArrowKey$
  813.         IF HighlightedOption% = 1 THEN
  814.           GTHours% = GTHours% - Increment%
  815.           IF GTHours% < 0 THEN GTHours% = 23
  816.         ELSEIF HighlightedOption% = 2 THEN
  817.           GTMinutes% = GTMinutes% - Increment%
  818.           IF GTMinutes% < 0 THEN GTMinutes% = 59
  819.         ELSEIF HighlightedOption% = 3 THEN
  820.           GTSeconds% = GTSeconds% - Increment%
  821.           IF GTSeconds% < 0 THEN GTSeconds% = 59
  822.         END IF
  823.         HaltAndDisplay% = TRUE
  824.       CASE DownArrowKey$
  825.         IF HighlightedOption% = 1 THEN
  826.           GTHours% = GTHours% + Increment%
  827.           IF GTHours% > 23 THEN GTHours% = 0
  828.         ELSEIF HighlightedOption% = 2 THEN
  829.           GTMinutes% = GTMinutes% + Increment%
  830.           IF GTMinutes% > 59 THEN GTMinutes% = 0
  831.         ELSEIF HighlightedOption% = 3 THEN
  832.           GTSeconds% = GTSeconds% + Increment%
  833.           IF GTSeconds% > 59 THEN GTSeconds% = 0
  834.         END IF
  835.         HaltAndDisplay% = TRUE
  836.       CASE LeftArrowKey$
  837.         HighlightedOption% = HighlightedOption% - 1
  838.         IF HighlightedOption% = 0 THEN HighlightedOption% = MaxOption%
  839.         HaltAndDisplay% = TRUE
  840.       CASE RightArrowKey$
  841.         HighlightedOption% = HighlightedOption% + 1
  842.         IF HighlightedOption% > MaxOption% THEN HighlightedOption% = 1
  843.         HaltAndDisplay% = TRUE
  844.       CASE CHR$(13)
  845.         GTRtn$ = MakeFormattedTIME$(GTHours%, GTMinutes%, GTSeconds%)
  846.       CASE CHR$(27)
  847.         GTHours% = VAL(LEFT$(TIME$, 2))
  848.         GTMinutes% = VAL(MID$(TIME$, 4, 2))
  849.         GTSeconds% = VAL(RIGHT$(TIME$, 2))
  850.         HaltAndDisplay% = TRUE%
  851.       CASE "X", "x"
  852.         SYSTEM
  853.     END SELECT
  854.   LOOP UNTIL UserCommand$ = CHR$(13)
  855.  
  856.   GetTime$ = GTRtn$
  857.  
  858. FUNCTION MakeFormattedTIME$ (MFHours%, MFMinutes%, MFSeconds%)
  859.   MFTRtn$ = ""
  860.  
  861.   IF MFHours% < 10 THEN MFTRtn$ = "0"
  862.   MFTRtn$ = MFTRtn$ + S$(MFHours%) + ":"
  863.   IF MFMinutes% < 10 THEN MFTRtn$ = MFTRtn$ + "0"
  864.   MFTRtn$ = MFTRtn$ + S$(MFMinutes%) + ":"
  865.   IF MFSeconds% < 10 THEN MFTRtn$ = MFTRtn$ + "0"
  866.   MFTRtn$ = MFTRtn$ + S$(MFSeconds%)
  867.  
  868.   MakeFormattedTIME$ = MFTRtn$
  869.  
  870.  
  871. FUNCTION LongCenter$ (Text$, CutHere%, BlankLineBetween%)
  872.   PartString$ = "": Spaces$ = "": CutString$ = "": LCRtn$ = "": LastSpaces$ = ""
  873.   NumLastSpaces% = 0
  874.  
  875.   CutHere% = CutHere% + 1
  876.   DO
  877.     DO
  878.       CutHere% = CutHere% - 1
  879.       Cutting$ = MID$(Text$, CutHere%, 1)
  880.     LOOP UNTIL Cutting$ = " "
  881.     PartString$ = MID$(Text$, 1, CutHere%)
  882.     Text$ = MID$(Text$, CutHere% + 1, LEN(Text$))
  883.     Spaces$ = STRING$(Center(PartString$), " ")
  884.     CutString$ = Spaces$ + PartString$ + Spaces$
  885.     LCRtn$ = LCRtn$ + CutString$
  886.     IF BlankLineBetween% = TRUE% THEN LCRtn$ = LCRtn$ + STRING$(80, " ")
  887.   LOOP UNTIL LEN(Text$) < CutHere%
  888.   NumLastSpaces% = Center(Text$)
  889.   LastSpaces$ = STRING$(NumLastSpaces%, " ")
  890.   LCRtn$ = LCRtn$ + LastSpaces$ + Text$
  891.   LongCenter$ = LCRtn$
  892.  
  893.  
  894. FUNCTION DaysPassedJanFromMonthDayYear% (Month9%, Day9%, Years9%)
  895.   DPJFMDYRtn% = 0: LeapYear% = 0
  896.  
  897.   IF Years9% MOD 4 = 0 THEN
  898.   LeapYear% = 1: ELSE LeapYear% = 0: END IF
  899.  
  900.   SELECT CASE Month9%
  901.     CASE 1
  902.       DPJFMDYRtn% = Day9%
  903.     CASE 2
  904.       DPJFMDYRtn% = 31 + Day9%
  905.     CASE 3
  906.       DPJFMDYRtn% = 31 + 28 + LeapYear% + Day9%
  907.     CASE 4
  908.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + Day9%
  909.     CASE 5
  910.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + Day9%
  911.     CASE 6
  912.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + Day9%
  913.     CASE 7
  914.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + Day9%
  915.     CASE 8
  916.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + 31 + Day9%
  917.     CASE 9
  918.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + 31 + 31 + Day9%
  919.     CASE 10
  920.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + 31 + 31 + 30 + Day9%
  921.     CASE 11
  922.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + Day9%
  923.     CASE 12
  924.       DPJFMDYRtn% = 31 + 28 + LeapYear% + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + Day9%
  925.   DaysPassedJanFromMonthDayYear = DPJFMDYRtn%
  926.  
  927. SUB HowLongSince
  928.   YearNow% = 0: DayNow% = 0: HourNow% = 0: MinuteNow% = 0: SecondNow% = 0: MonthNow% = 0
  929.   HLSTargetDateAndTime$ = "": Instructions$ = "": DayNowCopy% = 0: HLSTargetYear% = 0: HLSTargetDay% = 0
  930.   HLSTargetHour% = 0: HLSTargetMinute% = 0: HLSTargetSecond% = 0: HLSFinalYear% = 0: HLSFinalDay% = 0
  931.   HLSFinalHour% = 0: HLSFinalMinute% = 0: HLSFinalSecond% = 0: SecondNowCopy% = 0: MinuteNowCopy% = 0: HourNowCopy% = 0
  932.   DayNowCopy% = 0: YearNowCopy% = 0: HLSTargetMonth% = 0: HLSTargetDayCopy% = 0
  933.  
  934.   YearNow% = VAL(RIGHT$(DATE$, 4))
  935.   DayNow% = VAL(MID$(DATE$, 4, 2))
  936.   DayNowCopy% = DayNow%
  937.   MonthNow% = VAL(LEFT$(DATE$, 2))
  938.   DayNow% = DaysPassedJanFromMonthDayYear(MonthNow%, DayNow%, YearNow%)
  939.   HourNow% = VAL(LEFT$(TIME$, 2))
  940.   MinuteNow% = VAL(MID$(TIME$, 4, 2))
  941.   SecondNow% = VAL(RIGHT$(TIME$, 2))
  942.   YearNowCopy% = YearNow%
  943.   HourNowCopy% = HourNow%
  944.   MinuteNowCopy% = MinuteNow%
  945.   SecondNowCopy% = SecondNow%
  946.  
  947.   Instructions$ = "Select A Target Date and Time Before " + WrittenOutDate$(MonthNow%, DayNowCopy%, YearNow%)
  948.   Instructions$ = Instructions$ + " at " + ClockString$(HourNow%, MinuteNow%, SecondNow%)
  949.   HLSTargetDateAndTime$ = GetDateAndTime$(Instructions$)
  950.  
  951.   whatTheHellString$ = MID$(HLSTargetDateAndTime$, 6, 3)
  952.   whatTheHellInteger% = VAL(whatTheHellString$)
  953.   HLSTargetYear% = VAL(LEFT$(HLSTargetDateAndTime$, 4))
  954.   HLSTargetDay% = VAL(MID$(HLSTargetDateAndTime$, 6, 3))
  955.   HLSTargetHour% = VAL(MID$(HLSTargetDateAndTime$, 10, 2))
  956.   HLSTargetMinute% = VAL(MID$(HLSTargetDateAndTime$, 13, 2))
  957.   HLSTargetSecond% = VAL(RIGHT$(HLSTargetDateAndTime$, 2))
  958.   HLSTargetMonth% = MonthOrDayFromDaysPassedJan(HLSTargetDay%, 1, HLSTargetYear%)
  959.   HLSTargetDayCopy% = MonthOrDayFromDaysPassedJan(HLSTargetDay%, 2, HLSTargetYear%)
  960.  
  961.   HLSFinalSecond% = SecondNow% - HLSTargetSecond%
  962.   IF HLSFinalSecond% < 0 THEN
  963.     HLSFinalSecond% = HLSFinalSecond% + 60
  964.     MinuteNow% = MinuteNow% - 1
  965.   END IF
  966.   HLSFinalMinute% = MinuteNow% - HLSTargetMinute%
  967.   IF HLSFinalMinute% < 0 THEN
  968.     HLSFinalMinute% = HLSFinalMinute% + 60
  969.     HourNow% = HourNow% - 1
  970.   END IF
  971.   HLSFinalHour% = HourNow% - HLSTargetHour%
  972.   IF HLSFinalHour% < 0 THEN
  973.     HLSFinalHour% = HLSFinalHour% + 24
  974.     DayNow% = DayNow% - 1
  975.   END IF
  976.   HLSFinalDay% = DayNow% - whatTheHellInteger%
  977.   IF HLSFinalDay% < 0 THEN
  978.     HLSFinalDay% = HLSFinalDay% + 365
  979.     YearNow% = YearNow% - 1
  980.   END IF
  981.   HLSFinalYear% = YearNow% - HLSTargetYear%
  982.  
  983.   COLOR 14, 1: CLS
  984.   IF HLSFinalYear% < 0 THEN
  985.     a$ = "": a$ = "The selected date and time is after "
  986.     a$ = a$ + WrittenOutDate$(MonthNow%, DayNowCopy%, YearNowCopy%)
  987.     a$ = a$ + " at " + ClockString$(HourNowCopy%, MinuteNowCopy%, SecondNowCopy%)
  988.     LOCATE 24, 1
  989.     PRINT LongCenter$(a$, 50, TRUE%)
  990.   ELSE
  991.     a$ = "": a$ = WrittenOutDate$(HLSTargetMonth%, HLSTargetDayCopy%, HLSTargetYear%)
  992.     a$ = a$ + " at " + ClockString$(HLSTargetHour%, HLSTargetMinute%, HLSTargetSecond%)
  993.     a$ = a$ + " occurred "
  994.     a$ = a$ + ElapsedTimeWrittenOut$(MakeElapsedTimeShort$(HLSFinalYear%, HLSFinalDay%, HLSFinalHour%, HLSFinalMinute%, HLSFinalSecond%))
  995.     a$ = a$ + " ago"
  996.     LOCATE 24, 1
  997.     PRINT LongCenter(a$, 50, TRUE%)
  998.   END IF
  999.   a$ = "Hit any key": LOCATE 48, Center(a$): PRINT a$: ll$ = P$
  1000.  
  1001. SUB WhatDateAfterElapsedTime
  1002.   TimePassed$ = "": YearsToday% = 0: MonthToday% = 0: DaysToday% = 0: DaysTodayAfterJan0% = 0: HoursToday% = 0: MinutesToday% = 0
  1003.   SecondsToday% = 0: YearsPassed% = 0: DaysPassed% = 0: HoursPassed% = 0: MinutesPassed% = 0: SecondsPassed% = 0
  1004.   ResultingYears% = 0: ResultingDaysPassedJan% = 0: ResultingDays% = 0: ResultingHours% = 0: ResultingMinutes% = 0
  1005.   ResultingSeconds% = 0: ResultingDateMonth% = 0: ResultingDateDay% = 0: ResultingDateYear% = 0: ResultingTimeHour% = 0
  1006.   ResultingTimeMinutes% = 0: ResultingTimeSeconds% = 0: AnswerString$ = ""
  1007.  
  1008.  
  1009.   YearsToday% = VAL(RIGHT$(DATE$, 4))
  1010.   DaysToday% = VAL(MID$(DATE$, 4, 2))
  1011.   MonthToday% = VAL(LEFT$(DATE$, 2))
  1012.   DaysTodayAfterJan0% = DaysPassedJanFromMonthDayYear(MonthToday%, DaysToday%, YearsToday%)
  1013.   HoursToday% = VAL(LEFT$(TIME$, 2))
  1014.   MinutesToday% = VAL(MID$(TIME$, 4, 2))
  1015.   SecondsToday% = VAL(RIGHT$(TIME$, 2))
  1016.  
  1017.   TimePassed$ = GetElapsedTime$("Find the date after how much time has passed?")
  1018.   YearsPassed% = VAL(LEFT$(TimePassed$, 4))
  1019.   DaysPassed% = VAL(MID$(TimePassed$, 6, 3))
  1020.   HoursPassed% = VAL(MID$(TimePassed$, 10, 2))
  1021.   MinutesPassed% = VAL(MID$(TimePassed$, 13, 2))
  1022.   SecondsPassed% = VAL(RIGHT$(TimePassed$, 2))
  1023.  
  1024.   ResultingSeconds% = SecondsToday% + SecondsPassed%
  1025.   IF ResultingSeconds% >= 60 THEN
  1026.     ResultingSeconds% = ResultingSeconds% - 60
  1027.     MinutesPassed% = MinutesPassed% + 1
  1028.   END IF
  1029.   ResultingMinutes% = MinutesToday% + MinutesPassed%
  1030.   IF ResultingMinutes% >= 60 THEN
  1031.     ResultingMinutes% = ResultingMinutes% - 60
  1032.     HoursPassed% = HoursPassed% + 1
  1033.   END IF
  1034.   ResultingHours% = HoursToday% + HoursPassed%
  1035.   IF ResultingHours% >= 24 THEN
  1036.     ResultingHours% = ResultingHours% - 24
  1037.     DaysPassed% = DaysPassed% + 1
  1038.   END IF
  1039.   ResultingDays% = DaysTodayAfterJan0% + DaysPassed%
  1040.   IF ResultingDays% >= 365 THEN
  1041.     ResultingDays% = ResultingDays% - 365
  1042.     YearsPassed% = YearsPassed% + 1
  1043.   END IF
  1044.   ResultingYears% = YearsToday% + YearsPassed%
  1045.   ResultingDateYear% = ResultingYears%
  1046.   ResultingDateMonth% = MonthOrDayFromDaysPassedJan(ResultingDays%, 1, ResultingDateYear%)
  1047.   ResultingDateDay% = MonthOrDayFromDaysPassedJan(ResultingDays%, 2, ResultingDateYear%)
  1048.   ResultingTimeHour% = ResultingHours%
  1049.   ResultingTimeMinutes% = ResultingMinutes%
  1050.   ResultingTimeSeconds% = ResultingSeconds%
  1051.   AnswerString$ = ElapsedTimeWrittenOut$(MakeElapsedTimeShort$(YearsPassed%, DaysPassed%, HoursPassed%, MinutesPassed%, SecondsPassed%))
  1052.   AnswerString$ = AnswerString$ + " after now is "
  1053.   AnswerString$ = AnswerString$ + WrittenOutDate$(ResultingDateMonth%, ResultingDateDay%, ResultingDateYear%)
  1054.   AnswerString$ = AnswerString$ + " at " + ClockString$(ResultingTimeHour%, ResultingTimeMinutes%, ResultingTimeSeconds%)
  1055.   CLS
  1056.   LOCATE 23, 1
  1057.   PRINT LongCenter$(AnswerString$, 45, TRUE%)
  1058.   a$ = "": a$ = "Hit any key": LOCATE 48, Center(a$): PRINT a$: ll$ = P$
  1059.  
  1060. SUB AddElapsedTimes
  1061.   Years1% = 0: Years2% = 0: AddedYears% = 0: Days1% = 0: Days2% = 0: AddedDays% = 0: Hours1% = 0
  1062.   Hours2% = 0: AddedHours% = 0: Minutes1% = 0: Minutes2% = 0: AddedMinutes% = 0: Seconds1% = 0
  1063.   Seconds2% = 0: AddedSeconds% = 0: et1$ = "": et2$ = "": Prompt2$ = "": AnswerString$ = "": AT$ = ""
  1064.  
  1065.   et1$ = GetElapsedTime$("Select the fire time")
  1066.   Years1% = VAL(LEFT$(et1$, 4))
  1067.   Days1% = VAL(MID$(et1$, 6, 3))
  1068.   Hours1% = VAL(MID$(et1$, 10, 2))
  1069.   Minutes1% = VAL(MID$(et1$, 13, 2))
  1070.   Seconds1% = VAL(RIGHT$(et1$, 2))
  1071.  
  1072.   Prompt2$ = "Select the amount of time to add to " + ElapsedTimeWrittenOut$(et1$)
  1073.   et2$ = GetElapsedTime$(Prompt2$)
  1074.   Years2% = VAL(LEFT$(et2$, 4))
  1075.   Days2% = VAL(MID$(et2$, 6, 3))
  1076.   Hours2% = VAL(MID$(et2$, 10, 2))
  1077.   Minutes2% = VAL(MID$(et2$, 13, 2))
  1078.   Seconds2% = VAL(RIGHT$(et2$, 2))
  1079.  
  1080.   AddedSeconds% = Seconds1% + Seconds2%
  1081.   IF AddedSeconds% >= 60 THEN
  1082.     AddedSeconds% = AddedSeconds% - 60
  1083.     Minutes1% = Minutes1% + 1
  1084.   END IF
  1085.   AddedMinutes% = Minutes1% + Minutes2%
  1086.   IF AddedMinutes% >= 60 THEN
  1087.     AddedMinutes% = AddedMinutes% - 60
  1088.     Hours1% = Hours1% + 1
  1089.   END IF
  1090.   AddedHours% = Hours1% + Hours2%
  1091.   IF AddedHours% >= 24 THEN
  1092.     AddedHours% = AddedHours% - 24
  1093.     Days1% = Days1% + 1
  1094.   END IF
  1095.   AddedDays% = Days1% + Days2%
  1096.   IF AddedDays% >= 365 THEN
  1097.     AddedDays% = AddedDays% - 365
  1098.     Years1% = Years1% + 1
  1099.   END IF
  1100.   AddedYears% = Years1% + Years2%
  1101.  
  1102.   COLOR 14, 1: CLS
  1103.   AnswerString$ = ElapsedTimeWrittenOut$(et1$) + " added with " + ElapsedTimeWrittenOut$(et2$)
  1104.   ATShort$ = MakeElapsedTimeShort$(AddedYears%, AddedDays%, AddedHours%, AddedMinutes%, AddedSeconds%)
  1105.   AT$ = ElapsedTimeWrittenOut$(ATShort$)
  1106.   AnswerString$ = AnswerString$ + " equals " + AT$
  1107.   LOCATE 20, 1
  1108.   PRINT LongCenter$(AnswerString$, 50, TRUE%)
  1109.   ll$ = P$
  1110.  
  1111. SUB SubtractElapsedTimes
  1112.   Et1$ = "": Et2$ = "": Prompt1$ = "": Prompt2$ = "": Years1% = 0: Years2% = 0: SubtractedYears% = 0: Days1% = 0: Days2% = 0
  1113.   SubtractedDays% = 0: Hours1% = 0: Hours2% = 0: SubtractedHours% = 0: Minutes1% = 0: Minutes2% = 0: SubtractedMinutes% = 0
  1114.   Seconds1% = 0: Seconds2% = 0: SubtractedSeconds% = 0: BT% = 0: FirstYears% = 0: SecondYears% = 0: FirstDays% = 0: SecondDays% = 0
  1115.   FirstHours% = 0: SecondHours% = 0: FirstMinutes% = 0: SecondMinutes% = 0: FirstSeconds% = 0: SecondSeconds% = 0: Result$ = ""
  1116.   FTWO$ = "": STWO$ = "": SubTWO$ = ""
  1117.  
  1118.   Prompt1$ = "Select one of the 2 times"
  1119.   Et1$ = GetElapsedTime$(Prompt1$)
  1120.   Years1% = VAL(LEFT$(Et1$, 4))
  1121.   Days1% = VAL(MID$(Et1$, 6, 3))
  1122.   Hours1% = VAL(MID$(Et1$, 10, 2))
  1123.   Minutes1% = VAL(MID$(Et1$, 13, 2))
  1124.   Seconds1% = VAL(RIGHT$(Et1$, 2))
  1125.  
  1126.   Prompt2$ = "Select the second time -- The smaller time will be subtracted from the larger"
  1127.   Et2$ = GetElapsedTime$(Prompt2$)
  1128.   Years2% = VAL(LEFT$(Et2$, 4))
  1129.   Days2% = VAL(MID$(Et2$, 6, 3))
  1130.   Hours2% = VAL(MID$(Et2$, 10, 2))
  1131.   Minutes2% = VAL(MID$(Et2$, 13, 2))
  1132.   Seconds2% = VAL(RIGHT$(Et2$, 2))
  1133.  
  1134.   BT% = 1
  1135.   IF Years1% < Years2% THEN
  1136.     BT% = 2
  1137.   ELSEIF Years1% = Years2% AND Days1% < Days2% THEN BT% = 2
  1138.   ELSEIF Years1% = Years2% AND Days1% = Days2% AND Hours1% < Hours2% THEN BT% = 2
  1139.   ELSEIF Years1% = Years2% AND Days1% = Days2% AND Hours1% = Hours2% AND Minutes1% < Minutes2% THEN BT% = 2
  1140.   ELSEIF Years1% = Years2% AND Days1% = Days2% AND Hours1% = Hours2% AND Minutes1% = Minutes1% AND Seconds1% < Seconds2% THEN BT% = 2
  1141.   END IF
  1142.  
  1143.   ' first - second
  1144.   IF BT% = 1 THEN
  1145.     FirstYears% = Years1%: SecondYears% = Years2%
  1146.     FirstDays% = Days1%: SecondDays% = Days2%
  1147.     FirstHours% = Hours1%: SecondHours% = Hours2%
  1148.     FirstMinutes% = Minutes1%: SecondMinutes% = Minutes2%
  1149.     FirstSeconds% = Seconds1%: SecondSeconds% = Seconds2%
  1150.   ELSE
  1151.     FirstYears% = Years2%: SecondYears% = Years1%
  1152.     FirstDays% = Days2%: SecondDays% = Days1%
  1153.     FirstHours% = Hours2%: SecondHours% = Hours1%
  1154.     FirstMinutes% = Minutes2%: SecondMinutes% = Minutes1%
  1155.     FirstSeconds% = Seconds2%: SecondSeconds% = Seconds1%
  1156.   END IF
  1157.  
  1158.  
  1159.   SubtractedSeconds% = FirstSeconds% - SecondSeconds%
  1160.   IF SubtractedSeconds% < 0 THEN
  1161.     SubtractedSeconds% = SubtractedSeconds% + 60
  1162.     FirstMinutes% = FirstMinutes% - 1
  1163.   END IF
  1164.   SubtractedMinutes% = FirstMinutes% - SecondMinutes%
  1165.   IF SubtractedMinutes% < 0 THEN
  1166.     SubtractedMinutes% = SubtractedMinutes% + 60
  1167.     FirstHours% = FirstHours% - 1
  1168.   END IF
  1169.   SubtractedHours% = FirstHours% - SecondHours%
  1170.   IF SubtractedHours% < 0 THEN
  1171.     SubtractedHours% = SubtractedHours% + 24
  1172.     FirstDays% = FirstDays% - 1
  1173.   END IF
  1174.   SubtractedDays% = FirstDays% - SecondDays%
  1175.   IF SubtractedDays% < 0 THEN
  1176.     SubtractedDays% = SubtractedDays% + 365
  1177.     FirstYears% = FirstYears% - 1
  1178.   END IF
  1179.   SubtractedYears% = FirstYears% - SecondYears%
  1180.  
  1181.   CLS
  1182.   PRINT "SubtractedYears%: " + S$(SubtractedYears%)
  1183.   PRINT "SubtractedDays%: " + S$(SubtractedDays%)
  1184.   PRINT "SubtractedHours%: " + S$(SubtractedHours%)
  1185.   PRINT "SubtractedMinutes%: " + S$(SubtractedMinutes%)
  1186.   PRINT "SubtractedSeconds%: " + S$(SubtractedSeconds%)
  1187.   ll$ = P$
  1188.  
  1189.   FTWO$ = ElapsedTimeWrittenOut$(Et1$)
  1190.   STWO$ = ElapsedTimeWrittenOut$(Et2$)
  1191.   SubTWO$ = ElapsedTimeWrittenOut$(MakeElapsedTimeShort$(SubtractedYears%, SubtractedDays%, SubtractedHours%, SubtractedMinutes%, SubtractedSeconds%))
  1192.  
  1193.   Result$ = FTWO$ + " minus " + STWO$ + " equals " + SubTWO$
  1194.   CLS: COLOR 14, 1: LOCATE 20, 1: PRINT LongCenter$(Result$, 50, TRUE%)
  1195.   ll$ = P$
  1196.  
  1197. SUB Multiply
  1198.   Prompt$ = "": Et$ = "": Years% = 0: Days% = 0: Hours% = 0: Minutes% = 0: Seconds% = 0: ETWO$ = "": x = 0
  1199.   Constant! = 0.0: ProductYears% = 0: ProductDays% = 0: ProductHours% = 0: ProductMinutes% = 0: ProductSeconds% = 0
  1200.   TMin% = 0: THr% = 0: Tsec% = 0: Tday% = 0: Tyr% = 0: Ans$ = ""
  1201.  
  1202.   Prompt$ = "Select a time to multiply"
  1203.   Et$ = GetElapsedTime$(Prompt$)
  1204.   Years% = VAL(LEFT$(Et$, 4))
  1205.   Days% = VAL(MID$(Et$, 6, 3))
  1206.   Hours% = VAL(MID$(Et$, 10, 2))
  1207.   Minutes% = VAL(MID$(Et$, 13, 2))
  1208.   Seconds% = VAL(MID$(Et$, 16, 2))
  1209.  
  1210.   COLOR 14, 1: CLS
  1211.   LOCATE 20, Center("Multiply")
  1212.   ETWO$ = ElapsedTimeWrittenOut$(Et$)
  1213.   LOCATE 22, Center(ETWO$): PRINT ETWO$
  1214.   x = Center("by what    ")
  1215.   LOCATE 25, x: INPUT "by what"; Constant!
  1216.  
  1217.   ProductSeconds% = RoundOff(Seconds% * Constant! / 100) * 100
  1218.   IF ProductSeconds% >= 60 THEN
  1219.     DO
  1220.       ProductSeconds% = ProductSeconds% - 60
  1221.       TMin% = TMin% + 1
  1222.     LOOP UNTIL ProductSeconds% < 60
  1223.   END IF
  1224.   ProductMinutes% = RoundOff(Minutes% * Constant! / 100) * 100 + TMin%
  1225.   IF ProductMinutes% >= 60 THEN
  1226.     DO
  1227.       ProductMinutes% = ProductMinutes% - 60
  1228.       THr% = THr% + 1
  1229.     LOOP UNTIL ProductMinutes% < 60
  1230.   END IF
  1231.   ProductHours% = RoundOff(Hours% * Constant! / 100) * 100 + THr%
  1232.   IF ProductHours% >= 24 THEN
  1233.     DO
  1234.       ProductHours% = ProductHours% - 24
  1235.       Tday% = Tday% + 1
  1236.     LOOP UNTIL ProductHours% < 24
  1237.   END IF
  1238.   ProductDays% = RoundOff(Days% * Constant! / 100) * 100 + Tday%
  1239.   IF ProductDays% >= 365 THEN
  1240.     ProductDays% = ProductDays% - 365
  1241.     Tyr% = Tyr% + 1
  1242.   END IF
  1243.   ProductYears% = RoundOff(Years% * Constant! / 100) * 100 + Tyr%
  1244.  
  1245.   CLS
  1246.   IF ProductYears% > 9999 THEN
  1247.     LOCATE 10: a$ = "": a$ = "May not display correctly": LOCATE , Center(a$): PRINT a$
  1248.   END IF
  1249.   LOCATE 20, Center(ElapsedTimeWrittenOut$(Et$)): PRINT ElapsedTimeWrittenOut$(Et$)
  1250.   Ans$ = "multiplied by " + S$(Constant!) + " equals": LOCATE 22, Center(Ans$): PRINT Ans$
  1251.   LOCATE 24, 1
  1252.   PRINT LongCenter(ElapsedTimeWrittenOut$(MakeElapsedTimeShort$(ProductYears%, ProductDays%, ProductHours%, ProductMinutes%, ProductSeconds%)), 40, TRUE)
  1253.   ll$ = P$
  1254.  
  1255. FUNCTION RoundOff (Number!)
  1256.   DIM Rtn!, DifferentNumber!, Decimal!: Rtn = 0.0: DifferentNumber = 0.0: Decimal = 0.0
  1257.   Decimal = INT(Number * 1000) - (INT(Number * 100) * 10)
  1258.   DifferentNumber! = INT(Number! * 100)
  1259.   IF Decimal! >= 5 AND Decimal! <= 9 THEN
  1260.     DifferentNumber! = DifferentNumber! + 1
  1261.   ELSE
  1262.     DifferentNumber! = DifferentNumber!
  1263.   END IF
  1264.   Rtn = DifferentNumber! / 100
  1265.   RoundOff = Rtn!
  1266.  
  1267. FUNCTION GetElapsedTime$ (title$)
  1268.   DIM minOption, maxOption, haltAndDisplay, xPos, yPos, highlightedOption AS INTEGER
  1269.   DIM Years1, Days1, Hours1, Minutes1, Seconds1 AS INTEGER
  1270.   KeyThatWasHit% = 0: TimerStarted% = FALSE%: FirstTime% = 0: Increment% = 1: RecentTime% = 0: TimeDifference% = 0
  1271.  
  1272.   highlightedOption = 4: haltAndDisplay = TRUE
  1273.   minOption = 4: maxOption = 8
  1274.   DO
  1275.     userCommand$ = INKEY$
  1276.     IF haltAndDisplay = TRUE THEN
  1277.       COLOR 14, 1: CLS: yPos = 22: xPos = 10
  1278.       COLOR 15, 1
  1279.       titleCopy$ = title$
  1280.       IF LEN(titleCopy$) >= 60 THEN
  1281.         a$ = LongCenter(titleCopy$, 60, FALSE%)
  1282.         LOCATE 8, 1: PRINT a$
  1283.       ELSE
  1284.         LOCATE 8, Center(titleCopy$): PRINT title$
  1285.       END IF
  1286.       COLOR 12, 1
  1287.       Instructions$ = ""
  1288.       Instructions$ = "Use the arrow keys to select the desired elapsed time - Push [ENTER] to accept - Push "
  1289.       Instructions$ = Instructions$ + "Push [ESC] to reset - Push " + CHR$(34) + "X" + CHR$(34) + " to exit to the system"
  1290.       LOCATE yPos + 18, 1
  1291.       PRINT LongCenter$(Instructions$, 50, FALSE%)
  1292.  
  1293.       xPos = xPos + 16
  1294.  
  1295.       'Years
  1296.       LOCATE yPos - 5, xPos - 10
  1297.       IF highlightedOption = 4 THEN
  1298.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Years"
  1299.       LOCATE yPos - 2, xPos - 10: COLOR 14, 1:
  1300.       IF Years1 - 1 >= 0 THEN
  1301.       PRINT USING "#,###"; (Years1 - 1): ELSE PRINT "9,999": END IF
  1302.       LOCATE yPos: COLOR 10, 0: IF Years1 >= 0 AND Years1 < 10 THEN
  1303.         LOCATE , xPos - 6: PRINT S$(Years1)
  1304.       ELSEIF Years1 >= 10 AND Years1 < 100 THEN LOCATE , xPos - 7: PRINT S$(Years1)
  1305.       ELSEIF Years1 >= 100 AND Years1 < 1000 THEN LOCATE , xPos - 8: PRINT S$(Years1)
  1306.       ELSEIF Years1 >= 1000 AND Years1 < 10000 THEN LOCATE , xPos - 10: PRINT USING "#,###"; Years1
  1307.       ELSE PRINT "I hope I don't see this error": END IF
  1308.       LOCATE yPos + 2, xPos - 10: COLOR 14, 1: IF Years1 + 1 < 10000 THEN
  1309.       PRINT USING "#,###"; Years1 + 1: ELSE PRINT USING "#,###"; 0: END IF
  1310.  
  1311.       'Days
  1312.       LOCATE yPos - 5, xPos
  1313.       IF highlightedOption = 5 THEN
  1314.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Days"
  1315.       COLOR 14, 1: LOCATE yPos - 2, xPos: IF Days1 - 1 = -1 THEN
  1316.       PRINT "364": ELSE PRINT USING "###"; Days1 - 1: END IF
  1317.       COLOR 10, 0: LOCATE yPos: IF Days1 < 10 THEN
  1318.         LOCATE , xPos + 2: PRINT S$(Days1)
  1319.       ELSEIF Days1 < 100 THEN LOCATE , xPos + 1: PRINT S$(Days1)
  1320.       ELSE LOCATE , xPos: PRINT S$(Days1): END IF
  1321.       COLOR 14, 1: LOCATE yPos + 2, xPos + 0: IF Days1 + 1 < 365 THEN
  1322.       PRINT USING "###"; Days1 + 1: ELSE PRINT USING "###"; 0: END IF
  1323.  
  1324.       LOCATE yPos - 5, xPos + 9
  1325.       IF highlightedOption = 6 THEN
  1326.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Hours"
  1327.       COLOR 14, 1: LOCATE yPos - 2, xPos + 11: IF Hours1 - 1 >= 0 THEN
  1328.       PRINT S$(Hours1 - 1): ELSE PRINT "23": END IF
  1329.       LOCATE yPos, xPos + 11: COLOR 10, 0: PRINT S$(Hours1)
  1330.       LOCATE yPos + 2, xPos + 11: COLOR 14, 1: IF Hours1 + 1 <= 23 THEN
  1331.       PRINT S$(Hours1 + 1): ELSE PRINT "0": END IF
  1332.  
  1333.       LOCATE yPos - 5, xPos + 18
  1334.       IF highlightedOption = 7 THEN
  1335.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Minutes"
  1336.       COLOR 14, 1: LOCATE yPos - 2, xPos + 20: IF Minutes1 - 1 >= 0 THEN
  1337.       PRINT S$(Minutes1 - 1): ELSE PRINT "59": END IF
  1338.       LOCATE yPos, xPos + 20: COLOR 10, 0: PRINT S$(Minutes1)
  1339.       LOCATE yPos + 2, xPos + 20: COLOR 14, 1: IF Minutes1 + 1 < 60 THEN
  1340.       PRINT S$(Minutes1 + 1): ELSE PRINT "0": END IF
  1341.  
  1342.       LOCATE yPos - 5, xPos + 29
  1343.       IF highlightedOption = 8 THEN
  1344.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Seconds"
  1345.       COLOR 14, 1: LOCATE yPos - 2, xPos + 32: IF Seconds1 - 1 >= 0 THEN
  1346.       PRINT S$(Seconds1 - 1): ELSE PRINT "59": END IF
  1347.       LOCATE yPos, xPos + 32: COLOR 10, 0: PRINT S$(Seconds1)
  1348.       LOCATE yPos + 2, xPos + 32: COLOR 14, 1: IF Seconds1 + 1 <= 59 THEN
  1349.       PRINT S$(Seconds1 + 1): ELSE PRINT "0": END IF
  1350.  
  1351.       a$ = "": a$ = ElapsedTimeWrittenOut$(MakeElapsedTimeShort$(Years1, Days1, Hours1, Minutes1, Seconds1))
  1352.       LOCATE yPos + 12, Center(a$): PRINT a$
  1353.  
  1354.       haltAndDisplay = FALSE
  1355.     END IF
  1356.  
  1357.     SomeKey% = _KEYHIT
  1358.     IF SomeKey% = UpKeyHit% OR SomeKey% = DownKeyHit% THEN
  1359.       IF TimerStarted% = FALSE% THEN
  1360.         FirstTime% = TIMER
  1361.         TimerStarted% = TRUE%
  1362.       END IF
  1363.     END IF
  1364.     IF SomeKey% < 0 THEN
  1365.       FirstTime% = 0
  1366.       Increment% = 1
  1367.       TimeElapsed% = 0
  1368.       TimerStarted% = FALSE%
  1369.     END IF
  1370.     TimeElapsed% = ABS(TIMER - FirstTime%)
  1371.     IF TimeElapsed% = 2 THEN
  1372.       IF highlightedOption = 4 THEN Increment% = 5
  1373.       IF highlightedOption = 5 THEN Increment% = 3
  1374.       IF highlightedOption = 7 THEN Increment% = 2
  1375.       IF highlightedOption = 8 THEN incrment% = 2
  1376.     ELSEIF TimeElapsed% = 3 THEN
  1377.       IF highlightedOption = 4 THEN Increment% = 15
  1378.       IF highlightedOption = 5 THEN Increment% = 10
  1379.       IF highlightedOption = 7 THEN Increment% = 5
  1380.       IF highlightedOption = 8 THEN Increment% = 5
  1381.     ELSEIF TimeElapsed% = 4 THEN
  1382.       IF highlightedOption = 4 THEN Increment% = 40
  1383.       IF highlightedOption = 5 THEN Increment% = 15
  1384.     ELSEIF TimeElapsed% = 5 THEN Increment% = 70
  1385.     END IF
  1386.  
  1387.     SELECT CASE userCommand$
  1388.       CASE UpArrowKey$
  1389.         IF highlightedOption = 4 THEN
  1390.           Years1 = Years1 - Increment%
  1391.           IF Years1 <= -1 THEN Years1 = 9999
  1392.         ELSEIF highlightedOption = 5 THEN
  1393.           Days1 = Days1 - Increment%
  1394.           IF Days1 <= -1 THEN Days1 = 364
  1395.         ELSEIF highlightedOption = 6 THEN
  1396.           Hours1 = Hours1 - 1
  1397.           IF Hours1 = -1 THEN Hours1 = 23
  1398.         ELSEIF highlightedOption = 7 THEN
  1399.           Minutes1 = Minutes1 - Increment%
  1400.           IF Minutes1 <= -1 THEN Minutes1 = 59
  1401.         ELSEIF highlightedOption = 8 THEN
  1402.           Seconds1 = Seconds1 - Increment%
  1403.           IF Seconds1 <= -1 THEN Seconds1 = 59
  1404.         END IF
  1405.         haltAndDisplay = TRUE
  1406.       CASE DownArrowKey$
  1407.         IF highlightedOption = 4 THEN
  1408.           Years1 = Years1 + Increment%
  1409.           IF Years1 >= 10000 THEN Years1 = 0
  1410.         ELSEIF highlightedOption = 5 THEN
  1411.           Days1 = Days1 + Increment%
  1412.           IF Days1 >= 365 THEN Days1 = 0
  1413.         ELSEIF highlightedOption = 6 THEN
  1414.           Hours1 = Hours1 + 1
  1415.           IF Hours1 = 24 THEN Hours1 = 0
  1416.         ELSEIF highlightedOption = 7 THEN
  1417.           Minutes1 = Minutes1 + Increment%
  1418.           IF Minutes1 >= 60 THEN Minutes1 = 0
  1419.         ELSEIF highlightedOption = 8 THEN
  1420.           Seconds1 = Seconds1 + Increment%
  1421.           IF Seconds1 >= 60 THEN Seconds1 = 0
  1422.         END IF
  1423.         haltAndDisplay = TRUE
  1424.       CASE RightArrowKey$
  1425.         highlightedOption = highlightedOption + 1
  1426.         IF highlightedOption > maxOption THEN highlightedOption = minOption
  1427.         haltAndDisplay = TRUE
  1428.       CASE LeftArrowKey$
  1429.         highlightedOption = highlightedOption - 1
  1430.         IF highlightedOption < minOption THEN highlightedOption = maxOption
  1431.         haltAndDisplay = TRUE
  1432.       CASE CHR$(13), CHR$(32)
  1433.         Rtn$ = MakeElapsedTimeShort$(Years1, Days1, Hours1, Minutes1, Seconds1)
  1434.       CASE CHR$(27)
  1435.         montH = 1: daY = 1: year = 2022
  1436.         Years1 = 0: Days1 = 0: Hours1 = 0: Minutes1 = 0: Seconds1 = 0
  1437.         Years2 = 0: Days2 = 0: Hours2 = 0: Minutes2 = 0: Seconds2 = 0
  1438.         haltAndDisplay = TRUE
  1439.       CASE "X", "x"
  1440.         SYSTEM
  1441.     END SELECT
  1442.   LOOP UNTIL userCommand$ = CHR$(13) OR userCommand$ = CHR$(32)
  1443.  
  1444.   GetElapsedTime$ = Rtn$
  1445.  
  1446.  
  1447.  
  1448. FUNCTION MonthOrDayFromDaysPassedJan% (Days27%, Month1Day2%, Year27%)
  1449.   MODFDPJRtn% = 0: Month27% = 0: Leap% = 0
  1450.  
  1451.   IF Year27% MOD 4 = 0 THEN
  1452.   Leap% = 1: ELSE Leap% = 0: END IF
  1453.   SELECT CASE Days27%
  1454.     CASE 1 TO 31 'January
  1455.       Month27% = 1
  1456.       Days27% = Days27%
  1457.     CASE 32 TO 59 + Leap% 'February
  1458.       Month27% = 2
  1459.       Days27% = Days27% - 31
  1460.     CASE 60 + Leap% TO 90 + Leap% 'March
  1461.       Month27% = 3
  1462.       Days27% = Days27% - 59 - Leap%
  1463.     CASE 91 + Leap% TO 120 + Leap% 'april
  1464.       Month27% = 4
  1465.       Days27% = Days27% - 90 - Leap%
  1466.     CASE 121 + Leap% TO 151 + Leap% 'may
  1467.       Month27% = 5
  1468.       Days27% = Days27% - 120 - Leap%
  1469.     CASE 152 + Leap% TO 181 + Leap%
  1470.       Month27% = 6
  1471.       Days27% = Days27% - 150 - Leap%
  1472.     CASE 182 + Leap% TO 212 + Leap%
  1473.       Month27% = 7
  1474.       Days27% = Days27% - 180 - Leap%
  1475.     CASE 213 + Leap% TO 243 + Leap%
  1476.       Month27% = 8
  1477.       Days27% = Days27% - 212 - Leap%
  1478.     CASE 244 + Leap% TO 273 + Leap%
  1479.       Month27% = 9
  1480.       Days27% = Days27% - 243 - Leap%
  1481.     CASE 274 + Leap% TO 304 + Leap%
  1482.       Month27% = 10
  1483.       Days27% = Days27% - 273 - Leap%
  1484.     CASE 305 + Leap% TO 334 + Leap%
  1485.       Month27% = 11
  1486.       Days27% = Days27% - 304 - Leap%
  1487.     CASE 335 + Leap% TO 365 + Leap%
  1488.       Month27% = 12
  1489.       Days27% = Days27% - 334 - Leap%
  1490.   IF Month1Day2% = 1 THEN
  1491.     MODFDPJRtn% = Month27%
  1492.   ELSEIF Month1Day2% = 2 THEN
  1493.     MODFDPJRtn% = Days27%
  1494.   END IF
  1495.   MonthOrDayFromDaysPassedJan = MODFDPJRtn%
  1496.  
  1497. FUNCTION MonthWord$ (Month10%)
  1498.   MWRtn$ = ""
  1499.  
  1500.   SELECT CASE Month10%
  1501.     CASE 0 ' for the top value of the dial
  1502.       MWRtn$ = "December"
  1503.     CASE 1
  1504.       MWRtn$ = "January"
  1505.     CASE 2
  1506.       MWRtn$ = "February"
  1507.     CASE 3
  1508.       MWRtn$ = "March"
  1509.     CASE 4
  1510.       MWRtn$ = "April"
  1511.     CASE 5
  1512.       MWRtn$ = "May"
  1513.     CASE 6
  1514.       MWRtn$ = "June"
  1515.     CASE 7
  1516.       MWRtn$ = "July"
  1517.     CASE 8
  1518.       MWRtn$ = "August"
  1519.     CASE 9
  1520.       MWRtn$ = "September"
  1521.     CASE 10
  1522.       MWRtn$ = "October"
  1523.     CASE 11
  1524.       MWRtn$ = "November"
  1525.     CASE 12
  1526.       MWRtn$ = "December"
  1527.     CASE 13 'for the bottom value of the dial
  1528.       MWRtn$ = "January"
  1529.   MonthWord$ = MWRtn$
  1530.  
  1531. FUNCTION Suffix$ (DaySuffix%)
  1532.   SRtn$ = ""
  1533.   IF DaySuffix% = 1 OR DaySuffix% = 21 OR DaySuffix% = 31 THEN
  1534.     SRtn$ = "st"
  1535.   ELSEIF DaySuffix% = 2 OR DaySuffix% = 22 THEN SRtn$ = "nd"
  1536.   ELSEIF DaySuffix% = 3 OR DaySuffix% = 23 THEN SRtn$ = "rd"
  1537.   ELSE SRtn$ = "th": END IF
  1538.   Suffix$ = SRtn$
  1539.  
  1540. FUNCTION WrittenDate1Clock2Time3$ (AllFive$, Which%)
  1541.   WD1C2T3Rtn$ = "": Years8% = 0: Days8% = 0: Hours8% = 0: Minutes8% = 0: Seconds8% = 0: Month8% = 0
  1542.   AmPm8$ = "": LftNum8% = 0: RtNum8% = 0: LpYr% = 0
  1543.  
  1544.   Years8% = VAL(MID$(AllFive$, 1, 4))
  1545.   Days8% = VAL(MID$(AllFive$, 6, 3))
  1546.   Hours8% = VAL(MID$(AllFive$, 10, 2))
  1547.   Minutes8% = VAL(MID$(AllFive$, 13, 2))
  1548.   Seconds8% = VAL(MID$(AllFive$, 16, 2))
  1549.   SELECT CASE Which%
  1550.     CASE 1
  1551.       Month8% = MonthOrDayFromDaysPassedJan(Days8% - LpYr%, 1, Years8%)
  1552.       Days8% = MonthOrDayFromDaysPassedJan(Days8% - LpYr%, 2, Years8%)
  1553.       WD1C2T3Rtn$ = MonthWord$(Month8%)
  1554.       WD1C2T3Rtn$ = WD1C2T3Rtn$ + " " + S$(Days8%)
  1555.       WD1C2T3Rtn$ = WD1C2T3Rtn$ + Suffix$(Days8%) + ", " + S$(Years8%)
  1556.     CASE 2
  1557.       IF Hours8% = 0 THEN
  1558.         WD1C2T3Rtn$ = "12"
  1559.         AmPm8$ = "AM"
  1560.       ELSEIF Hours8% > 0 AND Hours8% < 12 THEN
  1561.         WD1C2T3Rtn$ = S$(Hours8%)
  1562.         AmPm8$ = "AM"
  1563.       ELSEIF Hours% = 12 THEN
  1564.         WD1C2T3Rtn$ = "12"
  1565.         AmPm8$ = "PM"
  1566.       ELSEIF Hours8% > 12 AND Hours8% < 24 THEN
  1567.         WD1C2T3Rtn$ = S$(Hours8% - 12)
  1568.         AmPm8$ = "PM"
  1569.       END IF
  1570.       WD1C2T3Rtn$ = WD1C2T3Rtn$ + ":" + S$(Minutes8%) + " " + AmPm8$ + " and " + S$(Seconds8%)
  1571.       IF Seconds8% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1572.     CASE 3
  1573.       IF Years8% <> 0 THEN
  1574.         IF Years8% >= 1000 AND Years8% <= 9999 THEN
  1575.           LftNum8% = INT(Years8% / 1000)
  1576.           WD1C2T3Rtn$ = S$(LftNum8%) + ","
  1577.           RtNum8% = Years8% - (LftNum8% * 1000)
  1578.           IF RtNum8% < 10 THEN
  1579.             WD1C2T3Rtn$ = WD1C2T3Rtn$ + "00"
  1580.           ELSEIF RtNum8% >= 10 AND RtNum8% < 100 THEN
  1581.             WD1C2T3Rtn$ = WD1C2T3Rtn$ + "0"
  1582.           END IF
  1583.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + S$(RtNum8%)
  1584.         ELSE
  1585.           WD1C2T3Rtn$ = S$(Years8%)
  1586.         END IF
  1587.         WD1C2T3Rtn$ = WD1C2T3Rtn$ + " Year"
  1588.         IF Years% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1589.         IF Days8% <> 0 AND (Hours3% <> 0 OR Minutes8% <> 0 OR Seconds8% <> 0) THEN
  1590.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1591.         ELSEIF Days8% <> 0 AND (Hours8% = 0 AND Minutes8% = 0 AND Seconds8% = 0) THEN
  1592.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1593.         ELSEIF Hours8% <> 0 AND (Minutes8% <> 0 OR Seconds8% <> 0) THEN
  1594.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1595.         ELSEIF Hours8% <> 0 AND Minutes8% = 0 AND Seconds8% = 0 THEN
  1596.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1597.         ELSEIF Minutes8% <> 0 AND Seconds8% <> 0 THEN
  1598.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1599.         ELSEIF Minutes8% <> 0 XOR Seconds8% <> 0 THEN
  1600.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1601.         END IF
  1602.       END IF
  1603.       IF Days8% <> 0 THEN
  1604.         WD1C2T3Rtn$ = WD1C2T3Rtn$ + S$(Days8%) + " Day"
  1605.         IF Days8% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1606.         IF Hours8% <> 0 AND (Minutes8% <> 0 OR Seconds8% <> 0) THEN
  1607.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1608.         ELSEIF Hours8% <> 0 AND Minutes8% = 0 AND Seconds8% = 0 THEN
  1609.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1610.         ELSEIF Minutes8% <> 0 AND Seconds8% <> 0 THEN
  1611.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1612.         ELSEIF Minutes8% <> 0 XOR Seconds8% <> 0 THEN
  1613.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1614.         END IF
  1615.       END IF
  1616.       IF Hours8% <> 0 THEN
  1617.         WD1C2T3Rtn$ = WD1C2T3Rtn$ + S$(Hours8%) + " hour"
  1618.         IF Hours8% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1619.         IF Minutes8% <> 0 AND Seconds8% <> 0 THEN
  1620.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + ", "
  1621.         ELSEIF Minutes8% <> 0 XOR Seconds8% <> 0 THEN
  1622.           WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1623.         END IF
  1624.       END IF
  1625.       IF Minutes8% <> 0 THEN
  1626.         WD1C2T3Rtn$ = WD1C2T3Rtn$ + S$(Minutes8%) + " minute"
  1627.         IF Minutes8% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1628.         IF Seconds8% <> 0 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + " and "
  1629.       END IF
  1630.       IF Seconds8% <> 0 THEN
  1631.         WD1C2T3Rtn$ = WD1C2T3Rtn$ + S$(Seconds8%) + " second"
  1632.         IF Seconds8% <> 1 THEN WD1C2T3Rtn$ = WD1C2T3Rtn$ + "s"
  1633.       END IF
  1634.       IF Years8% = 0 AND Days8% = 0 AND Hours8% = 0 AND Minutes8% = 0 AND Seconds8% = 0 THEN WD1C2T3Rtn$ = "Nothing"
  1635.   WrittenDate1Clock2Time3$ = WD1C2T3Rtn$
  1636.  
  1637.  
  1638. SUB Menu
  1639.   HaltAndDisplay% = 0: HighlightedOption% = 0: yPos% = 0: UserCommand$ = "": A$ = ""
  1640.   xPos% = 0: MaxOption% = 0: SelectedAnOption% = 0
  1641.  
  1642.   HaltAndDisplay% = TRUE%: HighlightedOption% = 1: yPos% = 13: MaxOption% = 7: SelectedAnOption% = FALSE%
  1643.   HighlightedOption% = 1
  1644.   HaltAndDisplay% = TRUE%
  1645.   yPos = 14
  1646.   DO
  1647.     UserCommand$ = INKEY$
  1648.     IF HaltAndDisplay% = TRUE% THEN
  1649.       COLOR 14, 1: CLS
  1650.       A$ = "Time Calculator Menu": xPos% = Center(A$)
  1651.       LOCATE yPos%, Center(A$): PRINT A$: LOCATE yPos% + 1, Center(A$)
  1652.       PRINT "---- ---------- ----"
  1653.  
  1654.       A$ = "": A$ = "1.) Find How Long From Now"
  1655.       LOCATE yPos% + 3, Center(A$): IF HighlightedOption% = 1 THEN
  1656.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1657.       A$ = "": A$ = "Until A Selected Time"
  1658.       LOCATE yPos% + 4, Center(A$): IF HighlightedOption% = 1 THEN
  1659.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1660.  
  1661.       A$ = "": A$ = "2.) Find How Long It Has Been Since"
  1662.       LOCATE yPos% + 6, Center(A$): IF HighlightedOption% = 2 THEN
  1663.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1664.       A$ = "": A$ = "A Selected Time Has Passed"
  1665.       LOCATE yPos% + 7, Center(A$): IF HighlightedOption% = 2 THEN
  1666.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1667.  
  1668.       A$ = "": A$ = "3.) Find The Date And Time It Will Be After"
  1669.       LOCATE yPos% + 9, Center(A$): IF HighlightedOption% = 3 THEN
  1670.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1671.       A$ = "": A$ = "A Selected Amount Of Time Has Passed"
  1672.       LOCATE yPos% + 10, Center(A$): IF HighlightedOption% = 3 THEN
  1673.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1674.  
  1675.       A$ = "": A$ = "4.) Add Two Elapsed Times"
  1676.       LOCATE yPos% + 12, Center(A$): IF HighlightedOption% = 4 THEN
  1677.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1678.  
  1679.       A$ = "": A$ = "5.) Subtract One Elapsed Time From Another One"
  1680.       LOCATE yPos% + 14, Center(A$): IF HighlightedOption% = 5 THEN
  1681.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1682.  
  1683.       A$ = "": A$ = "6.) Multiply An Elapsed Time By A Constant"
  1684.       LOCATE yPos% + 16, Center(A$): IF HighlightedOption% = 6 THEN
  1685.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1686.  
  1687.       A$ = "": A$ = "7.) Exit"
  1688.       LOCATE 45, Center(A$): IF HighlightedOption% = MaxOption% THEN
  1689.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  1690.  
  1691.       HaltAndDisplay% = FALSE%
  1692.     END IF
  1693.  
  1694.     SELECT CASE UserCommand$
  1695.       CASE UpArrowKey$, LeftArrowKey$
  1696.         HighlightedOption% = HighlightedOption% - 1
  1697.         IF HighlightedOption% = 0 THEN HighlightedOption% = MaxOption%
  1698.         HaltAndDisplay% = TRUE%
  1699.       CASE DownArrowKey$, RightArrowKey$
  1700.         HighlightedOption% = HighlightedOption% + 1
  1701.         IF HighlightedOption% > MaxOption% THEN HighlightedOption% = 1
  1702.         HaltAndDisplay% = TRUE%
  1703.       CASE CHR$(13)
  1704.         SelectedAnOption% = TRUE%
  1705.       CASE "1", "2", "3", "4", "5", "6"
  1706.         HighlightedOption% = VAL(UserCommand$)
  1707.         SelectedAnOption% = TRUE%
  1708.     END SELECT
  1709.     IF SelectedAnOption% = TRUE THEN
  1710.       SELECT CASE HighlightedOption%
  1711.         CASE 1
  1712.           CALL FromNowUntil
  1713.           SelectedAnOption% = FALSE%
  1714.           HaltAndDisplay% = TRUE%
  1715.         CASE 2
  1716.           CALL HowLongSince
  1717.           SelectedAnOption% = FALSE%
  1718.           HaltAndDisplay% = TRUE%
  1719.         CASE 3
  1720.           CALL WhatDateAfterElapsedTime
  1721.           SelectedAnOption% = FALSE%
  1722.           HaltAndDisplay% = TRUE%
  1723.         CASE 4
  1724.           CALL AddElapsedTimes
  1725.           SelectedAnOption% = FALSE%
  1726.           HaltAndDisplay% = TRUE%
  1727.         CASE 5
  1728.           CALL SubtractElapsedTimes
  1729.           SelectedAnOption% = FALSE%
  1730.           HaltAndDisplay% = TRUE%
  1731.         CASE 6
  1732.           CALL Multiply
  1733.           SelectedAnOption% = FALSE%
  1734.           HaltAndDisplay% = TRUE%
  1735.       END SELECT
  1736.  
  1737.     END IF
  1738.   LOOP UNTIL UserCommand$ = CHR$(27) OR UserCommand$ = S$(MaxOption%)
  1739.  
  1740.  
  1741. FUNCTION Center% (Text$): Center% = INT((80 - LEN(Text$)) / 2): END FUNCTION
  1742. FUNCTION S$ (Number!): S$ = LTRIM$(STR$(Number!)): END FUNCTION
  1743.   pause$ = INPUT$(1): IF pause$ = CHR$(27) THEN END
  1744. P$ = pause$: END FUNCTION
  1745.  

2
QB64 Discussion / Highlight% changes by itself
« on: April 11, 2022, 01:34:56 pm »
I often make a DO LOOP with an INKEY$ to access the string values of the arrow keys. Out of probably 25 times writing a loop similar to this one, this is the second time I could not use my HaltAndDisplay% bool to stop the flicker.
On line 56, the Highlight% rapidly changes between positive and negative integers of about 3 to 5 digits. From what I can see in the code I've written, Highlight% shouldn't change until
one of the SHARED ArrowKey$ Values has been detected. I'd be grateful to anyone who can't point out my error
Code: QB64: [Select]
  1.  
  2. _TITLE "Time Calculator"
  3.  
  4. CONST TRUE% = 1
  5. CONST FALSE% = -1
  6. DIM SHARED LeftArrowKey$: LeftArrowKey$ = CHR$(0) + "K"
  7. DIM SHARED RightArroeKey$: rightArrowKey$ = CHR$(0) + "M"
  8. DIM SHARED UpArrowKey$: UpArrowKey$ = CHR$(0) + "H"
  9. DIM SHARED DownArrowKey$: DownArrowKey$ = CHR$(0) + "P"
  10. CONST UpArrowHit% = 18432
  11. CONST LeftArrowHit% = 19200
  12. CONST RightArrowHit% = 19712
  13. CONST DownArrowHit% = 20480
  14. ' for the highlighted option in the GetTimeAmount SUB
  15. CONST YearsHO% = 1
  16. CONST DaysHO% = 2
  17. CONST HoursHO% = 3
  18. CONST MinutesHO% = 4
  19. CONST SecondsHO% = 5
  20.  
  21. WIDTH 80, 50
  22. COLOR 14, 1: CLS
  23.  
  24. CALL Menu
  25.  
  26. SUB FromNowUntil
  27.  
  28. SUB HowLongSince
  29.  
  30. SUB WhatDateAfterElapsedTime
  31.  
  32. SUB AddElapsedTimes
  33.  
  34. SUB SubtractElapsedTimes
  35.  
  36. SUB Multiply
  37.  
  38. SUB Divide
  39.  
  40.  
  41. SUB Menu
  42.   HaltAndDisplay% = 0: Highlight% = 0: yPos% = 0: UserCommand$ = "": A$ = ""
  43.   xPos% = 0: MaxOption% = 0: SelectedAnOption% = 0
  44.  
  45.   HaltAndDisplay% = TRUE%: Highlight% = 1: yPos% = 13: MaxOption% = 8: SelectedAnOption% = FALSE%
  46.   DO
  47.     UserCommand$ = INKEY$
  48.     LOCATE 45, 1: PRINT S$(Highlight%)
  49.     LOCATE 46, 1: PRINT "|" + UserCommand$ + "|"
  50.     IF HaltAndDisplay% = TRUE% THEN
  51.       COLOR 14, 1: CLS
  52.       A$ = "Time Calculator Menu": xPos% = Center(A$)
  53.       LOCATE yPos%, Center(A$): PRINT A$: LOCATE yPos% + 1, Center(A$)
  54.       PRINT "---- ---------- ----"
  55.  
  56.       A$ = "": A$ = "1.) Find How Long From Now"
  57.       LOCATE yPos% + 3, Center(A$): IF Highlight% = 1 THEN
  58.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  59.       A$ = "": A$ = "Until A Selected Time"
  60.       LOCATE yPos% + 4, Center(A$): IF Highlight% = 1 THEN
  61.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  62.  
  63.       A$ = "": A$ = "2.) Find How Long It Has Been Since"
  64.       LOCATE yPos% + 6, Center(A$): IF highlighedoption% = 2 THEN
  65.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  66.       A$ = "": A$ = "A Selected Time Has Passed"
  67.       LOCATE yPos% + 7, Center(A$): IF Highlight% = 2 THEN
  68.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  69.  
  70.       A$ = "": A$ = "3.) Find The Date And Time It Will Be After"
  71.       LOCATE yPos% + 9, Center(A$): IF Highlight% = 3 THEN
  72.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  73.       A$ = "": A$ = "A Selected Amount Of Time Has Passed"
  74.       LOCATE yPos% + 10, Center(A$): IF Highlight% = 3 THEN
  75.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  76.  
  77.       A$ = "": A$ = "4.) Add Two Elapsed Times"
  78.       LOCATE yPos% + 12, Center(A$): IF Highlight% = 4 THEN
  79.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  80.  
  81.       A$ = "": A$ = "5.) Subtract One Elapsed Time From Another One"
  82.       LOCATE yPos% + 14, Center(A$): IF Highlight% = 5 THEN
  83.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  84.  
  85.       A$ = "": A$ = "6.) Multiply An Elapsed Time By A Constant"
  86.       LOCATE yPos% + 16, Center(A$): IF Highlight% = 6 THEN
  87.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  88.  
  89.       A$ = "": A$ = "7.) Divide An Elapsed Time By A Constant"
  90.       LOCATE yPos% + 18, Center(A$): IF Highlight% = 7 THEN
  91.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  92.  
  93.       A$ = "": A$ = "8.) Exit"
  94.       LOCATE 45, Center(A$): IF Highlight% = 8 THEN
  95.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT A$
  96.  
  97.       HaltAndDisplay% = FALSE%
  98.     END IF
  99.  
  100.     SELECT CASE UserCommand$
  101.       CASE UpArrowKey$, LeftArrowKey$
  102.         Highlight% = highlightedoption - 1
  103.         IF Highlight% = 0 THEN Highlight% = MaxOption%
  104.         HaltAndDisplay% = TRUE%
  105.       CASE DownArrowKey$, rightarrowkey$
  106.         Highlight% = Highlight% + 1
  107.         IF highlightedoption > maxoption THEN Highlight% = 1
  108.         HaltAndDisplay% = TRUE%
  109.       CASE CHR$(13)
  110.         SelectedAnOption% = TRUE%
  111.       CASE "1", "2", "3", "4", "5", "6", "7"
  112.         Highlight% = VAL(UserCommand$)
  113.         SelectedAnOption% = TRUE%
  114.     END SELECT
  115.     IF SelectedAnOption% = TRUE THEN
  116.       SELECT CASE Highlight%
  117.         CASE 1
  118.           CALL FromNowUntil: SelectedAnOption% = FALSE%
  119.         CASE 2
  120.           CALL HowLongSince: SelectedAnOption% = FALSE%
  121.         CASE 3
  122.           CALL WhatDateAfterElapsedTime: SelectedAnOption% = FALSE%
  123.         CASE 4
  124.           CALL AddElapsedTimes: SelectedAnOption% = FALSE%
  125.         CASE 5
  126.           CALL SubtractElapsedTimes: SelectedAnOption% = FALSE%
  127.         CASE 6
  128.           CALL Multiply: SelectedAnOption% = FALSE%
  129.         CASE 7
  130.           CALL Divide: SelectedAnOption% = FALSE%
  131.       END SELECT
  132.     END IF
  133.   LOOP UNTIL UserCommand$ = CHR$(27) OR UserCommand$ = S$(MaxOption%)
  134.  
  135.  
  136.  
  137.  
  138.  
  139. FUNCTION Center% (Text$): Center% = INT((80 - LEN(Text$)) / 2): END FUNCTION
  140. FUNCTION S$ (Number!): S$ = LTRIM$(STR$(Number!)): END FUNCTION
  141. FUNCTION P$: pause$ = INPUT$(1): IF pause$ = CHR$(27) THEN END
  142. P$ = pause$: END FUNCTION
  143.  

3
QB64 Discussion / Fickle Increment variable
« on: April 05, 2022, 01:07:22 pm »
I have a variable from 0 to 9,999. You change it by some increment with the up and down arrow keys. I'm using INKEY$ with a SELECT CASE to check when the arrow keys are hit. I tried using _KEYDOWN for that but the values changed very fast and I got a rather strange error. Instead I'm using the _KEYDOWN to detect how long the key has been down and change the increment accordingly. This method isn't working to well. Sometime the increment changes, sometimes it does not. Any suggestions?
Code: QB64: [Select]
  1. FUNCTION GetOneTimeAmount$ (title$)
  2.   DIM minOption, maxOption, haltAndDisplay, xPos, yPos, highlightedOption AS INTEGER
  3.   DIM years1, days1, hours1, minutes1, seconds1, keyWasPressed, timerStarted AS INTEGER
  4.   DIM isLessThan, notZero AS INTEGER
  5.  
  6.   differentTime1:
  7.  
  8.   highlightedOption = 4: haltAndDisplay = TRUE: keyWasPressed = FALSE
  9.   isLessThan = FALSE: notZero = TRUE: Increment = 1
  10.   minOption = 4: maxOption = 8
  11.   DO
  12.     userCommand$ = INKEY$
  13.     IF haltAndDisplay = TRUE THEN
  14.  
  15.       COLOR 14, 1: CLS: yPos = 25: xPos = 15
  16.       a$ = title$: LOCATE 5, Center(a$): PRINT a$
  17.  
  18.       LOCATE yPos, xPos - 3
  19.       IF highlightedOption >= 4 AND highlightedOption <= 8 THEN
  20.       COLOR 10, 0: ELSE COLOR 14, 1: END IF
  21.       PRINT "Time:"
  22.       xPos = xPos + 18
  23.  
  24.       LOCATE yPos - 5, xPos - 10
  25.       IF highlightedOption = 4 THEN
  26.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Years"
  27.       LOCATE yPos - 2, xPos - 10: COLOR 14, 1:
  28.       IF years1 - 1 >= 0 THEN
  29.       PRINT USING "#,###"; (years1 - 1): ELSE PRINT "9,999": END IF
  30.       LOCATE yPos: COLOR 10, 0: IF years1 >= 0 AND years1 < 10 THEN
  31.         LOCATE , xPos - 6: PRINT S$(years1)
  32.       ELSEIF years1 >= 10 AND years1 < 100 THEN LOCATE , xPos - 7: PRINT S$(years1)
  33.       ELSEIF years1 >= 100 AND years1 < 1000 THEN LOCATE , xPos - 8: PRINT S$(years1)
  34.       ELSEIF years1 >= 1000 AND years1 < 10000 THEN LOCATE , xPos - 10: PRINT USING "#,###"; years1
  35.       ELSE PRINT "I hope I don't see this error": END IF
  36.       LOCATE yPos + 2, xPos - 10: COLOR 14, 1: IF years1 + 1 < 10000 THEN
  37.       PRINT USING "#,###"; years1 + 1: ELSE PRINT USING "#,###"; 0: END IF
  38.  
  39.       LOCATE yPos - 5, xPos
  40.       IF highlightedOption = 5 THEN
  41.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Days"
  42.       COLOR 14, 1: LOCATE yPos - 2, xPos: IF days1 - 1 = -1 THEN
  43.       PRINT "365": ELSE PRINT USING "###"; days1 - 1: END IF
  44.       COLOR 10, 0: LOCATE yPos ', ' xPos + 9:
  45.       IF days1 >= 0 AND days1 < 10 THEN
  46.         LOCATE , xPos + 2: PRINT S$(days1)
  47.       ELSEIF days1 >= 10 AND days1 < 100 THEN LOCATE , xPos + 1: PRINT S$(days1)
  48.       ELSEIF days1 >= 100 AND days1 <= 365 THEN LOCATE , xPos + 0: PRINT S$(days1)
  49.       END IF
  50.       COLOR 14, 1: LOCATE yPos + 2, xPos + 0: PRINT USING "###"; days1 + 1 ': IF days1 + 1 >= 0 AND days1 + 1 < 10 THEN
  51.  
  52.       LOCATE yPos - 5, xPos + 9
  53.       IF highlightedOption = 6 THEN
  54.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Hours"
  55.       COLOR 14, 1: LOCATE yPos - 2, xPos + 11: IF hours1 - 1 >= 0 THEN
  56.       PRINT S$(hours1 - 1): ELSE PRINT "23": END IF
  57.       LOCATE yPos, xPos + 11: COLOR 10, 0: PRINT S$(hours1)
  58.       LOCATE yPos + 2, xPos + 11: COLOR 14, 1: IF hours1 + 1 <= 23 THEN
  59.       PRINT S$(hours1 + 1): ELSE PRINT "0": END IF
  60.  
  61.       LOCATE yPos - 5, xPos + 18
  62.       IF highlightedOption = 7 THEN
  63.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Minutes"
  64.       COLOR 14, 1: LOCATE yPos - 2, xPos + 20: IF minutes1 - 1 >= 0 THEN
  65.       PRINT S$(minutes1 - 1): ELSE PRINT "59": END IF
  66.       LOCATE yPos, xPos + 20: COLOR 10, 0: PRINT S$(minutes1)
  67.       LOCATE yPos + 2, xPos + 20: COLOR 14, 1: IF minutes1 + 1 < 60 THEN
  68.       PRINT S$(minutes1 + 1): ELSE PRINT "0": END IF
  69.  
  70.       LOCATE yPos - 5, xPos + 29
  71.       IF highlightedOption = 8 THEN
  72.       COLOR 10, 0: ELSE COLOR 14, 1: END IF: PRINT "Seconds"
  73.       COLOR 14, 1: LOCATE yPos - 2, xPos + 32: IF seconds1 - 1 >= 0 THEN
  74.       PRINT S$(seconds1 - 1): ELSE PRINT "59": END IF
  75.       LOCATE yPos, xPos + 32: COLOR 10, 0: PRINT S$(seconds1)
  76.       LOCATE yPos + 2, xPos + 32: COLOR 14, 1: IF seconds1 + 1 <= 59 THEN
  77.       PRINT S$(seconds1 + 1): ELSE PRINT "0": END IF
  78.  
  79.       b1$ = "YYYY DDD HH MM SS"
  80.       a1$ = ""
  81.       IF years1 = 0 THEN
  82.         a1$ = "0000"
  83.       ELSEIF years1 > 0 AND years1 < 10 THEN
  84.         a1$ = "000" + S$(years1)
  85.       ELSEIF years1 >= 10 AND years1 < 100 THEN
  86.         a1$ = "00" + S$(years1)
  87.       ELSEIF years1 >= 100 AND years1 < 1000 THEN
  88.         a1$ = a1$ + "0" + S$(years1)
  89.       ELSEIF years1 >= 1000 AND years1 < 10000 THEN
  90.         a1$ = a1$ + S$(years1)
  91.       END IF
  92.       a1$ = a1$ + ":"
  93.       IF days1 = 0 THEN
  94.         a1$ = a1$ + "000"
  95.       ELSEIF days1 > 0 AND days1 < 10 THEN
  96.         a1$ = a1$ + "00" + S$(days1)
  97.       ELSEIF days1 >= 10 AND days1 < 100 THEN
  98.         a1$ = a1$ + "0" + S$(days1)
  99.       ELSE
  100.         a1$ = a1$ + S$(days1)
  101.       END IF
  102.       a1$ = a1$ + ":"
  103.       IF hours1 = 0 THEN
  104.         a1$ = a1$ + "00"
  105.       ELSEIF hours1 > 0 AND hours1 < 10 THEN
  106.         a1$ = a1$ + "0" + S$(hours1)
  107.       ELSE
  108.         a1$ = a1$ + S$(hours1)
  109.       END IF
  110.       a1$ = a1$ + ":"
  111.       IF minutes1 = 0 THEN
  112.         a1$ = a1$ + "00"
  113.       ELSEIF minutes1 > 0 AND minutes1 < 10 THEN
  114.         a1$ = a1$ + "0" + S$(minutes1)
  115.       ELSE
  116.         a1$ = a1$ + S$(minutes1)
  117.       END IF
  118.       a1$ = a1$ + ":"
  119.       IF seconds1 = 0 THEN
  120.         a1$ = a1$ + "00"
  121.       ELSEIF seconds1 > 0 AND seconds1 < 10 THEN
  122.         a1$ = a1$ + "0" + S$(seconds1)
  123.       ELSE
  124.         a1$ = a1$ + S$(seconds1)
  125.       END IF
  126.       haltAndDisplay = FALSE
  127.       '      LOCATE 48, 1: PRINT a1$
  128.     END IF
  129.  
  130.     IF _KEYDOWN(upKeydownCode) <> 0 OR _KEYDOWN(downKeydownCode) <> 0 THEN
  131.       IF keyWasPressed = FALSE THEN
  132.         timerStarted = TIMER
  133.         keyWasPressed = TRUE
  134.       END IF
  135.       IF INT(TIMER - timerStarted) = 2 THEN
  136.         Increment = 10
  137.       ELSEIF INT(TIMER - timerStarted) = 3 THEN Increment = 20
  138.       ELSEIF INT(TIMER - timerStarted) = 5 THEN Increment = 50
  139.       ELSEIF INT(TIMER - timerStarted) = 7 THEN Increment = 100
  140.       END IF
  141.     ELSE
  142.       keyWasPressed = FALSE
  143.       Increment = 1
  144.     END IF
  145.  
  146.     SELECT CASE userCommand$
  147.       CASE upArrowKey$
  148.         IF highlightedOption = 4 THEN
  149.           years1 = years1 - Increment
  150.           IF years1 <= -1 THEN years1 = 9999
  151.         ELSEIF highlightedOption = 5 THEN
  152.           days1 = days1 - Increment
  153.           IF days1 <= -1 THEN days1 = 365
  154.         ELSEIF highlightedOption = 6 THEN
  155.           hours1 = hours1 - Increment: IF hours1 <= -1 THEN hours1 = 23
  156.         ELSEIF highlightedOption = 7 THEN
  157.           minutes1 = minutes1 - Increment: IF minutes1 <= -1 THEN minutes1 = 59
  158.         ELSEIF highlightedOption = 8 THEN
  159.           seconds1 = seconds1 - Increment: IF seconds1 <= -1 THEN seconds1 = 59
  160.         END IF
  161.         haltAndDisplay = TRUE
  162.       CASE downArrowKey$
  163.         IF highlightedOption = 4 THEN
  164.           years1 = years1 + Increment
  165.           IF years1 >= 10000 THEN years1 = 0
  166.         ELSEIF highlightedOption = 5 THEN
  167.           days1 = days1 + Increment: IF days1 >= 366 THEN days1 = 0
  168.         ELSEIF highlightedOption = 6 THEN
  169.           hours1 = hours1 + Increment: IF hours1 >= 24 THEN hours1 = 0
  170.         ELSEIF highlightedOption = 7 THEN
  171.           minutes1 = minutes1 + Increment: IF minutes1 >= 60 THEN minutes1 = 0
  172.         ELSEIF highlightedOption = 8 THEN
  173.           seconds1 = seconds1 + Increment: IF seconds1 >= 60 THEN seconds1 = 0
  174.         END IF
  175.         haltAndDisplay = TRUE
  176.       CASE rightArrowKey$
  177.         highlightedOption = highlightedOption + 1
  178.         IF highlightedOption > maxOption THEN highlightedOption = minOption
  179.         haltAndDisplay = TRUE
  180.       CASE leftArrowKey$
  181.         highlightedOption = highlightedOption - 1
  182.         IF highlightedOption < minOption THEN highlightedOption = maxOption
  183.         haltAndDisplay = TRUE
  184.       CASE CHR$(13), CHR$(32)
  185.         notZero = TRUE
  186.         IF years1 = 0 AND days1 = 0 AND hours1 = 0 AND minutes1 = 0 AND seconds1 = 0 THEN
  187.           notZero = FALSE
  188.         END IF
  189.         '        isLessThan = FALSE
  190.         '        IF years1 < years2 THEN isLessThan = TRUE
  191.         '        IF years1 = years2 AND days1 < days2 THEN isLessThan = TRUE
  192.         '        IF days1 = days2 AND hours1 < hours2 THEN isLessThan = TRUE
  193.         '        IF days1 = days2 AND hours1 = hours2 AND minutes1 < minutes2 THEN isLessThan = TRUE
  194.         '        IF days1 = days2 AND hours1 = hours2 AND minutes1 = minutes2 AND seconds1 < seconds2 THEN isLessThan = TRUE
  195.         '        IF isLessThan = TRUE THEN
  196.         '          userCommand$ = ""
  197.         '          a$ = "Time 1 cannot be less than Time 2": LOCATE yPos - 8, Center(a$): COLOR 12, 0: PRINT a$
  198.         '          _DELAY (2.5)
  199.         '          a$ = "                                 ": LOCATE yPos - 8, Center(a$): COLOR 14, 1: PRINT a$
  200.         '        END IF
  201.         IF notZero = TRUE THEN 'AND isLessThan = FALSE THEN
  202.           '          LOCATE yPos + 10, 1 'xPos - 10
  203.           '          PRINT "here": ll$ = P$
  204.           this$ = "You have selected "
  205.           IF years1 <> 0 THEN
  206.             IF years1 >= 1000 THEN
  207.               lftNum = INT(years1 / 1000)
  208.               this$ = this$ + S$(lftNum) + ","
  209.               rtNum = years1 - (lftNum * 1000)
  210.               this$ = this$ + S$(rtNum)
  211.             ELSE
  212.               this$ = this$ + S$(years1)
  213.             END IF
  214.             this$ = this$ + " year"
  215.             IF years1 <> 1 THEN this$ = this$ + "s"
  216.             IF (days1 <> 0 AND (minutes1 <> 0 OR hours1 <> 0 OR seconds1 <> 0)) OR (hours1 <> 0 AND (minutes1 <> 0 OR seconds1 <> 0)) OR (minutes1 <> 0 AND seconds1 <> 0) THEN
  217.               this$ = this$ + ", "
  218.             ELSEIF days1 <> 0 OR minutes1 <> 0 OR hours1 <> 0 OR seconds1 <> 0 THEN
  219.               this$ = this$ + " and "
  220.             END IF
  221.           END IF
  222.           IF days1 <> 0 THEN
  223.             this$ = this$ + S$(days1) + " day"
  224.             IF days1 <> 1 THEN this$ = this$ + "s"
  225.             IF (hours1 <> 0 AND (minutes1 <> 0 OR seconds1 <> 0)) OR (minutes1 <> 0 AND seconds1 <> 0) THEN
  226.               this$ = this$ + ", "
  227.             ELSEIF minutes1 <> 0 AND seconds1 <> 0 THEN
  228.               this$ = this$ + " and "
  229.             END IF
  230.           END IF
  231.           IF hours1 <> 0 THEN
  232.             this$ = this$ + S$(hours1) + " hour"
  233.             IF hours1 <> 1 THEN this$ = this$ + "s"
  234.             IF minutes1 <> 0 AND seconds1 <> 0 THEN
  235.               this$ = this$ + ", "
  236.             ELSEIF minutes1 <> 0 OR seconds1 <> 0 THEN
  237.               this$ = this$ + " and "
  238.             END IF
  239.           END IF
  240.           IF minutes1 <> 0 THEN
  241.             this$ = this$ + S$(minutes1) + " minute"
  242.             IF minutes1 <> 1 THEN this$ = this$ + "s"
  243.             IF seconds1 <> 0 THEN this$ = this$ + " and "
  244.           END IF
  245.           IF seconds1 <> 0 THEN
  246.             this$ = this$ + S$(seconds1) + " second"
  247.             IF seconds1 <> 1 THEN this$ = this$ + "s"
  248.           END IF
  249.           LOCATE yPos + 10, Center(this$): PRINT this$
  250.           a$ = "Is this correct?": LOCATE yPos + 12, Center(a$): PRINT a$
  251.           yn$ = UCASE$(P$)
  252.           IF yn$ = "N" THEN GOTO differentTime1
  253.         ELSE
  254.           a$ = "You have selected 0. Is this correct?"
  255.           yn$ = UCASE$(P$)
  256.           IF yn$ = "N" THEN GOTO differentTime1
  257.         END IF
  258.       CASE CHR$(27)
  259.         montH = 1: daY = 1: year = 2022
  260.         years1 = 0: days1 = 0: hours1 = 0: minutes1 = 0: seconds1 = 0
  261.         '        years2 = 0: days2 = 0: hours2 = 0: minutes2 = 0: seconds2 = 0
  262.         haltAndDisplay = TRUE
  263.       CASE "X"
  264.         END
  265.     END SELECT
  266.   LOOP UNTIL userCommand$ = CHR$(13) OR userCommand$ = CHR$(32)
  267.  
  268.   GetOneTimeAmount$ = a1$
  269.  

4
QB64 Discussion / big number
« on: April 04, 2022, 05:49:49 pm »
is there a way to use and integer value bigger than the LONG data type allows?

5
QB64 Discussion / Strangest Error. Anyone know why?
« on: March 27, 2022, 12:54:18 am »
Code: QB64: [Select]
  1. invalidEntry:
  2. xPos = Center("h:mm")
  3. COLOR 30, 1: LOCATE 34, xPos: PRINT "H": LOCATE 34, xPos + 2: PRINT "MM": COLOR 14, 1: LOCATE 34, xPos + 1: PRINT ":"
  4. h$ = INPUT$(1): IF ASC(h$) < 48 OR ASC(h$) > 57 THEN GOTO invalidEntry
  5. COLOR 14, 1: LOCATE 34, xPos: PRINT h$
  6. m1$ = INPUT$(1): IF ASC(m1$) < 48 OR ASC(m1$) > 53 THEN GOTO invalidEntry
  7. COLOR 14, 1: LOCATE 34, xPos + 2: PRINT m1$
  8. m2$ = INPUT$(1): IF ASC(m2$) < 48 OR ASC(m2$) > 57 THEN GOTO invalidEntry
  9. COLOR 14, 1: LOCATE 34, xPos + 3: PRINT m2$
  10. searchMinutes = (VAL(h$) * 60) + VAL(m1$ + m2$)
  11. PRINT "searchMinutes: " + S$(searchMinutes): ll$ = P$
  12. a$ = "Is " + MinutesToHoursPassed$(searchMinutes) + " correct?": LOCATE 38, Center(a$): PRINT a$: w$ = INPUT$(1): IF UCASE$(w$) = "N" THEN GOTO invalidEntry
  13. PRINT "searchMinutes: " + S$(searchMinutes): ll$ = P$
  14.  
  15.  
  16.  
  17. FUNCTION MinutesToHoursPassed$ (minutes AS SINGLE)
  18.   'I'm not going to worry about days... yet
  19.   rtn$ = ""
  20.   hours = INT(minutes / 60)
  21.   minutes = Round(minutes - (hours * 60))
  22.   IF hours <> 0 THEN
  23.     rtn$ = S$(hours) + " hour"
  24.     IF hours <> 1 THEN rtn$ = rtn$ + "s"
  25.     IF minutes <> 0 THEN rtn$ = rtn$ + " and "
  26.   END IF
  27.   IF minutes <> 0 THEN
  28.     rtn$ = rtn$ + S$(minutes) + " minute"
  29.     IF minutes <> 1 THEN rtn$ = rtn$ + "s"
  30.   END IF
  31.   MinutesToHoursPassed$ = rtn$
  32.  
  33. FUNCTION Center (text$): Center = INT((80 - LEN(text$)) / 2): END FUNCTION
  34.  
  35. FUNCTION S$ (number): S$ = LTRIM$(STR$(number)): END FUNCTION
  36.  
  37.   pause$ = INPUT$(1)
  38.   IF pause$ = CHR$(27) THEN
  39.     '        SYSTEM
  40.     END
  41.   END IF
  42.   P$ = pause$

The print statement just before passing it to MinutesToHoursPassed$ reports the variable as intended.
The second print statement reports searchMinutes as 0 after using the function. I copied the variable and only sent the copy to MinutesToHoursPassed$ and that worked, but shouldn't it have worked without having to do that?

I mnust've checkled the spelling 50 times. I put the number in a seconed variable not used for the call and that worked. Just wondering what's going on

6
I'm trying to test whether a given string is in the format of a call time. Call times are either H:MM:SS or MM:SS or M:SS
I keep getting a result of TRUE for "Cheese" and other seemingly random strings. I just don't know what the error is
Code: QB64: [Select]
  1. CONST TRUE = 1
  2. CONST FALSE = -1
  3.  
  4. FUNCTION IsCallTime (possibleCallTimeString$)
  5.   rtn = TRUE
  6.   pCt$ = possibleCallTimeString$
  7.   IF LEN(pCt$) = 4 THEN
  8.     '1234
  9.     'M:SS
  10.     IF MID$(pCt$, 2, 1) <> ":" THEN rtn = FALSE
  11.     n1$ = LEFT$(pCt$, 1)
  12.     IF ASC(n1$) < 48 OR ASC(n1$) > 57 THEN rtn = FALSE
  13.     n2$ = MID$(pCt$, 3, 1)
  14.     IF ASC(n2$) < 48 OR ASC(n2$) > 57 THEN rtn = FALSE
  15.     n3$ = MID$(pCt$, 4, 1)
  16.     IF ASC(n3$) < 48 OR ASC(n3$) > 57 THEN rtn = FALSE
  17.     IF VAL(n1$ + n2$ + n3$) = 0 THEN rtn = FALSE
  18.   ELSEIF LEN(pCt$) = 5 THEN
  19.     '12345
  20.     'MM:SS
  21.     PRINT
  22.     IF MID$(pCt$, 3, 1) <> ":" THEN rtn = FALSE
  23.     n1$ = MID$(pCt$, 1, 1)
  24.     IF ASC(n1$) < 48 OR ASC(n1$) > 57 THEN rtn = FALSE
  25.     n2$ = MID$(pCt$, 2, 1)
  26.     IF ASC(n2$) < 48 OR ASC(n2$) > 57 THEN rtn = FALSE
  27.     n3$ = MID$(pCt$, 4, 1)
  28.     IF ASC(n3$) < 48 OR ASC(n3$) > 57 THEN rtn = FALSE
  29.     n4$ = MID$(pCt$, 5, 1)
  30.     IF ASC(n4$) < 48 OR ASC(n4$) > 57 THEN rtn = FALSE
  31.     IF VAL(n1$ + n2$ + n3$ + n$4) = 0 THEN rtn = FALSE
  32.   ELSEIF LEN(pCt$) = 7 THEN
  33.     '1234567
  34.     'H:MM:SS
  35.     IF MID$(pCt$, 2, 1) <> ":" THEN rtn = FALSE
  36.     IF MID$(pCt$, 5, 1) <> ":" THEN rtn = FALSE
  37.     n1$ = MID$(pCt$, 1, 1)
  38.     IF ASC(n1$) < 48 OR ASC(n1$) > 57 THEN rtn = FALSE
  39.     n2$ = MID$(pCt$, 3, 1)
  40.     IF ASC(n2$) < 48 OR ASC(n2$) > 57 THEN rtn = FALSE
  41.     n3$ = MID$(pCt$, 4, 1)
  42.     IF ASC(n3$) < 48 OR ASC(n3$) > 57 THEN rtn = FALSE
  43.     n4$ = MID$(pCt$, 6, 1)
  44.     IF ASC(n4$) < 48 OR ASC(n4$) > 57 THEN rtn = FALSE
  45.     n5$ = MID$(pCt$, 7, 1)
  46.     IF ASC(n5$) < 48 OR ASC(n5$) > 57 THEN rtn = FALSE
  47.     IF VAL(n1$ + n2$ + n3$ + n4$ + n5$) = 0 THEN rtn = FALSE
  48.   END IF
  49.   IsCallTime = rtn

7
Code: QB64: [Select]
  1.         PRINT "fileLine$ ="
  2.         PRINT "|          Joe             C-23:54-C                                       |"
  3.         IF INSTR(fileLine$, "C-") <> 0 AND INSTR(fileLine$, "-C") <> 0 THEN
  4.           ctS = INSTR(fileLine$, "C-") + 2
  5.           ctE = INSTR(fileLine$, "-C") - 1
  6.           possibleCallTime$ = MID$(fileLine$, ctS, ctE - ctS + 1)
  7.           IF IsCallTime(possibleCallTime$, collectingFigure) = TRUE THEN
  8.             CLS
  9.             PRINT "MID$(fileLine$, ctS, ctE - ctS + 1) = "
  10.             PRINT MID$(fileLine$, ctS, ctE - ctS + 1) 'the MID$ here prints the entire string of "23:54"
  11.             callTime$ = possibleCallTime$
  12.             callTimeTotalSeconds = callTimeTotalSeconds + NumberOfSecondsInCallTime(callTime$)
  13.             numberOfCalls = numberOfCalls + 1
  14.             PRINT
  15.  
  16.             PRINT "         1         2         3         4         5         6         7"
  17.             PRINT "1234567890123456789012345678901234567890123456789012345678901234567890123456:"
  18.             PRINT fileLine$
  19.             PRINT
  20.             PRINT "ctS (callTimeStart): " + LTRIM$(STR$(ctS))
  21.             PRINT "ctE (callTimeEnd): " + LTRIM$(STR$(ctE))
  22.             'the following line only prints out the seconds in the call time but otherwise acts properly=
  23.             PRINT "callTime$ = |" + callTime$ + "|     " 'here the minutes and colon are missing
  24.             PRINT
  25.             PRINT "NumberOfSecondsInCallTime(callTime$): " + S$(NumberOfSecondsInCallTime(callTime$))
  26.             PRINT
  27.             PRINT "callTimeTotalSeconds: " + S$(callTimeTotalSeconds)
  28.             PRINT
  29.             PRINT "numberOfCalls: " + S$(numberOfCalls)
  30.             gg$ = P$
  31.           END IF
  32.         END IF
IsCallTime checks the format of the string and returns true if it is in the form of H:MM:SS, MM:SS or M:SS
NumberOfSecondsInCallTime converts the call time to seconds
'callTime$ has only the seconds printed to the screen. it is passed properly to the function that changes it into seconds and it works properly in IsCallTime but it won't print out properly. why?

8
QB64 Discussion / Trouble understanding MID$( )
« on: November 01, 2021, 03:58:25 pm »
Code: QB64: [Select]
  1. startTime = 34
  2. endTime = 42
  3. lineToPrint$ = "|                                 9:30 AM N-the lobby between 10:13 AM-N   |"
  4.  
  5.  timeString$ = MID$(lineToPrint$, startTime, endTime)
  6.  
the result I get for timeString$ is " 9:30 AM N-the lobby between 10:13 AM-N   "

wtf?

am I missing something? I've had lots of problems with MID$(), especially with INSTR(). MID$() often requires me to fudge the numbers but still works consistently after doing so. Any suggestions?

9
Programs / CryptoGram finished!
« on: September 07, 2021, 09:36:54 pm »
This is a code word game. You are given a phrase in code. You have to decode it. These types of puzzles are often found in a newspaper. I hope you like it.
Code: QB64: [Select]
  1. GOTO beginning
  2. crap:
  3. PRINT "Error, Line number"
  4. beginning:
  5. WIDTH 80, 50
  6. CONST TRUE = 1
  7. CONST FALSE = 0
  8. CONST numberOfLines = 15
  9. CONST Easy = 1
  10. CONST Normal = 2
  11. CONST arrowKeyMove$ = "L64O2C"
  12. CONST enterKeyHit$ = "L45O4C"
  13.  
  14. DIM SHARED leftArrow$: leftArrow$ = CHR$(0) + "K"
  15. DIM SHARED rightArrow$: rightArrow$ = CHR$(0) + "M"
  16. DIM SHARED upArrow$: upArrow$ = CHR$(0) + "H"
  17. DIM SHARED downArrow$: downArrow$ = CHR$(0) + "P"
  18. DIM SHARED translationMatrix$(1 TO 26, 1 TO 2): FOR cl = 1 TO 26: translationMatrix$(cl, 1) = "": translationMatrix$(cl, 2) = "": NEXT cl
  19. DIM SHARED codedPhrase$: codedPhrase$ = ""
  20. DIM SHARED answerPhrase$: answerPhrase$ = ""
  21. DIM SHARED highlightedLetter: highlightedLetter = 0
  22. DIM SHARED workingLines$(1 TO numberOfLines)
  23. DIM SHARED initiallyCodedLines$(1 TO numberOfLines)
  24. DIM SHARED answerLines$(1 TO numberOfLines)
  25. DIM SHARED leftPositions(1 TO numberOfLines) AS INTEGER
  26. DIM SHARED maxLineNumber: maxLineNumber = 0
  27. DIM SHARED usersCode$(1 TO 26, 1 TO 2): FOR x = 1 TO 26: usersCode$(x, 1) = CHR$(x + 64): usersCode$(x, 2) = "-": NEXT x
  28. DIM SHARED mode: mode = Normal
  29. DIM SHARED loaded: loaded = FALSE
  30. DIM SHARED numberOfPhrases
  31. FOR cl = 1 TO numberOfLines
  32.     workingLines$(cl) = ""
  33.     initiallyCodedLines$(cl) = ""
  34.     answerLines$(cl) = ""
  35.     leftPositions(cl) = 0
  36. NEXT cl
  37.  
  38. CALL Menu
  39.  
  40. SUB Menu
  41.     opt = 1
  42.     mode = Normal
  43.     PrintAgain:
  44.     COLOR 14, 2: CLS: tabs = 25
  45.     a$ = "Main Menu": LOCATE 13, Center(a$): PRINT a$:
  46.     LOCATE 14, Center(a$) - 1: PRINT "-----------"
  47.     COLOR 14, 2: a$ = "Mode = Easy  Normal":
  48.     LOCATE 16, Center(a$): PRINT "Mode = ";
  49.     IF mode = Easy THEN
  50.         COLOR 14, 0
  51.     ELSEIF mode = Normal THEN
  52.         COLOR 14, 2
  53.     END IF
  54.     PRINT "Easy";: COLOR 14, 2: PRINT " ";
  55.     IF mode = Normal THEN
  56.         COLOR 14, 0
  57.     ELSEIF mode = Normal THEN
  58.         COLOR 14, 2
  59.     END IF
  60.     PRINT "Normal"
  61.  
  62.     LOCATE 19, tabs
  63.     COLOR 15, 2: PRINT "1.) ";
  64.     IF opt = 1 THEN
  65.         COLOR 14, 0:
  66.     ELSE
  67.         COLOR 14, 2
  68.     END IF
  69.     PRINT "Instructions"
  70.  
  71.     LOCATE 21, tabs
  72.     COLOR 15, 2: PRINT "2.) ";
  73.     IF opt = 2 THEN
  74.         COLOR 14, 0
  75.     ELSE
  76.         COLOR 14, 2
  77.     END IF
  78.     PRINT "New Game"
  79.  
  80.     LOCATE 23, tabs
  81.     COLOR 15, 2: PRINT "3.) ";
  82.     IF opt = 3 THEN
  83.         COLOR 14, 0
  84.     ELSE
  85.         COLOR 14, 2
  86.     END IF
  87.     PRINT "Load a Saved Game"
  88.  
  89.     LOCATE 25, tabs
  90.     COLOR 15, 2: PRINT "4.) ";
  91.     IF opt = 4 THEN
  92.         COLOR 14, 0
  93.     ELSE
  94.         COLOR 14, 2
  95.     END IF
  96.     PRINT "Add New Phrase to Data File"
  97.  
  98.     LOCATE 27, tabs
  99.     COLOR 15, 2: PRINT "5.) ";
  100.     IF opt = 5 THEN
  101.         COLOR 14, 0
  102.     ELSE
  103.         COLOR 14, 2
  104.     END IF
  105.     PRINT "End Game"
  106.     DO
  107.         choice$ = INKEY$
  108.         SELECT CASE choice$
  109.             CASE upArrow$
  110.                 opt = opt - 1
  111.                 IF opt = 0 THEN opt = 5
  112.                 PLAY arrowKeyMove$
  113.                 GOTO PrintAgain
  114.             CASE leftArrow$
  115.                 IF mode = Easy THEN
  116.                     mode = Normal
  117.                 ELSEIF mode = Normal THEN
  118.                     mode = Easy
  119.                 END IF
  120.                 PLAY arrowKeyMove$
  121.                 GOTO PrintAgain
  122.             CASE downArrow$
  123.                 opt = opt + 1
  124.                 IF opt = 6 THEN opt = 1
  125.                 PLAY arrowKeyMove$
  126.                 GOTO PrintAgain
  127.             CASE rightArrow$
  128.                 IF mode = Easy THEN
  129.                     mode = Normal
  130.                 ELSEIF mode = Normal THEN
  131.                     mode = Easy
  132.                 END IF
  133.                 PLAY arrowKeyMove$
  134.                 GOTO PrintAgain
  135.             CASE CHR$(13)
  136.                 PLAY enterKeyHit$
  137.                 IF opt = 1 THEN CALL Instructions
  138.                 IF opt = 2 THEN CALL Main
  139.                 IF opt = 3 THEN CALL LoadGame
  140.                 IF opt = 4 THEN CALL AddPhrase
  141.                 IF opt = 5 THEN END
  142.                 GOTO PrintAgain
  143.             CASE "1"
  144.                 PLAY enterKeyHit$
  145.                 CALL Instructions
  146.                 GOTO PrintAgain
  147.             CASE "2"
  148.                 PLAY enterKeyHit$
  149.                 loaded = FALSE
  150.                 CALL Main
  151.                 GOTO PrintAgain
  152.             CASE "3"
  153.                 PLAY enterKeyHit$
  154.                 loaded = TRUE
  155.                 CALL LoadGame
  156.                 GOTO PrintAgain
  157.             CASE "4"
  158.                 PLAY enterKeyHit$
  159.                 CALL AddPhrase
  160.                 GOTO PrintAgain
  161.             CASE "5"
  162.                 PLAY enterKeyHit$
  163.                 END
  164.         END SELECT
  165.     LOOP UNTIL choice$ = CHR$(13) OR choice$ = "5"
  166.  
  167. SUB Instructions
  168.     COLOR 10, 13: CLS
  169.     a$ = "A random phrase picked from " + CHR$(34) + "Phrases.txt" + CHR$(34) + " will be displayed in code."
  170.     LOCATE 12, Center(a$): PRINT a$
  171.     a$ = "The goal is to decode the phrase. The coded letters are in one color": LOCATE 14, Center(a$): PRINT a$
  172.     a$ = "and the letters you choose in another color. In easy mode, incorrect": LOCATE 16, Center(a$): PRINT a$
  173.     a$ = "letters are displayed in yet another color. Different types": LOCATE 18, Center(a$): PRINT a$
  174.     a$ = "of hints are available from the hint menu.": LOCATE 20, Center(a$): PRINT a$
  175.     a$ = "Use the arrow keys to select the letter you wish to change. Type": LOCATE 25, Center(a$): PRINT a$
  176.     a$ = "in the letter you wish to change it to. Push the [ESC] key": LOCATE 27, Center(a$): PRINT a$
  177.     a$ = "to reset the puzzle to the starting code.": LOCATE 29, Center(a$): PRINT a$
  178.  
  179.     a$ = "Hit any key to return to the Main Menu": LOCATE 45, Center(a$): COLOR 11, 13: PRINT a$: l$ = P$
  180.  
  181. SUB AddPhrase
  182.     COLOR 11, 13
  183.     CLS
  184.     a$ = "Type in the phrase you want to add. Do not hit": LOCATE 15, Center(a$): PRINT a$
  185.     a$ = " the [ENTER] key until you've entered the entire phrase. ": LOCATE 17, Center(a$): PRINT a$
  186.     a$ = "Don't worry if your entry passes the end of the screen": LOCATE 19, Center(a$): PRINT a$
  187.     a$ = "and continues on to the next line. In fact, longer": LOCATE 21, Center(a$): PRINT a$
  188.     a$ = "phrases are easier to decode.": LOCATE 23, Center(a$): PRINT a$
  189.  
  190.     LOCATE 28, 10: LINE INPUT "Type in your phrase: ", newPhrase$
  191.     maxIndex = FileStatus
  192.     DIM fileArray$(1 TO maxIndex + 1)
  193.     OPEN "Phrases.txt" FOR INPUT AS #1
  194.     FOR index = 1 TO maxIndex
  195.         LINE INPUT #1, fileArray$(index)
  196.     NEXT index
  197.     CLOSE #1
  198.  
  199.     fileArray$(maxIndex + 1) = newPhrase$
  200.     OPEN "Phrases.txt" FOR OUTPUT AS #1
  201.     FOR index = 1 TO maxIndex + 1
  202.         PRINT #1, fileArray$(index)
  203.     NEXT index
  204.     PRINT #1, "EOF"
  205.     CLOSE #1
  206.  
  207.  
  208. SUB LoadGame
  209.     maxLineNumber = 0
  210.     FOR index = 1 TO 26
  211.         translationMatrix$(index, 1) = "": translationMatrix$(index, 2) = ""
  212.         usersCode$(index, 1) = "": usersCode$(index, 2) = ""
  213.     NEXT index
  214.     codedPhrase$ = ""
  215.     answerPhrase$ = ""
  216.     highlightedLetter = 0
  217.     mode = 0
  218.     FOR index = 1 TO 15
  219.         workingLines$(index) = ""
  220.         initiallyCodedLines$(index) = ""
  221.         answerLines$(index) = ""
  222.         leftPositions(index) = 0
  223.     NEXT index
  224.  
  225.     OPEN "CryptoGram" FOR INPUT AS #1
  226.     LINE INPUT #1, mLN$: maxLineNumber = VAL(mLN$)
  227.     FOR index = 1 TO 26
  228.         LINE INPUT #1, translationMatrix$(index, 1)
  229.         LINE INPUT #1, translationMatrix$(index, 2)
  230.         LINE INPUT #1, usersCode$(index, 1)
  231.         LINE INPUT #1, usersCode$(index, 2)
  232.     NEXT index
  233.     LINE INPUT #1, codedPhrase$
  234.     LINE INPUT #1, answerPhrase$
  235.     LINE INPUT #1, hL$: PRINT hL$: g$ = P$: highlightedLetter = VAL(hL$)
  236.     LINE INPUT #1, m$: mode = VAL(m$)
  237.     FOR index = 1 TO maxLineNumber
  238.         LINE INPUT #1, workingLines$(index)
  239.         LINE INPUT #1, initiallyCodedLines$(index)
  240.         LINE INPUT #1, answerLines$(index)
  241.         LINE INPUT #1, lP$: leftPositions(index) = VAL(lP$)
  242.     NEXT index
  243.     CLOSE #1
  244.     loaded = TRUE: CALL Main
  245.  
  246. SUB SaveGame
  247.     OPEN "CryptoGram" FOR OUTPUT AS #1
  248.     PRINT #1, S$(maxLineNumber)
  249.     FOR index = 1 TO 26
  250.         PRINT #1, translationMatrix$(index, 1)
  251.         PRINT #1, translationMatrix$(index, 2)
  252.         PRINT #1, usersCode$(index, 1)
  253.         PRINT #1, usersCode$(index, 2)
  254.     NEXT index
  255.     PRINT #1, codedPhrase$
  256.     PRINT #1, answerPhrase$
  257.     PRINT #1, S$(highlightedLetter)
  258.     PRINT #1, S$(mode)
  259.     FOR index = 1 TO maxLineNumber
  260.         PRINT #1, workingLines$(index)
  261.         PRINT #1, initiallyCodedLines$(index)
  262.         PRINT #1, answerLines$(index)
  263.         PRINT #1, S$(leftPositions(index))
  264.     NEXT index
  265.     CLOSE #1
  266.     _DELAY (0.25)
  267.     PLAY arrowKeyMove$
  268.  
  269. SUB Main
  270.     IF loaded = FALSE THEN
  271.  
  272.         COLOR 15, 1
  273.         'first, pick a phrase
  274.         randomPhrase = INT(RND * FileStatus) + 1
  275.         OPEN "Phrases.txt" FOR INPUT AS #1
  276.         FOR x = 1 TO randomPhrase
  277.             LINE INPUT #1, answerPhrase$
  278.         NEXT x
  279.         CLOSE #1
  280.  
  281.         'second, create a code
  282.         usedAlphabet$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  283.         FOR allLetters = 1 TO 26
  284.             translationMatrix$(allLetters, 1) = CHR$(allLetters + 64)
  285.             newRndLet:
  286.             randomLetter = INT(RND * LEN(usedAlphabet$)) + 1
  287.             translationMatrix$(allLetters, 2) = MID$(usedAlphabet$, randomLetter, 1)
  288.             IF translationMatrix$(allLetters, 1) = translationMatrix$(allLetters, 2) THEN GOTO newRndLet
  289.             usedAlphabet$ = MID$(usedAlphabet$, 1, randomLetter - 1) + MID$(usedAlphabet$, randomLetter + 1, LEN(usedAlphabet$))
  290.         NEXT allLetters
  291.  
  292.         'third: put the phrase in code
  293.         FOR letter = 1 TO LEN(answerPhrase$)
  294.             answerLetter$ = MID$(answerPhrase$, letter, 1)
  295.             upAnsLet$ = UCASE$(answerLetter$)
  296.             answerLetterNumber = ASC(upAnsLet$) - 64
  297.             IF ASC(upAnsLet$) >= 65 AND ASC(upAnsLet$) <= 90 THEN
  298.                 upCodeLet$ = translationMatrix$(ASC(upAnsLet$) - 64, 2)
  299.                 IF ASC(answerLetter$) >= 65 AND ASC(answerLetter$) <= 90 THEN
  300.                     codedLetter$ = upCodeLet$
  301.                 ELSE
  302.                     codedLetter$ = LCASE$(upCodeLet$)
  303.                 END IF
  304.             ELSE
  305.                 codedLetter$ = answerLetter$
  306.             END IF
  307.             codedPhrase$ = codedPhrase$ + codedLetter$
  308.         NEXT letter
  309.  
  310.         'next on the list is to center the phrases
  311.         lineNumber = 0
  312.         shrinkingCode$ = codedPhrase$
  313.         shrinkingAnswer$ = answerPhrase$
  314.         DO
  315.             checking = 60
  316.             DO
  317.                 wheresSpace$ = MID$(shrinkingAnswer$, checking, 1)
  318.                 checking = checking - 1
  319.             LOOP UNTIL wheresSpace$ = CHR$(32)
  320.             lineNumber = lineNumber + 1
  321.             answerLines$(lineNumber) = MID$(shrinkingAnswer$, 1, checking)
  322.             workingLines$(lineNumber) = MID$(shrinkingCode$, 1, checking)
  323.             initiallyCodedLines$(lineNumber) = MID$(shrinkingCode$, 1, checking)
  324.             leftPositions(lineNumber) = Center(answerLines$(lineNumber))
  325.             shrinkingAnswer$ = MID$(shrinkingAnswer$, checking + 1, LEN(shrinkingAnswer$))
  326.             shrinkingCode$ = MID$(shrinkingCode$, checking + 1, LEN(shrinkingCode$))
  327.         LOOP UNTIL LEN(shrinkingAnswer$) <= 60
  328.         lineNumber = lineNumber + 1
  329.         answerLines$(lineNumber) = shrinkingAnswer$
  330.         leftPositions(lineNumber) = Center(answerLines$(lineNumber))
  331.         workingLines$(lineNumber) = shrinkingCode$
  332.         initiallyCodedLines$(lineNumber) = shrinkingCode$
  333.  
  334.         maxLineNumber = lineNumber
  335.  
  336.         highlightedLetter = 1
  337.     END IF
  338.     refresh = TRUE
  339.     DO
  340.         userInput$ = UCASE$(INKEY$)
  341.         SELECT CASE userInput$
  342.             CASE "1"
  343.                 PLAY enterKeyHit$
  344.                 refresh = TRUE
  345.                 CALL Hints
  346.             CASE "2"
  347.                 PLAY enterKeyHit$
  348.                 CALL SaveGame
  349.             CASE CHR$(27)
  350.                 PLAY enterKeyHit$ + enterKeyHit$ + arrowKeyMove$
  351.                 CALL RestartPuzzle
  352.                 refresh = TRUE
  353.             CASE "5"
  354.                 PLAY enterKeyHit$
  355.                 CALL Menu
  356.             CASE leftArrow$
  357.                 PLAY arrowKeyMove$
  358.                 IF highlightedLetter > 1 THEN
  359.                     highlightedLetter = highlightedLetter - 1
  360.                 ELSE
  361.                     highlightedLetter = 26
  362.                 END IF
  363.                 refresh = TRUE
  364.             CASE rightArrow$
  365.                 PLAY arrowKeyMove$
  366.                 IF highlightedLetter < 26 THEN
  367.                     highlightedLetter = highlightedLetter + 1
  368.                 ELSE
  369.                     highlightedLetter = 1
  370.                 END IF
  371.                 refresh = TRUE
  372.             CASE "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
  373.                 PLAY enterKeyHit$
  374.                 usersCode$(highlightedLetter, 2) = userInput$
  375.                 CALL Switch(userInput$)
  376.                 refresh = TRUE
  377.         END SELECT
  378.  
  379.         IF refresh = TRUE THEN
  380.             refresh = FALSE
  381.             CALL ShowPuzzle
  382.         END IF
  383.     LOOP UNTIL userInput$ = "9" OR CorrectPhrase = TRUE
  384.     IF CorrectPhrase = TRUE THEN
  385.         COLOR 11, 0
  386.         LOCATE 25, Center("success")
  387.         PRINT "SUCCESS!!"
  388.         _DELAY (10)
  389.     END IF
  390.  
  391. SUB Hints
  392.     nope:
  393.     COLOR 14, 1
  394.     CLS
  395.     a$ = "You have an option of 3 types of hints to choose from.": LOCATE 10, Center(a$): PRINT a$
  396.     a$ = "Wheel of Fortune reveals the letters for R, S, T, L, N and E": LOCATE 11, Center(a$): PRINT a$
  397.     a$ = "Or you can choose to reveal a single letter.": LOCATE 12, Center(a$): PRINT a$
  398.     a$ = "Example phrase = Rmtleyr ewatbr": LOCATE 14, Center(a$): COLOR 10, 1: PRINT "Example phrase ";: COLOR 14, 1: PRINT "=";: COLOR 10, 1: PRINT " Rmtleyr ewatbr": COLOR 14, 1
  399.     a$ = "1.) Wheel of Fortune: Example phrase = Emtlele ewrtse": LOCATE 17, Center(a$): PRINT "1.) Wheel of Fortune: ";: COLOR 10, 1: PRINT "Example phrase = ";
  400.     COLOR 12, 1: PRINT "E";: COLOR 10, 1: PRINT "mtle";: COLOR 12, 1: PRINT "le";: COLOR 10, 1: PRINT " ew";: COLOR 12, 1: PRINT "r";: COLOR 10, 1: PRINT "t";: COLOR 12, 1: PRINT "se": COLOR 14, 1
  401.     a$ = "2.) Reveal a single random letter: Rmtleyr ewatbr": LOCATE 19, Center(a$): PRINT "2.) Reveal a single random letter: ";: COLOR 12, 1: PRINT "E";: COLOR 10, 1
  402.     PRINT "mtley";: COLOR 12, 1: PRINT "e";: COLOR 10, 1: PRINT " ewrts";: COLOR 12, 1: PRINT "e": COLOR 14, 1
  403.     a$ = "3.) Choose a single coded letter to decode:": LOCATE 21, Center(a$): PRINT a$
  404.     a$ = "    Pick any letter in example phrase": LOCATE 22, Center(a$): PRINT "    Pick any letter in ";: COLOR 10, 1: PRINT "R";
  405.     COLOR 12, 1: PRINT "m";: COLOR 10, 1: PRINT "tleyr ewatbr";: COLOR 14, 1
  406.     a$ = "      to be revealed in example phrase": LOCATE 23, Center(a$): PRINT "      to be revealed in ";: COLOR 10, 1: PRINT "E";: COLOR 12, 1: PRINT "x";: COLOR 10, 1: PRINT "ample phrase": COLOR 14, 1
  407.     a$ = "4.) Reveal a letter you think is in the answer phrase:": LOCATE 25, Center(a$): PRINT a$
  408.     a$ = "Choosing " + CHR$(34) + "K" + CHR$(34) + " wouldn't reveal anything. Choosing " + CHR$(34) + "L" + CHR$(34): LOCATE 26, Center(a$): PRINT a$
  409.     a$ = " Reveals the " + CHR$(34) + "L" + CHR$(34) + " -- example phrase": LOCATE 27, Center(a$): PRINT "reveals the " + CHR$(34) + "L" + CHR$(34) + " -- ";
  410.     COLOR 10, 1: PRINT "Examp";: COLOR 12, 1: PRINT "l";: COLOR 10, 1: PRINT "e phrase": COLOR 14, 1
  411.     a$ = "5.) Switch to easy mode": LOCATE 29, Center(a$): PRINT a$
  412.     a$ = "6.) Display every coded letter and the letter": LOCATE 31, Center(a$): PRINT a$
  413.     a$ = "       it should be for 2 seconds": LOCATE 32, Center(a$): PRINT a$
  414.  
  415.  
  416.  
  417.     a$ = "7.) Cancel": LOCATE 35, Center(a$): PRINT a$
  418.     PLAY arrowKeyMove$
  419.     r$ = P$
  420.     PLAY enterKeyHit$
  421.     SELECT CASE r$
  422.         CASE "1"
  423.             r$ = translationMatrix$(18, 2): re = ASC(r$) - 64: highlightedLetter = re: CALL Switch("R"): usersCode$(re, 2) = "R"
  424.             ss$ = translationMatrix$(19, 2): se = ASC(ss$) - 64: highlightedLetter = se: CALL Switch("S"): usersCode$(se, 2) = "S"
  425.             t$ = translationMatrix$(20, 2): te = ASC(t$) - 64: highlightedLetter = te: CALL Switch("T"): usersCode$(te, 2) = "T"
  426.             l$ = translationMatrix$(12, 2): le = ASC(l$) - 64: highlightedLetter = le: CALL Switch("L"): usersCode$(le, 2) = "L"
  427.             n$ = translationMatrix$(14, 2): ne = ASC(n$) - 64: highlightedLetter = ne: CALL Switch("N"): usersCode$(ne, 2) = "N"
  428.             e$ = translationMatrix$(5, 2): ee = ASC(e$) - 64: highlightedLetter = ee: CALL Switch("E"): usersCode$(ee, 2) = "E"
  429.         CASE "2"
  430.             gotThis:
  431.             tryAgain:
  432.             there = FALSE
  433.             someRandom$ = CHR$((INT(RND * 26)) + 65)
  434.             FOR x = 1 TO maxLineNumber
  435.                 FOR y = 1 TO LEN(answerLines$(x))
  436.                     IF UCASE$(MID$(answerLines$(x), y, 1)) = someRandom$ THEN there = TRUE
  437.                 NEXT y
  438.             NEXT x
  439.             IF there = FALSE THEN GOTO tryAgain
  440.             itShouldBeCodedAs$ = translationMatrix$(ASC(someRandom$) - 64, 2)
  441.             usersAttempt$ = usersCode$(ASC(itShouldBeCodedAs$) - 64, 2)
  442.             IF usersAttempt$ = someRandom$ THEN GOTO tryAgain
  443.             highlightedLetter = ASC(itShouldBeCodedAs$) - 64
  444.             Switch (someRandom$)
  445.             usersCode$(highlightedLetter, 2) = someRandom$
  446.         CASE "3"
  447.             PRINT: PRINT
  448.             a$ = "What code letter do you want to know the answer letter for?    ": LOCATE , Center(a$): PRINT a$;
  449.             invlInp:
  450.             someCodedLetter$ = UCASE$(P$)
  451.             ascSomeCodedLetter = ASC(someCodedLetter$) - 64
  452.             correctLetter$ = ""
  453.             FOR index = 1 TO 26
  454.                 IF translationMatrix$(index, 2) = someCodedLetter$ THEN correctLetter$ = translationMatrix$(index, 1)
  455.             NEXT index
  456.             highlightedLetter = ascSomeCodedLetter
  457.             CALL Switch(correctLetter$)
  458.         CASE "4"
  459.             a$ = "What answer letter do you want the code for?    ": LOCATE , Center(a$): PRINT a$;
  460.             invlInpt:
  461.             d$ = UCASE$(P$)
  462.             da = ASC(d$) - 64
  463.  
  464.             ans$ = translationMatrix$(da, 2)
  465.             highlightedLetter = da
  466.             CALL Switch(ans$)
  467.         CASE "5"
  468.             mode = Easy
  469.         CASE "6"
  470.             COLOR 15, 1
  471.             CLS
  472.             FOR index = 1 TO 26
  473.                 LOCATE 22, ((80 - 52) / 2) + (index * 2)
  474.                 PRINT translationMatrix$(index, 1)
  475.                 LOCATE 24, ((80 - 52) / 2) + (index * 2)
  476.                 PRINT translationMatrix$(index, 2)
  477.             NEXT index
  478.             _DELAY (2)
  479.         CASE "7"
  480.             'just go away
  481.         CASE ELSE
  482.             GOTO nope
  483.     END SELECT
  484.     highlightedLetter = 1
  485.  
  486. FUNCTION CorrectPhrase
  487.     ag = TRUE
  488.     FOR x = 1 TO maxLineNumber
  489.         IF workingLines$(x) <> answerLines$(x) THEN ag = FALSE
  490.     NEXT x
  491.     CorrectPhrase = ag
  492.  
  493. SUB Switch (withThis$)
  494.     DIM newLines$(1 TO maxLineNumber): FOR i = 1 TO maxLineNumber: newLines$(i) = "": NEXT i
  495.     FOR l = 1 TO maxLineNumber
  496.         FOR c = 1 TO LEN(workingLines$(l))
  497.             letter$ = CHR$(highlightedLetter + 64)
  498.             initialLetter$ = MID$(initiallyCodedLines$(l), c, 1)
  499.             wcl$ = MID$(workingLines$(l), c, 1)
  500.             IF ASC(initialLetter$) >= 65 AND ASC(initialLetter$) <= 90 THEN
  501.                 withThis$ = UCASE$(withThis$)
  502.             ELSEIF ASC(initialLetter$) >= 97 AND ASC(initialLetter$) <= 122 THEN
  503.                 withThis$ = LCASE$(withThis$)
  504.             ELSE
  505.             END IF
  506.             IF letter$ = UCASE$(initialLetter$) THEN
  507.                 newLines$(l) = newLines$(l) + withThis$
  508.             ELSE
  509.                 newLines$(l) = newLines$(l) + wcl$
  510.             END IF
  511.         NEXT c 'haracter
  512.     NEXT l 'ine
  513.     FOR index = 1 TO maxLineNumber
  514.         workingLines$(index) = newLines$(index)
  515.     NEXT index
  516.  
  517. SUB RestartPuzzle
  518.     FOR c = 1 TO maxLineNumber
  519.         workingLines$(c) = initiallyCodedLines$(c)
  520.     NEXT c
  521.     FOR xx = 1 TO 26
  522.         usersCode$(xx, 2) = "-"
  523.     NEXT xx
  524.  
  525. SUB ShowPuzzle
  526.     COLOR 10, 1: CLS
  527.  
  528.     FOR eachLine = 1 TO maxLineNumber
  529.         LOCATE 13 + eachLine, leftPositions(eachLine)
  530.         FOR eachLetter = 1 TO LEN(workingLines$(eachLine))
  531.             f$ = MID$(workingLines$(eachLine), eachLetter, 1)
  532.             icl$ = MID$(initiallyCodedLines$(eachLine), eachLetter, 1)
  533.             correct$ = MID$(answerLines$(eachLine), eachLetter, 1)
  534.             ac = ASC(UCASE$(icl$)) - 64
  535.             IF f$ <> icl$ THEN
  536.                 COLOR 12, 1
  537.             END IF
  538.             IF f$ = correct$ AND mode = Easy THEN
  539.                 COLOR 15, 1
  540.             END IF
  541.             IF highlightedLetter = ac THEN
  542.                 COLOR 10, 0
  543.             END IF
  544.             IF f$ = icl$ AND highlightedLetter <> ac AND f$ <> correct$ THEN COLOR 10, 1
  545.  
  546.             PRINT f$;
  547.             COLOR 10, 1
  548.         NEXT eachLetter
  549.     NEXT eachLine
  550.     spaces = 2
  551.     FOR x = 1 TO 26
  552.         IF x = highlightedLetter THEN
  553.             COLOR 10, 0
  554.         ELSE
  555.             COLOR 10, 1
  556.         END IF
  557.         LOCATE 35, spaces
  558.         PRINT usersCode$(x, 1)
  559.         LOCATE 37, spaces
  560.         PRINT usersCode$(x, 2)
  561.         spaces = spaces + 3
  562.     NEXT x
  563.     a$ = "Push 1 to access the hint menu"
  564.     LOCATE 43, Center(a$): COLOR 14, 1: PRINT a$
  565.     a$ = "Push 2 to save the game and quit": COLOR 14, 1: LOCATE 45, Center(a$): PRINT a$
  566.     a$ = "Push [ESC] to reset": LOCATE 47, Center(a$): COLOR 14, 1: PRINT a$
  567.     a$ = "Push 5 to quit": LOCATE 49, Center(a$): COLOR 14, 1: PRINT a$
  568.  
  569. FUNCTION FileStatus
  570.     IF _FILEEXISTS("Phrases.txt") = 0 THEN
  571.         OPEN "Phrases.txt" FOR OUTPUT AS #1
  572.         PRINT #1, "Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow, a poor player, That struts and frets his hour upon the stage, And then is heard no more. It is a tale Told by an idiot, full of sound and fury, Signifying nothing."
  573.         PRINT #1, "To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep; To sleep: perchance to dream"
  574.         PRINT #1, "If someone is able to show me that what I think or do is not right, I will happily change. For I seek the truth, by which no oe ever was truly harmed. Harmed is the person who continues in his self-deception and ignorance."
  575.         PRINT #1, "Funny lines: Before you marry a person, you should first make them use a computer with slow internet to see who they really are. -- Someone asked me, if I were stranded on a desert island what book would I bring... " + CHR$(34) + "How to Build a Boat." + CHR$(34)
  576.         PRINT #1, "Funny lines: I finally realized that people are prisoners of their own phones... that's why it's called a " + CHR$(34) + "cell" + CHR$(34) + " phone. -- Be decisive. Right or wrong, make a decision. The road is paved with flat squirrels who couldn't make a decision."
  577.         PRINT #1, "Funny lines: If at first you don't succeed, then skydiving definitely isn't for you. -- My cell phone is acting up. I keep pressing the Home button but every time I look around, I'm still at work."
  578.         PRINT #1, "Pangrams: Pack my box with five dozen liquor jugs. -- The quick brown fox jumps over the lazy dog. -- My girl wove six dozen plaid jackets before she quit."
  579.         PRINT #1, "EOF"
  580.         CLOSE #1
  581.         numberOfPhrases = 7
  582.     ELSE
  583.         OPEN "Phrases.txt" FOR INPUT AS #1
  584.         numberOfPhrases = 0
  585.         DO
  586.             numberOfPhrases = numberOfPhrases + 1
  587.             LINE INPUT #1, lineCounting$
  588.         LOOP UNTIL INSTR(lineCounting$, "EOF") <> 0
  589.         numberOfPhrases = numberOfPhrases - 1
  590.         CLOSE #1
  591.     END IF
  592.     FileStatus = numberOfPhrases
  593.  
  594. FUNCTION Center (text$)
  595.     Center = INT((80 - LEN(text$)) / 2)
  596.  
  597. FUNCTION S$ (number)
  598.     S$ = LTRIM$(STR$(number))
  599.  
  600.     pause$ = INPUT$(1)
  601.     IF pause$ = CHR$(27) THEN END
  602.     P$ = pause$
  603.  

10
QB64 Discussion / I'm stumped by this error
« on: September 06, 2021, 04:33:48 pm »
I'm writing a puzzle game. You start with a phrase spelled with different letters than the ones actually in the phrase. You continue along until you have the original phrase.  The letters appear in one color if you've changed it and another color for the original code. I got it working so the first letter you choose to switch displays properly. But every time you try to change another letter, the lines of the phrase are printed out twice. The second printed line is in a different color. I'm at wits end. Any help would be much appreciated.
Code: QB64: [Select]
  1. GOTO beginning
  2. crap:
  3. PRINT "Error, Line number"
  4. beginning:
  5. WIDTH 80, 50
  6. CONST TRUE = 1
  7. CONST FALSE = 0
  8. CONST numberOfLines = 15
  9.  
  10. DIM SHARED leftArrow$: leftArrow$ = CHR$(0) + "K"
  11. DIM SHARED rightArrow$: rightArrow$ = CHR$(0) + "M"
  12. DIM SHARED translationMatrix$(1 TO 26, 1 TO 2): FOR cl = 1 TO 26: translationMatrix$(cl, 1) = "": translationMatrix$(cl, 2) = "": NEXT cl
  13. DIM SHARED codedPhrase$: codedPhrase$ = ""
  14. DIM SHARED answerPhrase$: answerPhrase$ = ""
  15. DIM SHARED highlightedLetter: highlightedLetter = 0
  16. DIM SHARED attemptedLetters$(1 TO 26, 1 TO 2): FOR cl = 1 TO 26: attemptedLetters$(cl, 1) = CHR$(cl + 64): attemptedLetters$(cl, 2) = "-": NEXT cl
  17. DIM SHARED workingLines$(1 TO numberOfLines)
  18. DIM SHARED initiallyCodedLines$(1 TO numberOfLines)
  19. DIM SHARED newLines$(1 TO numberOfLines)
  20. DIM SHARED answerLines$(1 TO numberOfLines)
  21. DIM SHARED leftPositions(1 TO numberOfLines) AS INTEGER
  22. FOR cl = 1 TO numberOfLines
  23.     workingLines$(cl) = ""
  24.     initiallyCodedLines$(cl) = ""
  25.     newLines$(cl) = ""
  26.     answerLines$(cl) = ""
  27.     leftPositions(cl) = 0
  28. NEXT cl
  29.  
  30. CALL Main
  31. SUB Main
  32.     'first, pick a phrase
  33.     randomPhrase = INT(RND * FileStatus) + 1
  34.     OPEN "Phrases.txt" FOR INPUT AS #1
  35.     FOR x = 1 TO randomPhrase
  36.         LINE INPUT #1, answerPhrase$
  37.     NEXT x
  38.     CLOSE #1
  39.  
  40.     'second, create a code
  41.     usedAlphabet$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  42.     FOR allLetters = 1 TO 26
  43.         translationMatrix$(allLetters, 1) = CHR$(allLetters + 64)
  44.         newRndLet:
  45.         randomLetter = INT(RND * LEN(usedAlphabet$)) + 1
  46.         translationMatrix$(allLetters, 2) = MID$(usedAlphabet$, randomLetter, 1)
  47.         IF translationMatrix$(allLetters, 1) = translationMatrix$(allLetters, 2) THEN GOTO newRndLet
  48.         usedAlphabet$ = MID$(usedAlphabet$, 1, randomLetter - 1) + MID$(usedAlphabet$, randomLetter + 1, LEN(usedAlphabet$))
  49.     NEXT allLetters
  50.  
  51.     'third: put the phrase in code
  52.     PRINT "answerPhrase$ = " + answerPhrase$: PRINT
  53.     FOR letter = 1 TO LEN(answerPhrase$)
  54.         answerLetter$ = MID$(answerPhrase$, letter, 1)
  55.         upAnsLet$ = UCASE$(answerLetter$)
  56.         answerLetterNumber = ASC(upAnsLet$) - 64
  57.         IF ASC(upAnsLet$) >= 65 AND ASC(upAnsLet$) <= 90 THEN
  58.             upCodeLet$ = translationMatrix$(ASC(upAnsLet$) - 64, 2)
  59.             IF ASC(answerLetter$) >= 65 AND ASC(answerLetter$) <= 90 THEN
  60.                 codedLetter$ = upCodeLet$
  61.             ELSE
  62.                 codedLetter$ = LCASE$(upCodeLet$)
  63.             END IF
  64.         ELSE
  65.             codedLetter$ = answerLetter$
  66.         END IF
  67.         codedPhrase$ = codedPhrase$ + codedLetter$
  68.     NEXT letter
  69.  
  70.     'next on the list is to center the phrases
  71.     shrinkCode$ = codedPhrase$
  72.     shrinkAns$ = answerPhrase$
  73.     IF LEN(codedPhrase$) >= 60 THEN
  74.         numLine = 0
  75.         DO
  76.             numLine = numLine + 1
  77.             checkHere = 60
  78.             DO
  79.                 checkHere = checkHere - 1
  80.                 findSpace$ = MID$(codedPhrase$, checkHere, 1)
  81.             LOOP UNTIL findSpace$ = " "
  82.             workingLines$(numLine) = MID$(shrinkCode$, 1, checkHere)
  83.             initiallyCodedLines$(numLine) = MID$(shrinkCode$, 1, checkHere)
  84.             leftPositions(numLine) = Center(MID$(shrinkCode$, 1, checkHere))
  85.             answerLines$(numLine) = MID$(shrinkAns$, 1, checkHere)
  86.             shrinkCode$ = MID$(shrinkCode$, checkHere + 1, LEN(shrinkCode$))
  87.             shrinkAns$ = MID$(shrinkAns$, checkHere + 1, LEN(shrinkAns$))
  88.         LOOP UNTIL numLine = 15 OR shrinkCode$ = ""
  89.     ELSE
  90.         workingLines$(1) = codedPhrase$
  91.         initiallyCodedLines$(1) = codedPhrase$
  92.         answerLines$(1) = answerPhrase$
  93.         leftPositions(1) = Center(codedPhrase$)
  94.     END IF
  95.     cs = 1
  96.     '    DO WHILE leftPositions(cs) <> 0
  97.     '        LOCATE , leftPositions(cs): PRINT answerLines$(cs)
  98.     '        cs = cs + 1
  99.     '    LOOP
  100.     PRINT
  101.     '    gg = 1
  102.     '    DO WHILE leftPositions(gg) <> 0
  103.     '        LOCATE , leftPositions(gg): PRINT workingLines$(gg)
  104.     '        gg = gg + 1
  105.     '    LOOP
  106.     '    a$ = P$
  107.  
  108.     'now to display and build the interface
  109.     highlightedLetter = 1
  110.     CALL DisplayScreen
  111.     '    d$ = P$
  112.     plsWt = FALSE
  113.     DO
  114.         '        FOR cv = 1 TO numberOfLines: newLines$(cv) = "": NEXT cv
  115.         getCmd$ = INKEY$
  116.         getCmd$ = UCASE$(getCmd$)
  117.         SELECT CASE getCmd$
  118.             CASE leftArrow$
  119.                 IF highlightedLetter > 1 THEN
  120.                     highlightedLetter = highlightedLetter - 1
  121.                 ELSE
  122.                     highlightedLetter = 26
  123.                 END IF
  124.                 plsWt = TRUE
  125.             CASE rightArrow$
  126.                 IF highlightedLetter < 26 THEN
  127.                     highlightedLetter = highlightedLetter + 1
  128.                 ELSE
  129.                     highlightedLetter = 1
  130.                 END IF
  131.                 plsWt = TRUE
  132.             CASE CHR$(13)
  133.                 FOR cl = 1 TO 26
  134.                     attemptedLetters$(cl, 1) = CHR$(cl + 64)
  135.                     attemptedLetters$(cl, 2) = "-"
  136.                 NEXT cl
  137.                 FOR x = 1 TO numberOfLines
  138.                     workingLines$(x) = initiallyCodedLines$(x)
  139.                 NEXT x
  140.             CASE CHR$(27)
  141.                 END
  142.             CASE "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
  143.                 plsWt = TRUE
  144.                 attemptedLetters$(highlightedLetter, 2) = getCmd$
  145.                 numLines = 1
  146.                 DO WHILE workingLines$(numLines) <> ""
  147.                     FOR let1 = 1 TO LEN(workingLines$(numLines))
  148.                         currentLetter$ = MID$(workingLines$(numLines), let1, 1)
  149.                         '                        LOCATE 1, 1: PRINT "currentLetter$: " + currentLetter$: g$ = P$
  150.                         IF CHR$(highlightedLetter + 64) = UCASE$(currentLetter$) THEN
  151.                             replacementLetter$ = getCmd$
  152.                             letCase = ASC(MID$(workingLines$(numLines), let1, 1))
  153.                             IF letCase >= 97 AND letCase <= 122 THEN replacementLetter$ = LCASE$(replacementLetter$)
  154.                             newLines$(numLines) = newLines$(numLines) + replacementLetter$
  155.                         ELSE
  156.                             newLines$(numLines) = newLines$(numLines) + currentLetter$
  157.                         END IF
  158.                         '                        PRINT "**************************************************************************************************"
  159.                         '                        PRINT "newLines$(numLines) = " + newLines$(numLines): k$ = P$
  160.                     NEXT let1
  161.                     numLines = numLines + 1
  162.                 LOOP
  163.         END SELECT
  164.         IF plsWt = TRUE THEN
  165.             plsWt = FALSE
  166.             f = 1
  167.             DO WHILE newLines$(f) <> ""
  168.                 workingLines$(f) = newLines$(f)
  169.                 f = f + 1
  170.             LOOP
  171.             CALL DisplayScreen
  172.         END IF
  173.     LOOP UNTIL SolvedIt = TRUE
  174.  
  175. FUNCTION SolvedIt
  176.     rtn = TRUE
  177.     FOR checkTheLine = 1 TO numberOfLines
  178.         IF workingLines$(checkTheLine) <> answerLines$(checkTheLine) THEN rtn = FALSE
  179.     NEXT checkTheLine
  180.     SolvedIt = rtn
  181.  
  182.  
  183. SUB DisplayScreen
  184.     COLOR 11, 1: CLS
  185.     LOCATE 1, 1: PRINT answerPhrase$
  186.     'print out the quote
  187.     numLines = 1
  188.     DO WHILE leftPositions(numLines) <> 0
  189.         'LOCATE 48, 1: PRINT "leftPositions(numLines) = " + S$(leftPositions(numLines)) + " ": c$ = P$
  190.         LOCATE 11 + numLines, leftPositions(numLines)
  191.         '        PRINT "numLines: " + S$(numLines) + "    workingLine$(numlines), LEN = " + workingLines$(numLines) + ",   " + S$(LEN(workinglines(numLines)))
  192.         '        PRINT "initiallyCodedLines$(" + S$(numLines) + "): = " + initiallyCodedLines$(numLines)
  193.         '        PRINT "answerLines$(numLines)" + answerLines$(numLines)
  194.         '        f$ = P$
  195.         FOR o = 1 TO LEN(workingLines$(numLines))
  196.             wlc$ = MID$(workingLines$(numLines), o, 1)
  197.             icl$ = MID$(initiallyCodedLines$(numLines), o, 1)
  198.             al$ = MID$(answerLines$(numLines), o, 1)
  199.             IF ASC(UCASE$(wlc$)) - 64 = highlightedLetter THEN 'if the letter is highlighted print 11 on 0
  200.                 COLOR 10, 0
  201.             ELSEIF wlc$ = al$ THEN 'the letter is correct
  202.                 COLOR 14, 1
  203.             ELSEIF wlc$ <> icl$ THEN 'the letter has been changed or not changed back to its original code
  204.                 COLOR 15, 1
  205.             ELSE
  206.                 COLOR 10, 1
  207.             END IF
  208.             PRINT wlc$; ': f$ = P$
  209.         NEXT o
  210.         numLines = numLines + 1
  211.     LOOP
  212.     'print out the selectable letters
  213.     spaces = 2
  214.     FOR b = 1 TO 26
  215.         IF b = highlightedLetter THEN
  216.             COLOR 10, 0
  217.         ELSE
  218.             COLOR 14, 1
  219.         END IF
  220.         LOCATE 40, spaces: PRINT attemptedLetters$(b, 1)
  221.         IF b = highlightedLetter THEN
  222.             COLOR 10, 0
  223.         ELSE
  224.             COLOR 12, 1
  225.         END IF
  226.         LOCATE 42, spaces: PRINT attemptedLetters$(b, 2)
  227.         spaces = spaces + 3
  228.     NEXT b
  229.  
  230.  
  231. FUNCTION FileStatus
  232.     IF _FILEEXISTS("Phrases.txt") = 0 THEN
  233.         OPEN "Phrases.txt" FOR OUTPUT AS #1
  234.         PRINT #1, "Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow, a poor player, That struts and frets his hour upon the stage, And then is heard no more. It is a tale Told by an idiot, full of sound and fury, Signifying nothing."
  235.         PRINT #1, "To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep; To sleep: perchance to dream: ay, there's the rub; For in that sleep of death what dreams may come When we have shuffled off this mortal coil, Must give us pause"
  236.         PRINT #1, "If someone is able to show me that what I think or do is not right, I will happily change. For I seek the truth, by which no oe ever was truly harmed. Harmed is the person who continues in his self-deception and ignorance."
  237.         PRINT #1, "Funny lines: Before you marry a person, you should first make them use a computer with slow internet to see who they really are. -- Someone asked me, if I were stranded on a desert island what book would I bring... " + CHR$(34) + "How to Build a Boat." + CHR$(34)
  238.         PRINT #1, "Funny lines: I finally realized that people are prisoners of their own phones... that's why it's called a " + CHR$(34) + "cell" + CHR$(34) + " phone. -- Be decisive. Right or wrong, make a decision. The road is paved with flat squirrels who couldn't make a decision."
  239.         PRINT #1, "Funny lines: If at first you don't succeed, then skydiving definitely isn't for you. -- My cell phone is acting up. I keep pressing the Home button but every time I look around, I'm still at work."
  240.         PRINT #1, "Pangrams: Pack my box with five dozen liquor jugs. -- The quick brown fox jumps over the lazy dog. -- My girl wove six dozen plaid jackets before she quit."
  241.         PRINT #1, "EOF"
  242.         CLOSE #1
  243.         numberOfPhrases = 7
  244.     ELSE
  245.         OPEN "Phrases.txt" FOR INPUT AS #1
  246.         numberOfPhrases = 0
  247.         DO
  248.             numberOfPhrases = numberOfPhrases + 1
  249.             LINE INPUT #1, lineCounting$
  250.         LOOP UNTIL INSTR(lineCounting$, "EOF") <> 0
  251.         numberOfPhrases = numberOfPhrases - 1
  252.         CLOSE #1
  253.     END IF
  254.     FileStatus = numberOfPhrases
  255.  
  256. FUNCTION Center (text$)
  257.     Center = INT((80 - LEN(text$)) / 2)
  258.  
  259. FUNCTION S$ (number)
  260.     S$ = LTRIM$(STR$(number))
  261.  
  262.     pause$ = INPUT$(1)
  263.     IF pause$ = CHR$(27) THEN END
  264.     P$ = pause$

11
Programs / Roman Numeral / Decimal Number converter
« on: September 03, 2021, 10:13:21 pm »
Code: QB64: [Select]
  1. CONST TRUE = 1
  2. CONST FALSE = 0
  3. DIM SHARED romanNumeral$: romanNumeral$ = ""
  4. DIM SHARED decimalNumber: decimalNumber = 0
  5.  
  6. PRINT "Type 1 or 'R' to convert decimal number to Roman Numeral"
  7. PRINT "           or anything else to convert Roman Numeral to decimal number"
  8. c$ = P$(TRUE)
  9. IF c$ = "1" OR UCASE$(c$) = "R" THEN
  10.     CALL ConvertToRoman
  11.     CALL ConvertToDecimal
  12.  
  13. SUB ConvertToDecimal
  14.     decimalNumber = 0
  15.     invalidInput:
  16.     INPUT "Type in the Roman Numeral: ", romanNumeral$
  17.     rn$ = UCASE$(romanNumeral$)
  18.     FOR count = 1 TO LEN(rn$)
  19.         a$ = MID$(rn$, count, 1)
  20.         SELECT CASE a$
  21.             CASE "I", "V", "X", "L", "C", "D", "M"
  22.                 'do nothing
  23.             CASE ELSE
  24.                 GOTO invalidInput
  25.         END SELECT
  26.     NEXT count
  27.     DO
  28.         r$ = LEFT$(rn$, 1)
  29.         SELECT CASE r$
  30.             CASE "M"
  31.                 decimalNumber = decimalNumber + 1000
  32.                 rn$ = MID$(rn$, 2, LEN(rn$))
  33.             CASE "C"
  34.                 IF LEFT$(rn$, 2) = "CM" THEN
  35.                     decimalNumber = decimalNumber + 900
  36.                     rn$ = MID$(rn$, 3, LEN(rn$))
  37.                 ELSEIF LEFT$(rn$, 2) = "CD" THEN
  38.                     decimalNumber = decimalNumber + 400
  39.                     rn$ = MID$(rn$, 3, LEN(rn$))
  40.                 ELSE
  41.                     decimalNumber = decimalNumber + 100
  42.                     rn$ = MID$(rn$, 2, LEN(rn$))
  43.                 END IF
  44.             CASE "D"
  45.                 decimalNumber = decimalNumber + 500
  46.                 rn$ = MID$(rn$, 2, LEN(rn$))
  47.             CASE "X"
  48.                 IF LEFT$(rn$, 2) = "XC" THEN
  49.                     decimalNumber = decimalNumber + 90
  50.                     rn$ = MID$(rn$, 3, LEN(rn$))
  51.                 ELSEIF LEFT$(rn$, 2) = "XL" THEN
  52.                     decimalNumber = decimalNumber + 40
  53.                     rn$ = MID$(rn$, 3, LEN(rn$))
  54.                 ELSE
  55.                     decimalNumber = decimalNumber + 10
  56.                     rn$ = MID$(rn$, 2, LEN(rn$))
  57.                 END IF
  58.             CASE "L"
  59.                 decimalNumber = decimalNumber + 50
  60.                 rn$ = MID$(rn$, 2, LEN(rn$))
  61.             CASE "I"
  62.                 IF LEFT$(rn$, 2) = "IX" THEN
  63.                     decimalNumber = decimalNumber + 9
  64.                     rn$ = MID$(rn$, 3, LEN(rn$))
  65.                 ELSEIF LEFT$(rn$, 2) = "IV" THEN
  66.                     decimalNumber = decimalNumber + 4
  67.                     rn$ = MID$(rn$, 3, LEN(rn$))
  68.                 ELSE
  69.                     decimalNumber = decimalNumber + 1
  70.                     rn$ = MID$(rn$, 2, LEN(rn$))
  71.                 END IF
  72.             CASE "V"
  73.                 decimalNumber = decimalNumber + 5
  74.                 rn$ = MID$(rn$, 2, LEN(rn$))
  75.         END SELECT
  76.     LOOP UNTIL rn$ = ""
  77.     COLOR n15, 0: PRINT "Decimal number: " + S$(decimalNumber)
  78.  
  79. SUB ConvertToRoman
  80.     decimalNumber = 0
  81.     romanNumeral$ = ""
  82.     INPUT "Type in the decimal number: ", decimalNumber
  83.     DO
  84.         IF decimalNumber >= 1000 THEN
  85.             romanNumeral$ = romanNumeral$ + "M"
  86.             decimalNumber = decimalNumber - 1000
  87.         ELSEIF decimalNumber >= 900 THEN
  88.             romanNumeral$ = romanNumeral$ + "CM"
  89.             decimalNumber = decimalNumber - 900
  90.         ELSEIF decimalNumber >= 500 THEN
  91.             romanNumeral$ = romanNumeral$ + "D"
  92.             decimalNumber = decimalNumber - 500
  93.         ELSEIF decimalNumber >= 400 THEN
  94.             romanNumeral$ = romanNumeral$ + "CD"
  95.             decimalNumber = decimalNumber - 400
  96.         ELSEIF decimalNumber >= 100 THEN
  97.             romanNumeral$ = romanNumeral$ + "C"
  98.             decimalNumber = decimalNumber - 100
  99.         ELSEIF decimalNumber >= 90 THEN
  100.             romanNumeral$ = romanNumeral$ + "XC"
  101.             decimalNumber = decimalNubmer - 90
  102.         ELSEIF decimalNumber >= 50 THEN
  103.             romanNumeral$ = romanNumeral$ + "L"
  104.             decimalNumber = decimalNumber - 50
  105.         ELSEIF decimalNumber >= 40 THEN
  106.             romanNumeral$ = romanNumeral$ + "XL"
  107.             decimalNumber = decimalNumber - 40
  108.         ELSEIF decimalNumber >= 10 THEN
  109.             romanNumeral$ = romanNumeral$ + "X"
  110.             decimalNumber = decimalNumber - 10
  111.         ELSEIF decimalNumber >= 9 THEN
  112.             romanNumeral$ = romanNumeral$ + "IX"
  113.             decimalNumber = decimalNumer - 9
  114.         ELSEIF decimalNumber >= 5 THEN
  115.             romanNumeral$ = romanNumeral$ + "V"
  116.             decimalNumber = decimalNumber - 5
  117.         ELSEIF decimalNumber >= 4 THEN
  118.             romanNumeral$ = romanNumeral$ + "IV"
  119.             decimalNumber = decimalNumber - 4
  120.         ELSEIF decimalNumber >= 1 THEN
  121.             romanNumeral$ = romanNumeral$ + "I"
  122.             decimalNumber = decimalNumber - 1
  123.         END IF
  124.     LOOP UNTIL decimalNumber = 0
  125.     COLOR 15, 0: PRINT "The Roman Numeral is " + romanNumeral$
  126.  
  127. 'for debugging
  128. FUNCTION P$ (escape)
  129.     pause$ = INPUT$(1)
  130.     IF escape = TRUE AND pause$ = CHR$(27) THEN END
  131.     P$ = pause$
  132. FUNCTION S$ (number)
  133.     rtn$ = ""
  134.     rtn$ = STR$(number)
  135.     rtn$ = LTRIM$(rtn$)
  136.     S$ = rtn$

I thought this would be a lot more difficult than it was

12
Programs / Tic Tac Toe
« on: August 18, 2021, 02:59:29 pm »
I have a Tic Tac Toe app on my phone. I often win. I had to make my own. . . . I swear my apartment has turned into one big SELECT CASE
Code: QB64: [Select]
  1. CONST TRUE = 1
  2. CONST FALSE = 0
  3. CONST xWon = 1
  4. CONST oWon = 2
  5. CONST tie = 3
  6. CONST acrossTop = 1
  7. CONST acrossMid = 2
  8. CONST acrossBot = 3
  9. CONST vertL = 4
  10. CONST vertM = 5
  11. CONST vertR = 6
  12. CONST diagTL = 7
  13. CONST diagBL = 8
  14. CONST delay = 0.02
  15. CONST computeR = 1
  16. CONST playeR = 2
  17.  
  18. DIM SHARED gameString$: gameString$ = ""
  19. DIM SHARED gameOver: gameOver = FALSE
  20.  
  21.  
  22. GOTO beginning
  23.  
  24. crap:
  25. PRINT "Error, line the error is on"
  26. CALL P(TRUE)
  27.  
  28. beginning:
  29. WIDTH 80, 50
  30.  
  31. CALL StartTheGame
  32. SUB EasyGame (firstMove)
  33.     CALL PrintGrid
  34.     FOR eachMove = 1 TO 9
  35.         winner = 0
  36.         IF firstMove = playeR THEN
  37.             here = GetLocation
  38.             gameString$ = gameString$ + "X" + S$(here)
  39.             PrintX (here)
  40.             winner = CheckTieOrWin
  41.             IF winner <> 0 THEN
  42.                 CALL EndOfGame
  43.                 EXIT FOR
  44.             END IF
  45.             somewhereElse:
  46.             here = INT(RND * 9) + 1
  47.             IF INSTR(gameString$, S$(here)) <> 0 THEN GOTO somewhereElse
  48.             gameString$ = gameString$ + "O" + S$(here)
  49.             CALL PrintO(here)
  50.             eachMove = eachMove + 1
  51.             winner = CheckTieOrWin
  52.             IF winner <> 0 THEN
  53.                 CALL EndOfGame
  54.                 EXIT FOR
  55.             END IF
  56.         ELSEIF firstMove = computeR THEN
  57.             anotherSomewhereElse:
  58.             here = INT(RND * 9) + 1
  59.             IF INSTR(gameString$, S$(here)) <> 0 THEN GOTO anotherSomewhereElse
  60.             gameString$ = gameString$ + "O" + S$(here)
  61.             CALL PrintO(here)
  62.             winner = CheckTieOrWin
  63.             IF winner <> 0 THEN
  64.                 CALL EndOfGame
  65.                 EXIT FOR
  66.             END IF
  67.             here = GetLocation
  68.             gameString$ = gameString$ + "X" + S$(here)
  69.             PrintX (here)
  70.             winner = CheckTieOrWin
  71.             IF winner <> 0 THEN
  72.                 CALL EndOfGame
  73.                 EXIT FOR
  74.             END IF
  75.         ELSE
  76.             PRINT "What": PRINT: PRINT "          the": PRINT: PRINT "                      FUCK!!!"
  77.         END IF
  78.     NEXT eachMove
  79.     END
  80.  
  81. SUB StartTheGame
  82.     whoGoesFirst = 0
  83.     repeat:
  84.     COLOR 11, 13
  85.     CLS
  86.     a$ = "Player is X, Computer is O"
  87.     LOCATE 15, Center(a$): PRINT a$
  88.     a$ = "Who goes first?  [C]omputer or [P]layer "
  89.     LOCATE 25, Center(a$): PRINT a$;
  90.     answer$ = UCASE$(INPUT$(1))
  91.     PRINT answer$
  92.     IF answer$ <> "C" AND answer$ <> "P" AND answer$ <> "X" AND answer$ <> "O" THEN
  93.         GOTO repeat
  94.     ELSEIF answer$ = "C" OR answer$ = "O" THEN
  95.         whoGoesFirst = computeR
  96.     ELSEIF answer$ = "P" OR answer$ = "X" THEN
  97.         whoGoesFirst = playeR
  98.     END IF
  99.  
  100.     a$ = "Difficulty? [E]asy or [H]ard "
  101.     LOCATE 30, Center(a$): PRINT a$;
  102.     difficulty$ = UCASE$(INPUT$(1))
  103.     PRINT difficulty$
  104.     IF difficulty$ = "E" THEN
  105.         CALL EasyGame(whoGoesFirst)
  106.     ELSEIF difficulty$ = "H" THEN
  107.         IF whoGoesFirst = computeR THEN
  108.             CALL ComputerFirst
  109.         ELSEIF whoGoesFirst = playeR THEN
  110.             CALL PlayerFirst
  111.         ELSE
  112.             GOTO repeat
  113.         END IF
  114.     ELSE
  115.         GOTO repeat
  116.     END IF
  117.  
  118.  
  119.  
  120. SUB PrintGrid
  121.     COLOR 11, 13
  122.     CLS
  123.     FOR y = 4 TO 45
  124.         LOCATE y, 30
  125.         PRINT CHR$(219)
  126.         LOCATE y, 50
  127.         PRINT CHR$(219)
  128.     NEXT y
  129.     FOR x = 17 TO 63
  130.         LOCATE 15, x
  131.         PRINT CHR$(219)
  132.         LOCATE 30, x
  133.         PRINT CHR$(219)
  134.     NEXT x
  135.     LOCATE 9, 22: PRINT "1"
  136.     LOCATE 9, 40: PRINT "2"
  137.     LOCATE 9, 58: PRINT "3"
  138.     LOCATE 23, 22: PRINT "4"
  139.     LOCATE 23, 40: PRINT "5"
  140.     LOCATE 23, 58: PRINT "6"
  141.     LOCATE 37, 22: PRINT "7"
  142.     LOCATE 37, 40: PRINT "8"
  143.     LOCATE 37, 58: PRINT "9"
  144.  
  145. SUB PrintX (location)
  146.     x = 19: y = 4
  147.     SELECT CASE location
  148.         CASE 1
  149.             LOCATE 9, 22: PRINT " "
  150.             x = 19: y = 4
  151.         CASE 2
  152.             LOCATE 9, 40: PRINT " "
  153.             x = 36: y = 4
  154.         CASE 3
  155.             LOCATE 9, 58: PRINT " "
  156.             x = 53: y = 4
  157.         CASE 4
  158.             LOCATE 23, 22: PRINT " "
  159.             x = 19: y = 18
  160.         CASE 5
  161.             LOCATE 23, 40: PRINT " "
  162.             x = 36: y = 18
  163.         CASE 6
  164.             LOCATE 23, 58: PRINT " "
  165.             x = 53: y = 18
  166.         CASE 7
  167.             LOCATE 37, 22: PRINT " "
  168.             x = 19: y = 32
  169.         CASE 8
  170.             LOCATE 37, 40: PRINT " "
  171.             x = 36: y = 32
  172.         CASE 9
  173.             x = 53: y = 32
  174.             LOCATE 37, 58: PRINT " "
  175.     END SELECT
  176.     FOR count = 0 TO 9
  177.         CALL PLOT(x + count, y + count)
  178.     NEXT count
  179.  
  180.     CALL PLOT(x + 9, y)
  181.     CALL PLOT(x + 8, y + 1)
  182.     CALL PLOT(x + 7, y + 2)
  183.     CALL PLOT(x + 6, y + 3)
  184.     CALL PLOT(x + 5, y + 4)
  185.     CALL PLOT(x + 4, y + 5)
  186.     CALL PLOT(x + 3, y + 6)
  187.     CALL PLOT(x + 2, y + 7)
  188.     CALL PLOT(x + 1, y + 8)
  189.     CALL PLOT(x, y + 9)
  190.  
  191. SUB HLIN (xStart, xEnd, y)
  192.     FOR count = xStart TO xEnd
  193.         LOCATE y, count
  194.         PRINT CHR$(219)
  195.         _DELAY (delay)
  196.     NEXT count
  197.  
  198. SUB VLIN (y1, y2, x)
  199.     FOR count = y1 TO y2
  200.         LOCATE count, x
  201.         PRINT CHR$(219)
  202.         _DELAY (delay)
  203.     NEXT count
  204.  
  205. SUB PLOT (x, y)
  206.     LOCATE y, x
  207.     PRINT CHR$(219)
  208.     _DELAY (delay)
  209.  
  210. SUB PrintO (location)
  211.     SELECT CASE location
  212.         CASE 1
  213.             x = 20: y = 4
  214.             LOCATE 9, 22: PRINT " "
  215.         CASE 2
  216.             LOCATE 9, 40: PRINT " "
  217.             x = 38: y = 4
  218.         CASE 3
  219.             LOCATE 9, 58: PRINT " "
  220.             x = 55: y = 4
  221.         CASE 4
  222.             LOCATE 23, 22: PRINT " "
  223.             x = 20: y = 18
  224.         CASE 5
  225.             LOCATE 23, 40: PRINT " "
  226.             x = 38: y = 18
  227.         CASE 6
  228.             LOCATE 23, 58: PRINT " "
  229.             x = 55: y = 18
  230.         CASE 7
  231.             LOCATE 37, 22: PRINT " "
  232.             x = 20: y = 34
  233.         CASE 8
  234.             LOCATE 37, 40: PRINT " "
  235.             x = 38: y = 34
  236.         CASE 9
  237.             LOCATE 37, 58: PRINT " "
  238.             x = 55: y = 34
  239.     END SELECT
  240.  
  241.     CALL HLIN(x, x + 4, y)
  242.     CALL PLOT(x - 1, y + 1): CALL PLOT(x + 5, y + 1)
  243.     CALL VLIN(y + 2, y + 6, x - 2): CALL VLIN(y + 2, y + 6, x + 6)
  244.     CALL PLOT(x - 1, y + 7): CALL PLOT(x + 5, y + 7)
  245.     CALL HLIN(x, x + 4, y + 8)
  246.  
  247. SUB ComputerFirst
  248.     CALL PrintGrid
  249.     gameString$ = "O1"
  250.     CALL PrintO(1)
  251.     playersMove = GetLocation
  252.     gameString$ = gameString$ + "X" + S$(playersMove)
  253.     CALL PrintX(playersMove)
  254.     SELECT CASE gameString$
  255.         CASE "O1X2", "O1X3", "O1X6", "O1X8", "O1X9"
  256.             gameString$ = gameString$ + "O7"
  257.             CALL PrintO(7)
  258.         CASE "O1X4", "O1X5"
  259.             gameString$ = gameString$ + "O3"
  260.             CALL PrintO(3)
  261.         CASE "O1X7"
  262.             gameString$ = gameString$ + "O9"
  263.             CALL PrintO(9)
  264.     END SELECT
  265.     playersMove = GetLocation
  266.     gameString$ = gameString$ + "X" + S$(playersMove)
  267.     CALL PrintX(playersMove)
  268.     SELECT CASE gameString$
  269.         CASE "O1X2O7X3", "O1X2O7X5", "O1X2O7X6", "O1X2O7X8", "O1X2O7X9"
  270.             gameString$ = gameString$ + "O4"
  271.             CALL PrintO(4)
  272.             CALL WinLine(vertL)
  273.         CASE "O1X2O7X4"
  274.             gameString$ = gameString$ + "O9"
  275.             CALL PrintO(9)
  276.         CASE "O1X3O7X2", "O1X3O7X5", "O1X3O7X6", "O1X3O7X8", "O1X3O7X9"
  277.             gameString$ = gameString$ + "O4"
  278.             CALL PrintO(4)
  279.             CALL WinLine(vertL)
  280.         CASE "O1X3O7X4"
  281.             gameString$ = gameString$ + "O9"
  282.             CALL PrintO(9)
  283.         CASE "O1X4O3X5", "O1X4O3X6", "O1X4O3X7", "O1X4O3X8", "O1X4O3X9"
  284.             gameString$ = gameString$ + "O2"
  285.             CALL PrintO(2)
  286.             CALL WinLine(acrossTop)
  287.         CASE "O1X4O3X2"
  288.             gameString$ = gameString$ + "O5"
  289.             CALL PrintO(5)
  290.         CASE "O1X5O3X4", "O1X5O3X6", "O1X5O3X7", "O1X5O3X8", "O1X5O3X9"
  291.             gameString$ = gameString$ + "O2"
  292.             CALL PrintO(2)
  293.             CALL WinLine(acrossTop)
  294.         CASE "O1X5O3X2"
  295.             gameString$ = gameString$ + "O8"
  296.             CALL PrintO(8)
  297.         CASE "O1X6O7X2", "O1X6O7X3", "O1X6O7X5", "O1X6O7X8", "O1X6O7X9"
  298.             gameString$ = gameString$ + "O4"
  299.             CALL PrintO(4)
  300.             CALL WinLine(vertL)
  301.         CASE "O1X6O7X4"
  302.             gameString$ = gameString$ + "O5"
  303.             CALL PrintO(5)
  304.         CASE "O1X7O9X2", "O1X7O9X3", "O1X7O9X4", "O1X7O9X6", "O1X7O9X8"
  305.             gameString$ = gameString$ + "O5"
  306.             CALL PrintO(5)
  307.             CALL WinLine(diagTL)
  308.         CASE "O1X7O9X5"
  309.             gameString$ = gameString$ + "O3"
  310.             CALL PrintO(3)
  311.         CASE "O1X8O7X2", "O1X8O7X3", "O1X8O7X5", "O1X8O7X6", "O1X8O7X9"
  312.             gameString$ = gameString$ + "O4"
  313.             CALL PrintO(4)
  314.             CALL WinLine(vertL)
  315.         CASE "O1X8O7X4"
  316.             gameString$ = gameString$ + "O3"
  317.             CALL PrintO(3)
  318.         CASE "O1X9O7X2", "O1X9O7X3", "O1X9O7X5", "O1X9O7X6", "O1X9O7X8"
  319.             gameString$ = gamerstring$ + "O4"
  320.             CALL PrintO(4)
  321.             CALL WinLine(vertL)
  322.         CASE "O1X9O7X4"
  323.             gameString$ = gameString$ + "O3"
  324.             CALL PrintO(3)
  325.     END SELECT
  326.     winner = CheckTieOrWin
  327.     IF winner <> 0 THEN CALL EndOfGame
  328.     playersMove = GetLocation
  329.     gameString$ = gameString$ + "X" + S$(playersMove)
  330.     CALL PrintX(playersMove)
  331.     winner = CheckTieOrWin
  332.     IF winner <> 0 THEN CALL EndOfGame
  333.     SELECT CASE gameString$
  334.         CASE "O1X2O7X4O9X3", "O1X2O7X4O9X5", "O1X2O7X4O9X6"
  335.             gameString$ = gameString$ + "O8"
  336.             CALL PrintO(8)
  337.             CALL WinLine(acrossBot)
  338.         CASE "O1X2O7X4O9X8"
  339.             gameString$ = gameString$ + "O5"
  340.             CALL PrintO(5)
  341.             CALL WinLine(diagTL)
  342.         CASE "O1X3O7X4O9X2", "O1X3O7X4O9X5", "O1X3O7X4O9X6"
  343.             gameString$ = gameString$ + "O8"
  344.             CALL PrintO(8)
  345.             CALL WinLine(acrossBot)
  346.         CASE "O1X3O7X4O9X8"
  347.             gamesring$ = gamestr4ing$ + "O5"
  348.             CALL PrintO(5)
  349.             CALL WinLine(diagTL)
  350.         CASE "O1X4O3X2O5X6", "O1X4O3X2O5X7", "O1X4O3X2O5X8"
  351.             gameString$ = gameString$ + "O9"
  352.             CALL PrintO(9)
  353.             CALL WinLine(diagTL)
  354.         CASE "O1X4O3X2O5X9"
  355.             CALL PrintO(7)
  356.             CALL WinLine(diagBL)
  357.         CASE "O1X5O3X2O8X4"
  358.             gameString$ = gameString$ + "O6"
  359.             CALL PrintO(6)
  360.         CASE "O1X5O3X2O8X6", "O1X5O3X2O8X9"
  361.             gameString$ = gameString$ + "O4"
  362.             CALL PrintO(4)
  363.         CASE "O1X5O3X2O8X7"
  364.             gameString$ = gameString$ + "O9"
  365.             CALL PrintO(9)
  366.         CASE "O1X6O7X4O5X2", "O1X6O7X4O5X3", "O1X6O7X4O5X8"
  367.             gameString$ = gameString$ + "O9"
  368.             CALL PrintO(9)
  369.             CALL WinLine(diagTL)
  370.         CASE "O1X6O7X4O5X9"
  371.             gameString$ = gameString$ + "O3"
  372.             CALL PrintO(3)
  373.             CALL WinLine(diagBL)
  374.         CASE "O1X7O9X5O3X2", "O1X7O9X5O3X4", "O1X7O9X5O3X8"
  375.             gameString$ = gameString$ + "O6"
  376.             CALL PrintO(6)
  377.             CALL WinLine(vertR)
  378.         CASE "O1X7O9X5O3X6"
  379.             gameString$ = gameString$ + "O2"
  380.             CALL PrintO(2)
  381.             CALL WinLine(acrossTop)
  382.         CASE "O1X8O7X4O3X2", "O1X8O7X4O3X6", "O1X8O7X4O3X9"
  383.             gameString$ = gameString$ + "O5"
  384.             CALL PrintO(5)
  385.             CALL WinLine(diagBL)
  386.         CASE "O1X8O7X4O3X5"
  387.             gameString$ = gameString$ + "O2"
  388.             CALL PrintO(2)
  389.             CALL WinLine(acrossTop)
  390.         CASE "O1X9O7X4O3X2"
  391.             gameString$ = gameString$ + "O5"
  392.             CALL PrintO(5)
  393.             CALL WinLine(diagBL)
  394.         CASE "O1X9O7X4O3X5", "O1X9O7X4O3X6", "O1X9O7X4O3X8"
  395.             gameString$ = gameString$ + "O2"
  396.             CALL PrintO(2)
  397.             CALL WinLine(acrossTop)
  398.     END SELECT
  399.     winner = CheckTieOrWin
  400.     IF winner <> 0 THEN CALL EndOfGame
  401.     playersMove = GetLocation
  402.     gameString$ = gameString$ + "X" + S$(playersMove)
  403.     winner = CheckTieOrWin
  404.     IF winner <> 0 THEN CALL EndOfGame
  405.     CALL PrintX(playersMove)
  406.     SELECT CASE gameString$
  407.         CASE "O1X5O3X2O8X4O6X7" ', "O1X5O3X2O8X6O4X7"
  408.             gameString$ = gamesring$ + "O9"
  409.             CALL PrintO(9)
  410.             CALL WinLine(vertR)
  411.         CASE "O1X5O3X2O8X4O6X9"
  412.             gameString$ = gameString$ + "O7"
  413.             CALL PrintO(8)
  414.         CASE "O1X5O3X2O8X6O4X7"
  415.             gameString$ = gameString$ + "O9"
  416.             CALL PrintO(9)
  417.         CASE "O1X5O3X2O8X6O4X9"
  418.             gameString$ = gameString$ + "O7"
  419.             CALL PrintO(7)
  420.             CALL WinLine(vertL)
  421.         CASE "O1X5O3X2O8X9O4X7"
  422.             gameString$ = gameString$ + "O6"
  423.             CALL PrintO(6)
  424.         CASE "O1X5O3X2O8X7O9X4"
  425.             gameString$ = gameString$ + "O6"
  426.             CALL PrintO(6)
  427.             CALL WinLine(vertR)
  428.         CASE "O1X5O3X2O8X7O9X6"
  429.             gameString$ = gameString$ + "O4"
  430.             CALL PrintO(4)
  431.         CASE "O1X5O3X2O8X9O4X6"
  432.             gameString$ = gameString$ + "O7"
  433.             CALL PrintO(7)
  434.             CALL WinLine(vertL)
  435.     END SELECT
  436.     winner = CheckTieOrWin
  437.     IF winner <> 0 THEN CALL EndOfGame
  438.  
  439. SUB EndOfGame
  440.     _DELAY (1)
  441.     repeat:
  442.     CLS
  443.     COLOR 0, 13
  444.     a$ = "Do you want to watch a replay? (Y / N) "
  445.     LOCATE 20, Center(a$)
  446.     PRINT a$;
  447.     replay$ = UCASE$(INPUT$(1))
  448.     PRINT replay$
  449.     IF replay$ <> "Y" AND replay$ <> "N" THEN GOTO repeat
  450.     IF replay$ = "Y" THEN CALL WatchReplay
  451.     a$ = "Play again? (Y / N) "
  452.     LOCATE 30, Center(a$)
  453.     COLOR 0, 13: PRINT a$;
  454.     tryAgain:
  455.     again$ = UCASE$(INPUT$(1))
  456.     PRINT again$
  457.     IF again$ <> "Y" AND again$ <> "N" THEN GOTO tryAgain
  458.     IF again$ = "Y" THEN CALL StartTheGame
  459.  
  460. SUB WatchReplay
  461.     CALL PrintGrid
  462.     FOR countThroughString = 1 TO LEN(gameString$) STEP 2
  463.         mover$ = MID$(gameString$, countThroughString, 1)
  464.         play$ = MID$(gameString$, countThroughString + 1, 1)
  465.         IF mover$ = "X" THEN
  466.             CALL PrintX(VAL(play$))
  467.         ELSEIF mover$ = "O" THEN
  468.             CALL PrintO(VAL(play$))
  469.         END IF
  470.         _DELAY (0.8)
  471.     NEXT countThroughString
  472.     winner = CheckTieOrWin
  473.     IF winner <> 0 THEN CALL EndOfGame
  474.  
  475. FUNCTION CheckTieOrWin
  476.     'allFilled = TRUE
  477.     rtn = 0
  478.     who$ = "X"
  479.     IF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "2") <> 0 AND INSTR(gameString$, who$ + "3") <> 0 THEN
  480.         CALL WinLine(acrossTop)
  481.         rtn = xWon
  482.     ELSEIF INSTR(gameString$, who$ + "4") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "6") <> 0 THEN
  483.         CALL WinLine(acrossMid)
  484.         rtn = xWon
  485.     ELSEIF INSTR(gameString$, who$ + "7") <> 0 AND INSTR(gameString$, who$ + "8") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  486.         CALL WinLine(acrossBot)
  487.         rtn = xWon
  488.     ELSEIF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "4") <> 0 AND INSTR(gameString$, who$ + "7") <> 0 THEN
  489.         CALL WinLine(vertL)
  490.         rtn = xWon
  491.     ELSEIF INSTR(gameString$, who$ + "2") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "8") <> 0 THEN
  492.         CALL WinLine(vertM)
  493.         rtn = xWon
  494.     ELSEIF INSTR(gameString$, who$ + "3") <> 0 AND INSTR(gameString$, who$ + "6") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  495.         CALL WinLine(vertR)
  496.         rtn = xWon
  497.     ELSEIF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  498.         CALL WinLine(diagTL)
  499.         rtn = xWon
  500.     ELSEIF INSTR(gameString$, who$ + "3") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "7") <> 0 THEN
  501.         CALL WinLine(diagBL)
  502.         rtn = xWon
  503.     END IF
  504.     who$ = "O"
  505.     IF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "2") <> 0 AND INSTR(gameString$, who$ + "3") <> 0 THEN
  506.         CALL WinLine(acrossTop)
  507.         rtn = oWon
  508.     ELSEIF INSTR(gameString$, who$ + "4") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "6") <> 0 THEN
  509.         WinLine (acrossMid)
  510.         rtn = oWon
  511.     ELSEIF INSTR(gameString$, who$ + "7") <> 0 AND INSTR(gameString$, who$ + "8") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  512.         WinLine (acrossBot)
  513.         rtn = oWon
  514.     ELSEIF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "4") <> 0 AND INSTR(gameString$, who$ + "7") <> 0 THEN
  515.         WinLine (vertL)
  516.         rtn = oWon
  517.     ELSEIF INSTR(gameString$, who$ + "2") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "8") <> 0 THEN
  518.         CALL WinLine(vertM)
  519.         rtn = oWon
  520.     ELSEIF INSTR(gameString$, who$ + "3") <> 0 AND INSTR(gameString$, who$ + "6") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  521.         CALL WinLine(vertR)
  522.         rtn = oWon
  523.     ELSEIF INSTR(gameString$, who$ + "1") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "9") <> 0 THEN
  524.         CALL WinLine(diagTL)
  525.         rtn = oWon
  526.     ELSEIF INSTR(gameString$, who$ + "3") <> 0 AND INSTR(gameString$, who$ + "5") <> 0 AND INSTR(gameString$, who$ + "7") <> 0 THEN
  527.         WinLine (diagBL)
  528.         rtn = oWon
  529.     ELSEIF LEN(gameString$) = 18 THEN
  530.         rtn = tie
  531.     END IF
  532.     IF rtn <> 0 THEN
  533.         CALL EndOfGame
  534.     ELSE
  535.         CheckTieOrWin = rtn
  536.     END IF
  537.  
  538. SUB PlayerFirst
  539.     CALL PrintGrid
  540.     playerMove = GetLocation
  541.     gameString$ = "X" + S$(playerMove)
  542.     PrintX (playerMove)
  543.     SELECT CASE playerMove
  544.         CASE 1
  545.             CALL X1
  546.         CASE 2
  547.             CALL X2
  548.         CASE 3
  549.             CALL X3
  550.         CASE 4
  551.             CALL X4
  552.         CASE 5
  553.             CALL X5
  554.         CASE 6
  555.             CALL X6
  556.         CASE 7
  557.             CALL X7
  558.         CASE 8
  559.             CALL X8
  560.         CASE 9
  561.             CALL X9
  562.     END SELECT
  563.     CALL EndOfGame
  564.  
  565. SUB X1
  566.     gameString$ = gameString$ + "O5"
  567.     CALL PrintO(5)
  568.     playerMove = GetLocation
  569.     gameString$ = gameString$ + "X" + S$(playerMove)
  570.     CALL PrintX(playerMove)
  571.     SELECT CASE gameString$
  572.         CASE "X1O5X2"
  573.             gameString$ = gameString$ + "O3"
  574.             CALL PrintO(3)
  575.         CASE "X1O5X3"
  576.             gameString$ = gameString$ + "O2"
  577.             CALL PrintO(2)
  578.         CASE "X1O5X4"
  579.             gameString$ = gameString$ + "O7"
  580.             CALL PrintO(7)
  581.         CASE "X1O5X6"
  582.             gameString$ = gameString$ + "O3"
  583.             CALL PrintO(3)
  584.         CASE "X1O5X7"
  585.             gameString$ = gameString$ + "O4"
  586.             CALL PrintO(4)
  587.         CASE "X1O5X8"
  588.             gameString$ = gameString$ + "O4"
  589.             CALL PrintO(4)
  590.         CASE "X1O5X9"
  591.             gameString$ = gameString$ + "O2"
  592.             CALL PrintO(2)
  593.     END SELECT
  594.     playerMove = GetLocation
  595.     '    COLOR 15, 0: LOCATE 46, 10: PRINT gameString$: COLOR 11, 13: CALL P(TRUE)
  596.     gameString$ = gameString$ + "X" + S$(playerMove)
  597.     CALL PrintX(playerMove)
  598.     SELECT CASE gameString$
  599.         CASE "X1O5X2O3X4", "X1O5X2O3X6", "X1O5X2O3X8", "X1O5X2O3X9"
  600.             gameString$ = gameString$ + "O7"
  601.             CALL PrintO(7)
  602.             CALL WinLine(diagBL)
  603.         CASE "X1O5X2O3X7"
  604.             gameString$ = gameString$ + "O4"
  605.             CALL PrintO(4)
  606.         CASE "X1O5X3O2X4", "X1O5X3O2X6", "X1O5X3O2X7", "X1O5X3O2X9"
  607.             gameString$ = gameString$ + "O8"
  608.             CALL PrintO(8)
  609.             CALL WinLine(vertM)
  610.         CASE "X1O5X3O2X8"
  611.             gameString$ = gameString$ + "O4"
  612.             CALL PrintO(4)
  613.         CASE "X1O5X4O7X2", "X1O5X4O7X6", "X1O5X4O7X8", "X1O5X4O7X9"
  614.             gameString$ = gameString$ + "O3"
  615.             CALL PrintO(3)
  616.             CALL WinLine(diagBL)
  617.         CASE "X1O5X4O7X3"
  618.             gameString$ = gameString$ + "O2"
  619.             CALL PrintO(2)
  620.         CASE "X1O5X6O3X2", "X1O5X6O3X4", "X1O5X6O3X8", "X1O5X6O3X9"
  621.             gameString$ = gameString$ + "O7"
  622.             CALL PrintO(7)
  623.             CALL WinLine(diagBL)
  624.         CASE "X1O5X6O3X7"
  625.             gameString$ = gameString$ + "O4"
  626.             CALL PrintO(4)
  627.         CASE "X1O5X7O4X2", "X1O5X7O4X3", "X1O5X7O4X8", "X1O5X7O4X9"
  628.             gameString$ = gameString$ + "O6"
  629.             CALL PrintO(6)
  630.             CALL WinLine(acrossMid)
  631.         CASE "X1O5X7O4X6"
  632.             gameString$ = gameString$ + "O2"
  633.             CALL PrintO(2)
  634.         CASE "X1O5X8O4X2", "X1O5X8O4X3", "X1O5X8O4X7", "X1O5X8O4X9"
  635.             gameString$ = gameString$ + "O6"
  636.             CALL PrintO(6)
  637.             CALL WinLine(acrossMid)
  638.         CASE "X1O5X8O4X6"
  639.             gameString$ = gameString$ + "O3"
  640.             CALL PrintO(3)
  641.         CASE "X1O5X9O2X3", "X1O5X9O2X4", "X1O5X9O2X6", "X1O5X9O2X7"
  642.             gameString$ = gameString$ + "O8"
  643.             CALL PrintO(8)
  644.             CALL WinLine(vertM)
  645.         CASE "X1O5X9O2X8"
  646.             gameString$ = gameString$ + "O7"
  647.             CALL PrintO(7)
  648.     END SELECT
  649.     playerMove = GetLocation
  650.     gameString$ = gameString$ + "X" + S$(playerMove)
  651.     CALL PrintX(playerMove)
  652.     SELECT CASE gameString$
  653.         CASE "X1O5X2O3X7O4X8", "X1O5X2O3X7O4X9"
  654.             gameString$ = gameString$ + "O6"
  655.             CALL PrintO(6)
  656.             CALL WinLine(acrossMid)
  657.         CASE "X1O5X2O3X7O4X6"
  658.             gameString$ = gameString$ + "O8"
  659.             CALL PrintO(8)
  660.         CASE "X1O5X3O2X8O4X7", "X1O5X3O2X8O4X9"
  661.             gameString$ = gameString$ + "O6"
  662.             CALL PrintO(6)
  663.             CALL WinLine(acrossMid)
  664.         CASE "X1O5X3O2X8O4X6"
  665.             gameString$ = gameString$ + "O9"
  666.             CALL PrintO(9)
  667.         CASE "X1O5X4O7X3O2X6", "X1O5X4O7X3O2X9"
  668.             gameString$ = gameString$ + "O8"
  669.             CALL PrintO(8)
  670.             CALL WinLine(vertM)
  671.         CASE "X1O5X4O7X3O2X8"
  672.             gameString$ = gameString$ + "O6"
  673.             CALL PrintO(6)
  674.         CASE "X1O5X6O3X7O4X2", "X1O5X6O3X7O4X9"
  675.             gameString$ = gameString$ + "O8"
  676.             CALL PrintO(8)
  677.         CASE "X1O5X6O3X7O4X8"
  678.             gameString$ = gameString$ + "O9"
  679.             CALL PrintO(9)
  680.         CASE "X1O5X7O4X6O2X3", "X1O5X7O4X6O2X9"
  681.             gamest4ring$ = gameastring$ + "O8"
  682.             CALL PrintO(8)
  683.             CALL WinLine(vertM)
  684.         CASE "X1O5X7O4X6O2X8"
  685.             gameString$ = gameString$ + "O9"
  686.             CALL PrintO(9)
  687.         CASE "X1O5X8O4X6O3X2", "X1O5X8O4X6O3X9"
  688.             gameString$ = gameString$ + "O7"
  689.             CALL PrintO(7)
  690.             CALL WinLine(diagBL)
  691.         CASE "X1O5X8O4X6O3X7"
  692.             gameString$ = gameString$ + "O9"
  693.             CALL PrintO(9)
  694.         CASE "X1O5X9O2X8O7X4", "X1O5X9O2X8O7X6"
  695.             gameString$ = gameString$ + "O3"
  696.             CALL PrintO(3)
  697.             CALL WinLine(diagBL)
  698.         CASE "X1O5X9O2X8O7X3"
  699.             gameString$ = gameString$ + "O6"
  700.             CALL PrintO(6)
  701.     END SELECT
  702.     playerMove = GetLocation
  703.     gameString$ = gameString$ + "X" + S$(playerMove)
  704.     CALL PrintX(playerMove)
  705.  
  706. SUB WinLine (direction)
  707.     COLOR 10, 13
  708.     SELECT CASE direction
  709.         CASE acrossTop
  710.             CALL HLIN(16, 62, 9)
  711.         CASE acrossMid
  712.             CALL HLIN(16, 62, 23)
  713.         CASE acrossBot
  714.             CALL HLIN(16, 62, 37)
  715.         CASE vertL
  716.             CALL VLIN(2, 44, 22)
  717.         CASE vertM
  718.             CALL VLIN(2, 44, 40)
  719.         CASE vertR
  720.             CALL VLIN(2, 44, 57)
  721.         CASE diagTL
  722.             FOR count = 0 TO 40
  723.                 CALL PLOT(count + 21, count + 4)
  724.             NEXT count
  725.         CASE diagBL
  726.             y = 42 '48
  727.             FOR count = 0 TO 40
  728.                 CALL PLOT(count + 21, y)
  729.                 y = y - 1
  730.             NEXT count
  731.     END SELECT
  732.  
  733. SUB X2
  734.     gameString$ = gameString$ + "O5"
  735.     CALL PrintO(5)
  736.     playerMove = GetLocation
  737.     gameString$ = gameString$ + "X" + S$(playerMove)
  738.     CALL PrintX(playerMove)
  739.     SELECT CASE gameString$
  740.         CASE "X2O5X1"
  741.             gameString$ = gameString$ + "O3"
  742.             CALL PrintO(3)
  743.         CASE "X2O5X3"
  744.             gameString$ = gameString$ + "O1"
  745.             CALL PrintO(1)
  746.         CASE "X2O5X4"
  747.             gameString$ = gameString$ + "O1"
  748.             CALL PrintO(1)
  749.         CASE "X2O5X6"
  750.             gameString$ = gameString$ + "O3"
  751.             CALL PrintO(3)
  752.         CASE "X2O5X7"
  753.             gameString$ = gameString$ + "O1"
  754.             CALL PrintO(1)
  755.         CASE "X2O5X8"
  756.             gameString$ = gameString$ + "O1"
  757.             CALL PrintO(1)
  758.         CASE "X2O5X9"
  759.             gameString$ = gameString$ + "O3"
  760.             CALL PrintO(3)
  761.     END SELECT
  762.     playerMove = GetLocation
  763.     gameString$ = gameString$ + "X" + S$(playerMove)
  764.     CALL PrintX(playerMove)
  765.     SELECT CASE gameString$
  766.         CASE "X2O5X1O3X4", "X2O5X1O3X6", "X2O5X1O3X8", "X2O5X1O3X9"
  767.             gameString$ = gameString$ + "O7"
  768.             CALL PrintO(7)
  769.             CALL WinLine(diagBL)
  770.         CASE "X2O5X1O3X7"
  771.             gameString$ = gameString$ + "O4"
  772.             CALL PrintO(4)
  773.         CASE "X2O5X3O1X4", "X2O5X3O1X6", "X2O5X3O1X7", "X2O5X3O1X8"
  774.             gameString$ = gameString$ + "O9"
  775.             CALL PrintO(9)
  776.             CALL WinLine(diagTL)
  777.         CASE "X2O5X3O1X9"
  778.             gameString$ = gameString$ + "O6"
  779.             CALL PrintO(6)
  780.         CASE "X2O5X4O1X3", "X2O5X4O1X6", "X2O5X4O1X7", "X2O5X4O1X8"
  781.             gameString$ = gameString$ + "O9"
  782.             CALL PrintO(9)
  783.             CALL WinLine(diagTL)
  784.         CASE "X2O5X4O1X9"
  785.             gameString$ = gameString$ + "O3"
  786.             CALL PrintO(3)
  787.         CASE "X2O5X6O3X1", "X2O5X6O3X4", "X2O5X6O3X8", "X2O5X6O3X9"
  788.             gameString$ = gameString$ + "O7"
  789.             CALL PrintO(7)
  790.             CALL WinLine(diagBL)
  791.         CASE "X2O5X6O3X7"
  792.             gameString$ = gameString$ + "O1"
  793.             CALL PrintO(1)
  794.         CASE "X2O5X7O1X3", "X2O5X7O1X4", "X2O5X7O1X6", "X2O5X7O1X8"
  795.             gameString$ = gameString$ + "O9"
  796.             CALL PrintO(9)
  797.             CALL WinLine(diagTL)
  798.         CASE "X2O5X7O1X9"
  799.             gameString$ = gameString$ + "O8"
  800.             CALL PrintO(8)
  801.         CASE "X2O5X8O1X3", "X2O5X8O1X4", "X2O5X8O1X6", "X2O5X8O1X7"
  802.             gameString$ = gameString$ + "O9"
  803.             CALL PrintO(9)
  804.             CALL WinLine(diagTL)
  805.         CASE "X2O5X8O1X9"
  806.             gameString$ = gameString$ + "O7"
  807.             CALL PrintO(7)
  808.         CASE "X2O5X9O3X1", "X2O5X9O3X4", "X2O5X9O3X6", "X2O5X9O3X8"
  809.             gameString$ = gameString$ + "O7"
  810.             CALL PrintO(7)
  811.             CALL WinLine(diagBL)
  812.         CASE "X2O5X9O3X7"
  813.             gameString$ = gameString$ + "O8"
  814.             CALL PrintO(8)
  815.     END SELECT
  816.     playerMove = GetLocation
  817.     gameString$ = gameString$ + "X" + S$(playerMove)
  818.     CALL PrintX(playerMove)
  819.     SELECT CASE gameString$
  820.         CASE "X2O5X1O3X7O4X8", "X2O5X1O3X7O4X9"
  821.             gameString$ = gameString$ + "X6"
  822.             CALL PrintO(6)
  823.             CALL WinLine(acrossMid)
  824.         CASE "X2O5X1O3X7O4X6"
  825.             gameString$ = gameString$ + "O8"
  826.             CALL PrintO(8)
  827.         CASE "X2O5X3O1X9O6X7", "X2O5X3O1X9O6X8"
  828.             gameString$ = gameString$ + "4"
  829.             CALL PrintO(4)
  830.             CALL WinLine(acrossMid)
  831.         CASE "X2O5X3O1X9O6X4"
  832.             gameString$ = gameString$ + "O7"
  833.             CALL PrintO(7)
  834.         CASE "X2O5X4O1X9O3X6", "X2O5X4O1X9O3X8"
  835.             gameString$ = gameString$ + "O7"
  836.             CALL PrintO(7)
  837.             CALL WinLine(diagBL)
  838.         CASE "X2O5X4O1X9O3X7"
  839.             gameString$ = gameString$ + "O8"
  840.             CALL PrintO(8)
  841.         CASE "X2O5X6O3X7O1X4", "X2O5X6O3X7O1X8"
  842.             gameString$ = gameString$ + "O9"
  843.             CALL PrintO(9)
  844.             CALL WinLine(diagTL)
  845.         CASE "X2O5X6O3X7O1X9"
  846.             gameString$ = gameString$ + "O8"
  847.             CALL PrintO(8)
  848.         CASE "X2O5X7O1X9O8X3"
  849.             gameString$ = gameString$ + "O6"
  850.             CALL PrintO(6)
  851.         CASE "X2O5X7O1X9O8X6"
  852.             gameString$ = gameString$ + "O3"
  853.             CALL PrintO(3)
  854.         CASE "X2O5X7O1X9O8X4"
  855.             gameString$ = gasmestring$ + "O3"
  856.             CALL PrintO(3)
  857.         CASE "X2O5X8O1X9O7X4", "X2O5X8O1X9O7X6"
  858.             gameString$ = gameString$ + "O3"
  859.             CALL PrintO(3)
  860.             CALL WinLine(diagBL)
  861.         CASE "X2O5X8O1X9O7X3"
  862.             gameString$ = gameString$ + "O4"
  863.             CALL PrintO(4)
  864.             CALL WinLine(vertL)
  865.         CASE "X2O5X9O3X7O8X1"
  866.             gameString$ = gameString$ + "O4"
  867.             CALL PrintO(4)
  868.         CASE "X2O5X9O3X7O8X4"
  869.             gameString$ = gameString$ + "O1"
  870.             CALL PrintO(1)
  871.         CASE "X2O5X9O3X7O8X6"
  872.             gameString$ = gameString$ + "O1"
  873.             CALL PrintO(1)
  874.     END SELECT
  875.     playerMove = GetLocation
  876.     gameString$ = gameString$ + "X" + S$(playerMove)
  877.     CALL PrintX(playerMove)
  878.  
  879. SUB X3
  880.     gameString$ = gameString$ + "O5"
  881.     CALL PrintO(5)
  882.     playerMove = GetLocation
  883.     gameString$ = gameString$ + "X" + S$(playerMove)
  884.     SELECT CASE gameString$
  885.         CASE "X3O5X1"
  886.             gameString$ = gameString$ + "O2"
  887.             CALL PrintO(2)
  888.         CASE "X3O5X2"
  889.             gameString$ = gameString$ + "O1"
  890.             CALL PrintO(1)
  891.         CASE "X3O5X4"
  892.             gameString$ = gameString$ + "O1"
  893.             CALL PrintO(1)
  894.         CASE "X3O5X6"
  895.             gameString$ = gameString$ + "O9"
  896.             CALL PrintO(9)
  897.         CASE "X3O5X7"
  898.             gameString$ = gameString$ + "O2"
  899.             CALL PrintO(2)
  900.         CASE "X3O5X8"
  901.             gameString$ = gameString$ + "O9"
  902.             CALL PrintO(9)
  903.         CASE "X3O5X9"
  904.             gameString$ = gameString$ + "O6"
  905.             CALL PrintO(6)
  906.     END SELECT
  907.     playerMove = GetLocation
  908.     gameString$ = gameString$ + "X" + S$(playerMove)
  909.     SELECT CASE gameString$
  910.         CASE "X3O5X1O2X4", "X3O5X1O2X6", "X3O5X1O2X7", "X3O5X1O2X9"
  911.             gameString$ = gameString$ + "O8"
  912.             CALL PrintO(8)
  913.             CALL WinLine(vertM)
  914.         CASE "X3O5X1O2X8" '********
  915.             gameString$ = gameString$ + "O4"
  916.             CALL PrintO(4)
  917.         CASE "X3O5X2O1X4", "X3O5X2O1X6", "X3O5X2O1X7", "X3O5X2O1X8"
  918.             gameString$ = gameString$ + "O9"
  919.             CALL PrintO(9)
  920.             CALL WinLine(diagTL)
  921.         CASE "X3O5X2O1X9" ' ***************
  922.             gameString$ = gameString$ + "O6"
  923.             CALL PrintO(6)
  924.         CASE "X3O5X4O1X2", "X3O5X4O1X6", "X3O5X4O1X7", "X3O5X4O1X8"
  925.             gameString$ = gamestgring$ + "O9"
  926.             CALL PrintO(9)
  927.             CALL WinLine(diagTL)
  928.         CASE "X3O5X4O1X9" '***********
  929.             gameString$ = gameString$ + "O6"
  930.             CALL PrintO(6)
  931.         CASE "X3O5X6O9X2", "X3O5X6O9X4", "X3O5X6O9X7", "X3O5X6O9X8"
  932.             gameString$ = gameString$ + "O1"
  933.             CALL PrintO(1)
  934.             CALL WinLine(diagTL)
  935.         CASE "X3O5X6O9X1" '***********
  936.             gameString$ = gameString$ + "O2"
  937.             CALL PrintO(2)
  938.         CASE "X3O5X7O2X1", "X3O5X7O2X4", "X3O5X7O2X6", "X3O5X7O2X9"
  939.             gameString$ = gameString$ + "O8"
  940.             CALL PrintO(8)
  941.             CALL WinLine(vertM)
  942.         CASE "X3O5X7O2X8" '*********
  943.             gameString$ = gameString$ + "O9"
  944.             CALL PrintO(9)
  945.         CASE "X3O5X8O9X2", "X3O5X8O9X4", "X3O5X8O9X6", "X3O5X8O9X7"
  946.             gameString$ = gameString$ + "O1"
  947.             CALL PrintO(1)
  948.             CALL WinLine(diagTL)
  949.         CASE "X3O5X8O9X1" '************
  950.             gameString$ = gameString$ + "O2"
  951.             CALL PrintO(2)
  952.         CASE "X3O5X9O6X1", "X3O5X9O6X2", "X3O5X9O6X7", "X3O5X9O6X8"
  953.             gameString$ = gameString$ + "O4"
  954.             CALL PrintO(4)
  955.             CALL WinLine(acrossMid)
  956.         CASE "X3O5X9O6X4" '*******
  957.             gameString$ = gameString$ + "O2"
  958.             CALL PrintO(2)
  959.     END SELECT
  960.     playerMove = GetLocation
  961.     gameString$ = gameString$ + "X" + S$(playerMove)
  962.     SELECT CASE gameString$
  963.         CASE "X3O5X1O2X8O4X7", "X3O5X1O2X8O4X9"
  964.             gameString$ = gameString$ + "O6"
  965.             CALL PrintO(6)
  966.             CALL WinLine(acrossMid)
  967.         CASE "X3O5X1O2X8O4X6"
  968.             gameString$ = gameString$ + "O9"
  969.             CALL PrintO(9)
  970.         CASE "X3O5X2O1X9O6X7", "X3O5X2O1X9O6X8"
  971.             gameString$ = gameString$ + "O4"
  972.             CALL PrintO(4)
  973.             CALL WinLine(acrossMid)
  974.         CASE "X3O5X2O1X9O6X4"
  975.             gameString$ = gameString$ + "O7"
  976.             CALL PrintO(7)
  977.         CASE "X3O5X4O1X9O6X2", "X3O5X4O1X9O6X7"
  978.             gameString$ = gameString$ + "O8"
  979.             CALL PrintO(8)
  980.         CASE "X3O5X4O1X9O6X8"
  981.             gameString$ = gameString$ + "O7"
  982.             CALL PrintO(7)
  983.         CASE "X3O5X6O9X1O2X4", "X3O5X6O9X1O2X7"
  984.             gameString$ = gameString$ + "O8"
  985.             CALL PrintO(8)
  986.             CALL WinLine(vertM)
  987.         CASE "X3O5X6O9X1O2X8"
  988.             gameString$ = gameString$ + "O4"
  989.             CALL PrintO(4)
  990.         CASE "X3O5X7O2X8O9X4", "X3O5X7O2X8O9X6"
  991.             gameString$ = gamest5ring$ + "O1"
  992.             CALL PrintO(1)
  993.             CALL WinLine(diagTL)
  994.         CASE "X3O5X7O2X8O9X1"
  995.             gameString$ = gameString$ + "O4"
  996.             CALL PrintO(4)
  997.         CASE "X3O5X8O9X1O2X4", "X3O5X8O9X1O2X6"
  998.             gameString$ = gameString$ + "O7"
  999.             CALL PrintO(7)
  1000.         CASE "X3O5X8O9X1O2X7"
  1001.             gameString$ = gameString$ + "O4"
  1002.             CALL PrintO(4)
  1003.         CASE "X3O5X9O6X4O2X1", "X3O5X9O6X4O2X7"
  1004.             gameString$ = gameString$ + "O8"
  1005.             CALL PrintO(8)
  1006.             CALL WinLine(vertM)
  1007.         CASE "X3O5X9O6X4O2X8"
  1008.             gameString$ = gameString$ + "O7"
  1009.             CALL PrintO(7)
  1010.     END SELECT
  1011.     playerMove = GetLocation
  1012.     gameString$ = gameString$ + "X" + S$(playerMove)
  1013.  
  1014.  
  1015. SUB X4
  1016.     gameString$ = gameString$ + "O5"
  1017.     CALL PrintO(5)
  1018.     playerMove = GetLocation
  1019.     gameString$ = gameString$ + "X" + S$(playerMove)
  1020.     SELECT CASE gameString$
  1021.         CASE "X4O5X1"
  1022.             gameString$ = gameString$ + "O7"
  1023.             CALL PrintO(7)
  1024.         CASE "X4O5X2"
  1025.             gameString$ = gameString$ + "O1"
  1026.             CALL PrintO(1)
  1027.         CASE "X4O5X3"
  1028.             gameString$ = gameString$ + "O1"
  1029.             CALL PrintO(1)
  1030.         CASE "X4O5X6"
  1031.             gameString$ = gameString$ + "O1"
  1032.             CALL PrintO(1)
  1033.         CASE "X4O5X7"
  1034.             gameString$ = gameString$ + "O1"
  1035.             CALL PrintO(1)
  1036.         CASE "X4O5X8"
  1037.             gameString$ = gameString$ + "O7"
  1038.             CALL PrintO(7)
  1039.         CASE "X4O5X9"
  1040.             gameString$ = gameString$ + "O7"
  1041.             CALL PrintO(7)
  1042.     END SELECT
  1043.     playerMove = GetLocation
  1044.     gameString$ = gameString$ + "X" + S$(playerMove)
  1045.     SELECT CASE gameString$
  1046.         CASE "X4O5X1O7X2", "X4O5X1O7X6", "X4O5X1O7X8", "X4O5X1O7X9"
  1047.             gameString$ = gameString$ + "O3"
  1048.             CALL PrintO(3)
  1049.             CALL WinLine(diagBL)
  1050.         CASE "X4O5X1O7X3" '***********
  1051.             gameString$ = gameString$ + "O2"
  1052.             CALL PrintO(2)
  1053.         CASE "X4O5X2O1X3", "X4O5X2O1X6", "X4O5X2O1X7", "X4O5X2O1X8"
  1054.             gameString$ = gameString$ + "O9"
  1055.             CALL PrintO(9)
  1056.             CALL WinLine(diagTL)
  1057.         CASE "X4O5X2O1X9" '*************
  1058.             gameString$ = gameString$ + "O3"
  1059.             CALL PrintO(3)
  1060.         CASE "X4O5X3O1X2", "X4O5X3O1X6", "X4O5X3O1X7", "X4O5X3O1X8"
  1061.             gameString$ = gameString$ + "O9"
  1062.             CALL PrintO(9)
  1063.             CALL WinLine(diagTL)
  1064.         CASE "X4O5X3O1X9" '**************
  1065.             gameString$ = gameString$ + "O6"
  1066.             CALL PrintO(6)
  1067.         CASE "X4O5X6O1X2", "X4O5X6O1X3", "X4O5X6O1X7", "X4O5X6O1X8"
  1068.             gameString$ = gameString$ + "O9"
  1069.             CALL PrintO(9)
  1070.             CALL WinLine(diagTL)
  1071.         CASE "X4O5X6O1X9" '****************
  1072.             gameString$ = gameString$ + "O3"
  1073.             CALL PrintO(3)
  1074.         CASE "X4O5X7O1X2", "X4O5X7O1X3", "X4O5X7O1X6", "X4O5X7O1X8"
  1075.             gameString$ = gameString$ + "O9"
  1076.             CALL PrintO(9)
  1077.             CALL WinLine(diagTL)
  1078.         CASE "X4O5X7O1X9" '********************
  1079.             gameString$ = gameString$ + "O8"
  1080.             CALL PrintO(8)
  1081.         CASE "X4O5X8O7X1", "X4O5X8O7X2", "X4O5X8O7X6", "X4O5X8O7X9"
  1082.             gameString$ = gameString$ + "O3"
  1083.             CALL PrintO(3)
  1084.             CALL WinLine(diagBL)
  1085.         CASE "X4O5X8O7X3" '********************
  1086.             gameString$ = gameString$ + "O1"
  1087.             CALL PrintO(1)
  1088.         CASE "X4O5X9O7X1", "X4O5X9O7X2", "X4O5X9O7X6", "X4O5X9O7X8"
  1089.             gameString$ = gameString$ + "O3"
  1090.             CALL PrintO(3)
  1091.             CALL WinLine(diagBL)
  1092.         CASE "X4O5X9O7X3" '****************
  1093.             gameString$ = gameString$ + "O6"
  1094.             CALL PrintO(6)
  1095.     END SELECT
  1096.     playerMove = GetLocation
  1097.     gameString$ = gameString$ + "X" + S$(playerMove)
  1098.     SELECT CASE gameString$
  1099.         CASE "X4O5X1O7X3O2X6", "X4O5X1O7X3O2X9"
  1100.             gameString$ = gameString$ + "O8"
  1101.             CALL PrintO(8)
  1102.             CALL WinLine(vertM)
  1103.         CASE "X4O5X1O7X3O2X8"
  1104.             gameString$ = gameString$ + "O6"
  1105.             CALL PrintO(6)
  1106.         CASE "X4O5X2O1X9O3X6", "X4O5X2O1X9O3X8"
  1107.             gameString$ = gameString$ + "O7"
  1108.             CALL PrintO(7)
  1109.             CALL WinLine(diagBL)
  1110.         CASE "X4O5X2O1X9O3X7"
  1111.             gameString$ = gameString$ + "O8"
  1112.             CALL PrintO(8)
  1113.         CASE "X4O5X3O1X9O6X2", "X4O5X3O1X9O6X7"
  1114.             gameString$ = gameString$ + "O8"
  1115.             CALL PrintO(8)
  1116.         CASE "X4O5X3O1X9O6X8"
  1117.             gameString$ = gameString$ + "O7"
  1118.             CALL PrintO(7)
  1119.         CASE "X4O5X6O1X9O3X2", "X4O5X6O1X9O3X8"
  1120.             gameString$ = gameString$ + "O7"
  1121.             CALL PrintO(7)
  1122.             CALL WinLine(diagBL)
  1123.         CASE "X4O5X6O1X9O3X7"
  1124.             gameString$ = gameString$ + "O2"
  1125.             CALL PrintO(2)
  1126.             CALL WinLine(acrossTop)
  1127.         CASE "X4O5X7O1X9O8X3", "X4O5X7O1X9O8X6"
  1128.             gameString$ = gameString$ + "O2"
  1129.             CALL PrintO(2)
  1130.             CALL WinLine(vertM)
  1131.         CASE "X4O5X7O1X9O8X2"
  1132.             gameString$ = gameString$ + "O3"
  1133.             CALL PrintO(3)
  1134.         CASE "X4O5X8O7X3O1X2", "X4O5X8O7X3O1X6"
  1135.             gameString$ = gameString$ + "O9"
  1136.             CALL PrintO(9)
  1137.             CALL WinLine(diagTL)
  1138.         CASE "X4O5X8O7X3O1X9"
  1139.             gameString$ = gameString$ + "O6"
  1140.             CALL PrintO(6)
  1141.         CASE "X4O5X9O7X3O6X1", "X4O5X9O7X3O6X8"
  1142.             gameString$ = gameString$ + "O2"
  1143.             CALL PrintO(2)
  1144.         CASE "X4O5X9O7X3O6X2"
  1145.             gameString$ = gameString$ + "O1"
  1146.             CALL PrintO(1)
  1147.     END SELECT
  1148.     playerMove = GetLocation
  1149.     gameString$ = gameString$ + "X" + S$(playerMove)
  1150.  
  1151. SUB X5
  1152.     gameString$ = gameString$ + "O1"
  1153.     CALL PrintO(1)
  1154.     playerMove = GetLocation
  1155.     gameString$ = gameString$ + "X" + S$(playerMove)
  1156.     SELECT CASE gameString$
  1157.         CASE "X5O1X2"
  1158.             gameString$ = gameString$ + "O8"
  1159.             CALL PrintO(8)
  1160.         CASE "X5O1X3"
  1161.             gameString$ = gameString$ + "O7"
  1162.             CALL PrintO(7)
  1163.         CASE "X5O1X4"
  1164.             gameString$ = gameString$ + "O6"
  1165.             CALL PrintO(6)
  1166.         CASE "X5O1X6"
  1167.             gameString$ = gameString$ + "O4"
  1168.             CALL PrintO(4)
  1169.         CASE "X5O1X7"
  1170.             gameString$ = gameString$ + "O3"
  1171.             CALL PrintO(3)
  1172.         CASE "X5O1X8"
  1173.             gameString$ = gameString$ + "O2"
  1174.             CALL PrintO(2)
  1175.         CASE "X5O1X9"
  1176.             gameString$ = gameString$ + "O3"
  1177.             CALL PrintO(3)
  1178.     END SELECT
  1179.     playerMove = GetLocation
  1180.     gameString$ = gameString$ + "X" + S$(playerMove)
  1181.     SELECT CASE gameString$
  1182.         'X5O1X2O8X
  1183.         CASE "X5O1X2O8X3"
  1184.             gameString$ = gameString$ + "O7"
  1185.             CALL PrintO(7)
  1186.         CASE "X5O1X2O8X4"
  1187.             gameString$ = gameString$ + "O6"
  1188.             CALL PrintO(6)
  1189.         CASE "X5O1X2O8X6"
  1190.             gameString$ = gameString$ + "O4"
  1191.             CALL PrintO(4)
  1192.         CASE "X5O1X2O8X7"
  1193.             gameString$ = gameString$ + "O3"
  1194.             CALL PrintO(3)
  1195.         CASE "X5O1X2O8X9"
  1196.             gameString$ = gameString$ + "O4"
  1197.             CALL PrintO(4)
  1198.             ' X5O1X3O7X
  1199.         CASE "X5O1X3O7X2", "X5O1X3O7X6", "X5O1X3O7X8", "X5O1X3O7X9"
  1200.             gameString$ = gameString$ + "O4"
  1201.             CALL PrintO(4)
  1202.             CALL WinLine(vertL)
  1203.         CASE "X5O1X3O7X4"
  1204.             gameString$ = gameString$ + "O6"
  1205.             CALL PrintO(6)
  1206.             '"X5O1X4O6X
  1207.         CASE "X5O1X4O6X2", "X5O1X4O6X9"
  1208.             gameString$ = gameString$ + "O8"
  1209.             CALL PrintO(8)
  1210.         CASE "X5O1X4O6X3"
  1211.             gameString$ = gameString$ + "O7"
  1212.             CALL PrintO(7)
  1213.         CASE "X5O1X4O6X7"
  1214.             gameString$ = gameString$ + "O3"
  1215.             CALL PrintO(3)
  1216.         CASE "X5O1X4O6X8"
  1217.             gameString$ = gameString$ + "O2"
  1218.             CALL PrintO(2)
  1219.         CASE "X5O1X6O4X2", "X5O1X6O4X3", "X5O1X6O4X8", "X5O1X6O4X9"
  1220.             gameString$ = gameString$ + "O7"
  1221.             CALL PrintO(7)
  1222.             CALL WinLine(vertL)
  1223.         CASE "X5O1X6O4X7"
  1224.             gameString$ = gameString$ + "O3"
  1225.             CALL PrintO(3)
  1226.         CASE "X5O1X7O3X4", "X5O1X7O3X6", "X5O1X7O3X8", "X5O1X7O3X9"
  1227.             gameString$ = gameString$ + "O2"
  1228.             CALL PrintO(2)
  1229.             CALL WinLine(acrossTop)
  1230.         CASE "X5O1X7O3X2"
  1231.             gameString$ = gameString$ + "O8"
  1232.             CALL PrintO(8)
  1233.         CASE "X5O1X8O2X4", "X5O1X8O2X6", "X5O1X8O2X7", "X5O1X8O2X9"
  1234.             gameString$ = gameString$ + "O3"
  1235.             CALL PrintO(3)
  1236.             CALL WinLine(acrossTop)
  1237.         CASE "X5O1X8O2X3"
  1238.             gameString$ = gameString$ + "O7"
  1239.             CALL PrintO(7)
  1240.         CASE "X5O1X9O3X4", "X5O1X9O3X6", "X5O1X9O3X7", "X5O1X9O3X8"
  1241.             gameString$ = gameString$ + "O2"
  1242.             CALL PrintO(2)
  1243.             CALL WinLine(acrossTop)
  1244.         CASE "X5O1X9O3X2"
  1245.             gameString$ = gameString$ + "O8"
  1246.             CALL PrintO(8)
  1247.     END SELECT
  1248.     playerMove = GetLocation
  1249.     gameString$ = gameString$ + "X" + S$(playerMove)
  1250.     SELECT CASE gameString$
  1251.         CASE "X5O1X2O8X3O7X4", "X5O1X2O8X3O7X6"
  1252.             gameString$ = gameString$ + "O9"
  1253.             CALL PrintO(9)
  1254.             CALL WinLine(acrossBot)
  1255.         CASE "X5O1X2O8X3O7X9"
  1256.             gameString$ = gameString$ + "O4"
  1257.             CALL PrintO(4)
  1258.             CALL WinLine(vertL)
  1259.         CASE "X5O1X2O8X4O6X3"
  1260.             gameString$ = gameString$ + "O7"
  1261.             CALL PrintO(7)
  1262.         CASE "X5O1X2O8X4O6X7", "X5O1X2O8X4O6X9"
  1263.             gameString$ = gameString$ + "O3"
  1264.             CALL PrintO(3)
  1265.         CASE "X5O1X2O8X6O4X3", "X5O1X2O8X6O4X9"
  1266.             gameString$ = gameString$ + "O7"
  1267.             CALL PrintO(7)
  1268.             CALL WinLine(vertL)
  1269.         CASE "X5O1X2O8X6O4X7"
  1270.             gameString$ = gameString$ + "O3"
  1271.             CALL PrintO(3)
  1272.         CASE "X5O1X2O8X7O3X4", "X5O1X2O8X7O3X9"
  1273.             gameString$ = gameString$ + "O6"
  1274.             CALL PrintO(6)
  1275.         CASE "X5O1X2O8X7O3X6"
  1276.             gameString$ = gameString$ + "O4"
  1277.             CALL PrintO(4)
  1278.         CASE "X5O1X2O8X9O4X3", "X5O1X2O8X9O4X6"
  1279.             gameString$ = gameString$ + "O7"
  1280.             CALL PrintO(7)
  1281.             CALL WinLine(vertL)
  1282.         CASE "X5O1X2O8X9O4X7"
  1283.             gameString$ = gameString$ + "O3"
  1284.             CALL PrintO(3)
  1285.         CASE "X5O1X3O7X4O6X2"
  1286.             gameString$ = gameString$ + "O8"
  1287.             CALL PrintO(8)
  1288.         CASE "X5O1X3O7X4O6X8", "X5O1X3O7X4O6X9"
  1289.             gameString$ = gamestgring$ + "O2"
  1290.             CALL PrintO(2)
  1291.         CASE "X5O1X4O6X2O8X3", "X5O1X4O6X2O8X9"
  1292.             gameString$ = gameString$ + "O7"
  1293.             CALL PrintO(7)
  1294.         CASE "X5O1X4O6X2O8X7"
  1295.             gameString$ = gameString$ + "O3"
  1296.             CALL PrintO(3)
  1297.         CASE "X5O1X4O6X3O7X2"
  1298.             gameString$ = gameString$ + "O8"
  1299.             CALL PrintO(8)
  1300.         CASE "X5O1X4O6X3O7X8", "X5O1X4O6X3O7X9"
  1301.             gameString$ = gameString$ + "O2"
  1302.             CALL PrintO(2)
  1303.         CASE "X5O1X4O6X7O3X2", "X5O1X4O6X7O3X8"
  1304.             gameString$ = gameString$ + "O9"
  1305.             CALL PrintO(9)
  1306.             CALL WinLine(vertR)
  1307.         CASE "X5O1X4O6X7O3X9"
  1308.             gameString$ = gameString$ + "O2"
  1309.             CALL PrintO(2)
  1310.             CALL WinLine(acrossTop)
  1311.         CASE "X5O1X4O6X8O2X3"
  1312.             gameString$ = gameString$ + "O7"
  1313.             CALL PrintO(7)
  1314.         CASE "X5O1X4O6X8O2X7", "X5O1X4O6X8O2X9"
  1315.             gameString$ = gameString$ + "O3"
  1316.             CALL PrintO(3)
  1317.             CALL WinLine(acrossTop)
  1318.         CASE "X5O1X4O6X9O8X2", "X5O1X4O6X9O8X7"
  1319.             gameString$ = gameString$ + "O3"
  1320.             CALL PrintO(3)
  1321.         CASE "X5O1X4O6X9O8X3"
  1322.             gameString$ = gameString$ + "O7"
  1323.             CALL PrintO(7)
  1324.         CASE "X5O1X6O4X7O3X8", "X5O1X6O4X7O3X9"
  1325.             gameString$ = gameString$ + "O2"
  1326.             CALL PrintO(2)
  1327.             CALL WinLine(acrossTop)
  1328.         CASE "X5O1X6O4X7O3X2"
  1329.             gameString$ = gameString$ + "O8"
  1330.             CALL PrintO(8)
  1331.         CASE "X5O1X7O3X2O8X6", "X5O1X7O3X2O8X9"
  1332.             gameString$ = gameString$ + "O4"
  1333.             CALL PrintO(4)
  1334.         CASE "X5O1X7O3X2O8X4"
  1335.             gameString$ = gameString$ + "O6"
  1336.             CALL PrintO(6)
  1337.         CASE "X5O1X8O2X3O7X6", "X5O1X8O2X3O7X9"
  1338.             gameString$ = gameString$ + "O4"
  1339.             CALL PrintO(4)
  1340.             CALL WinLine(vertL)
  1341.         CASE "X5O1X8O2X3O7X4"
  1342.             gameString$ = gameString$ + "O6"
  1343.             CALL PrintO(6)
  1344.         CASE "X5O1X9O3X2O8X4", "X5O1X9O3X2O8X7"
  1345.             gameString$ = gameString$ + "O6"
  1346.             CALL PrintO(6)
  1347.         CASE "X5O1X9O3X2O8X6"
  1348.             gameString$ = gameString$ + "O4"
  1349.             CALL PrintO(4)
  1350.     END SELECT
  1351.     playerMove = GetLocation
  1352.     gameString$ = gameString$ + "X" + S$(playerMove)
  1353.  
  1354.  
  1355. SUB X6
  1356.     gameString$ = gameString$ + "O5"
  1357.     CALL PrintO(5)
  1358.     playerMove = GetLocation
  1359.     gameString$ = gameString$ + "X" + S$(playerMove)
  1360.     CALL PrintX(playerMove)
  1361.     SELECT CASE gameString$
  1362.         CASE "X6O5X1"
  1363.             gameString$ = gameString$ + "O3"
  1364.             CALL PrintO(3)
  1365.         CASE "X6O5X2"
  1366.             gameString$ = gameString$ + "O3"
  1367.             CALL PrintO(3)
  1368.         CASE "X6O5X3"
  1369.             gameString$ = gameString$ + "O9"
  1370.             CALL PrintO(9)
  1371.         CASE "X6O5X4"
  1372.             gameString$ = gameString$ + "O3"
  1373.             CALL PrintO(3)
  1374.         CASE "X6O5X7"
  1375.             gameString$ = gameString$ + "O9"
  1376.             CALL PrintO(9)
  1377.         CASE "X6O5X8"
  1378.             gameString$ = gameString$ + "O9"
  1379.             CALL PrintO(9)
  1380.         CASE "X6O5X9"
  1381.             gameString$ = gameString$ + "O3"
  1382.             CALL PrintO(3)
  1383.     END SELECT
  1384.     playerMove = GetLocation
  1385.     gameString$ = gameString$ + "X" + S$(playerMove)
  1386.     CALL PrintX(playerMove)
  1387.     SELECT CASE gameString$
  1388.         CASE "X6O5X1O3X2", "X6O5X1O3X4", "X6O5X1O3X8", "X6O5X1O3X9"
  1389.             gameString$ = gameString$ + "O7"
  1390.             CALL PrintO(7)
  1391.             CALL WinLine(diagBL)
  1392.         CASE "X6O5X1O3X7"
  1393.             gameString$ = gameString$ + "O4"
  1394.             CALL PrintO(4)
  1395.         CASE "X6O5X2O3X1", "X6O5X2O3X4", "X6O5X2O3X8", "X6O5X2O3X9"
  1396.             gameString$ = gameString$ + "O7"
  1397.             CALL PrintO(7)
  1398.             CALL WinLine(diagBL)
  1399.         CASE "X6O5X2O3X7" '***********
  1400.             gameString$ = gameString$ + "O1"
  1401.             CALL PrintO(1)
  1402.         CASE "X6O5X3O9X2", "X6O5X3O9X4", "X6O5X3O9X7", "X6O5X3O9X8"
  1403.             gameString$ = gameString$ + "O1"
  1404.             CALL PrintO(1)
  1405.             CALL WinLine(diagTL)
  1406.         CASE "X6O5X3O9X1"
  1407.             gameString$ = gameString$ + "O2"
  1408.             CALL PrintO(2)
  1409.         CASE "X6O5X4O3X1", "X6O5X4O3X2", "X6O5X4O3X8", "X6O5X4O3X9"
  1410.             gameString$ = gameString$ + "O7"
  1411.             CALL PrintO(7)
  1412.             CALL WinLine(diagBL)
  1413.         CASE "X6O5X4O3X7" '********************
  1414.             gameString$ = gameString$ + "O1"
  1415.             CALL PrintO(1)
  1416.         CASE "X6O5X7O9X2", "X6O5X7O9X3", "X6O5X7O9X4", "X6O5X7O9X8"
  1417.             gameString$ = gameString$ + "O1"
  1418.             CALL PrintO(1)
  1419.             CALL WinLine(diagTL)
  1420.         CASE "X6O5X7O9X1" '**********************
  1421.             gameString$ = gameString$ + "O4"
  1422.             CALL PrintO(4)
  1423.         CASE "X6O5X8O9X2", "X6O5X8O9X3", "X6O5X8O9X4", "X6O5X8O9X7"
  1424.             gameString$ = gameString$ + "O1"
  1425.             CALL PrintO(1)
  1426.             CALL WinLine(diagTL)
  1427.         CASE "X6O5X8O9X1" '******************************
  1428.             gameString$ = gameString$ + "O3"
  1429.             CALL PrintO(3)
  1430.         CASE "X6O5X9O3X1", "X6O5X9O3X2", "X6O5X9O3X4", "X6O5X9O3X8"
  1431.             gameString$ = gameString$ + "O7"
  1432.             CALL PrintO(7)
  1433.             CALL WinLine(diagBL)
  1434.         CASE "X6O5X9O3X7"
  1435.             gameString$ = gameString$ + "O8"
  1436.             CALL PrintO(8)
  1437.     END SELECT
  1438.     playerMove = GetLocation
  1439.     gameString$ = gameString$ + "X" + S$(playerMove)
  1440.     CALL PrintX(playerMove)
  1441.     SELECT CASE gameString$
  1442.         CASE "X6O5X1O3X7O4X2", "X6O5X1O3X7O4X8"
  1443.             gameString$ = gameString$ + "O9"
  1444.             CALL PrintO(9)
  1445.         CASE "X6O5X1O3X7O4X9"
  1446.             gameString$ = gameString$ + "O8"
  1447.             CALL PrintO(8)
  1448.         CASE "X6O5X2O3X7O1X4", "X6O5X2O3X7O1X8"
  1449.             gameString$ = gameString$ + "O9"
  1450.             CALL PrintO(9)
  1451.             CALL WinLine(diagTL)
  1452.         CASE "X6O5X2O3X7O1X9"
  1453.             gameString$ = gameString$ + "4"
  1454.             CALL PrintO(4)
  1455.         CASE "X6O5X3O9X1O2X4", "X6O5X3O9X1O2X7"
  1456.             gameString$ = gameString$ + "O8"
  1457.             CALL PrintO(8)
  1458.             CALL WinLine(vertM)
  1459.         CASE "X6O5X3O9X1O2X8"
  1460.             gameString$ = gameString$ + "O4"
  1461.             CALL PrintO(4)
  1462.         CASE "X6O5X4O3X7O1X2", "X6O5X4O3X7O1X8"
  1463.             gameString$ = gameString$ + "O9"
  1464.             CALL PrintO(9)
  1465.             CALL WinLine(diagTL)
  1466.         CASE "X6O5X4O3X7O1X9"
  1467.             gameString$ = gameString$ + "O2"
  1468.             CALL PrintO(2)
  1469.             CALL WinLine(acrossTop)
  1470.         CASE "X6O5X7O9X1O4X2", "X6O5X7O9X1O4X8"
  1471.             gameString$ = gameString$ + "O3"
  1472.             CALL PrintO(3)
  1473.         CASE "X6O5X7O9X1O4X3"
  1474.             gameString$ = gameString$ + "O2"
  1475.             CALL PrintO(2)
  1476.         CASE "X6O5X8O9X1O3X2", "X6O5X8O9X1O3X4"
  1477.             gameString$ = gameString$ + "O7"
  1478.             CALL PrintO(7)
  1479.             CALL WinLine(diagBL)
  1480.         CASE "X6O5X8O9X1O3X7"
  1481.             gameString$ = gameString$ + "O4"
  1482.             CALL PrintO(4)
  1483.         CASE "X6O5X9O3X7O8X1", "X6O5X9O3X7O8X4"
  1484.             gameString$ = gameString$ + "O2"
  1485.             CALL PrintO(2)
  1486.             CALL WinLine(vertM)
  1487.         CASE "X6O5X9O3X7O8X2"
  1488.             gameString$ = gameString$ + "O1"
  1489.             CALL PrintO(1)
  1490.     END SELECT
  1491.     playerMove = GetLocation
  1492.     gameString$ = gameString$ + "X" + S$(playerMove)
  1493.  
  1494.  
  1495. SUB X7
  1496.     gameString$ = gameString$ + "O5"
  1497.     CALL PrintO(5)
  1498.     playerMove = GetLocation
  1499.     gameString$ = gameString$ + "X" + S$(playerMove)
  1500.     CALL PrintX(playerMove)
  1501.     SELECT CASE gameString$
  1502.         CASE "X7O5X1"
  1503.             gameString$ = gameString$ + "O4"
  1504.             CALL PrintO(4)
  1505.         CASE "X7O5X2"
  1506.             gameString$ = gameString$ + "O1"
  1507.             CALL PrintO(1)
  1508.         CASE "X7O5X3"
  1509.             gameString$ = gameString$ + "O2"
  1510.             CALL PrintO(2)
  1511.         CASE "X7O5X4"
  1512.             gameString$ = gameString$ + "O1"
  1513.             CALL PrintO(1)
  1514.         CASE "X7O5X6"
  1515.             gameString$ = gameString$ + "O9"
  1516.             CALL PrintO(9)
  1517.         CASE "X7O5X8"
  1518.             gameString$ = gameString$ + "O9"
  1519.             CALL PrintO(9)
  1520.         CASE "X7O5X9"
  1521.             gameString$ = gameString$ + "O8"
  1522.             CALL PrintO(8)
  1523.     END SELECT
  1524.     playerMove = GetLocation
  1525.     gameString$ = gameString$ + "X" + S$(playerMove)
  1526.     CALL PrintX(playerMove)
  1527.     SELECT CASE gameString$
  1528.         CASE "X7O5X1O4X2", "X7O5X1O4X3", "X7O5X1O4X8", "X7O5X1O4X9"
  1529.             gameString$ = gameString$ + "O6"
  1530.             CALL PrintO(6)
  1531.             CALL WinLine(acrossMid)
  1532.         CASE "X7O5X1O4X6" '**********************
  1533.             gameString$ = gameString$ + "O2"
  1534.             CALL PrintO(2)
  1535.         CASE "X7O5X2O1X3", "X7O5X2O1X4", "X7O5X2O1X6", "X7O5X2O1X8"
  1536.             gameString$ = gameString$ + "O9"
  1537.             CALL PrintO(9)
  1538.             CALL WinLine(diagTL)
  1539.         CASE "X7O5X2O1X9" '****************************
  1540.             gameString$ = gameString$ + "O8"
  1541.             CALL PrintO(8)
  1542.         CASE "X7O5X3O2X1", "X7O5X3O2X4", "X7O5X3O2X6", "X7O5X3O2X9"
  1543.             gameString$ = gameString$ + "O8"
  1544.             CALL PrintO(8)
  1545.             CALL WinLine(vertM)
  1546.         CASE "X7O5X3O2X8" '*******************
  1547.             gameString$ = gameString$ + "O9"
  1548.             CALL PrintO(9)
  1549.         CASE "X7O5X4O1X2", "X7O5X4O1X3", "X7O5X4O1X6", "X7O5X4O1X8"
  1550.             gameString$ = gameString$ + "O9"
  1551.             CALL PrintO(9)
  1552.             CALL WinLine(diagTL)
  1553.         CASE "X7O5X4O1X9" '**********************
  1554.             gameString$ = gameString$ + "O8"
  1555.             CALL PrintO(8)
  1556.         CASE "X7O5X6O9X2", "X7O5X6O9X3", "X7O5X6O9X4", "X7O5X6O9X8"
  1557.             gameString$ = gameString$ + "O1"
  1558.             CALL PrintO(1)
  1559.             CALL WinLine(diagTL)
  1560.         CASE "X7O5X6O9X1" '******************
  1561.             gameString$ = gameString$ + "O4"
  1562.             CALL PrintO(4)
  1563.         CASE "X7O5X8O9X2", "X7O5X8O9X3", "X7O5X8O9X4", "X7O5X8O9X6"
  1564.             gameString$ = gameString$ + "O1"
  1565.             CALL PrintO(1)
  1566.             CALL WinLine(diagTL)
  1567.         CASE "X7O5X8O9X1" '******************
  1568.             gameString$ = gameString$ + "O4"
  1569.             CALL PrintO(4)
  1570.         CASE "X7O5X9O8X1", "X7O5X9O8X3", "X7O5X9O8X4", "X7O5X9O8X6"
  1571.             gameString$ = gameString$ + "O2"
  1572.             CALL PrintO(2)
  1573.             CALL WinLine(vertM)
  1574.         CASE "X7O5X9O8X2"
  1575.             gameString$ = gameString$ + "O4"
  1576.             CALL PrintO(4)
  1577.     END SELECT
  1578.     playerMove = GetLocation
  1579.     gameString$ = gameString$ + "X" + S$(playerMove)
  1580.     CALL PrintX(playerMove)
  1581.     '    color 15,0:locate 45,10:?gamestring$:call p(true)
  1582.     SELECT CASE gameString$
  1583.         CASE "X7O5X1O4X6O2X3", "X7O5X1O4X6O2X9"
  1584.             gameString$ = gameString$ + "O8"
  1585.             CALL PrintO(8)
  1586.             CALL WinLine(vertM)
  1587.         CASE "X7O5X1O4X6O2X8"
  1588.             gameString$ = gameString$ + "O9"
  1589.             CALL PrintO(9)
  1590.         CASE "X7O5X2O1X9O8X3", "X7O5X2O1X9O8X4"
  1591.             gameString$ = gameString$ + "O6"
  1592.             CALL PrintO(6)
  1593.         CASE "X7O5X2O1X9O8X6"
  1594.             gameString$ = gameString$ + "O3"
  1595.             CALL PrintO(3)
  1596.         CASE "X7O5X3O2X8O9X4", "X7O5X3O2X8O9X6"
  1597.             gameString$ = gameString$ + "O1"
  1598.             CALL PrintO(1)
  1599.             CALL WinLine(diagTL)
  1600.         CASE "X7O5X3O2X8O9X1"
  1601.             gameString$ = gameString$ + "O4"
  1602.             CALL PrintO(4)
  1603.         CASE "X7O5X4O1X9O8X3", "X7O5X4O1X9O8X6"
  1604.             gameString$ = gameString$ + "O2"
  1605.             CALL PrintO(2)
  1606.             CALL WinLine(vertM)
  1607.         CASE "X7O5X4O1X9O8X2"
  1608.             gameString$ = gameString$ + "O3"
  1609.             CALL PrintO(3)
  1610.         CASE "X7O5X6O9X1O4X2", "X7O5X6O9X1O4X8"
  1611.             gameString$ = gameString$ + "O3"
  1612.             CALL PrintO(3)
  1613.         CASE "X7O5X6O9X1O4X3"
  1614.             gameString$ = gameString$ + "O2"
  1615.             CALL PrintO(2)
  1616.         CASE "X7O5X8O9X1O4X2", "X7O5X8O9X1O4X3"
  1617.             gameString$ = gameString$ + "O6"
  1618.             CALL PrintO(6)
  1619.             CALL WinLine(acrossMid)
  1620.         CASE "X7O5X8O9X1O4X6"
  1621.             gameString$ = gameString$ + "O2"
  1622.             CALL PrintO(2)
  1623.         CASE "X7O5X9O8X2O4X1", "X7O5X9O8X2O4X3"
  1624.             gameString$ = gameString$ + "O6"
  1625.             CALL PrintO(6)
  1626.             CALL WinLine(acrossMid)
  1627.         CASE "X7O5X9O8X2O4X6"
  1628.             gameString$ = gameString$ + "O3"
  1629.             CALL PrintO(3)
  1630.         CASE "X7O5X6O9X1O4X2", "X7O5X6O9X1O4X8"
  1631.             gameString$ = gameString$ + "O3"
  1632.             CALL PrintO(3)
  1633.         CASE "X7O5X6O9X1O4X3"
  1634.             gameString$ = gameString$ + "O2"
  1635.             CALL PrintO(2)
  1636.     END SELECT
  1637.     playerMove = GetLocation
  1638.     gameString$ = gameString$ + "X" + S$(playerMove)
  1639.     CALL PrintX(playerMove)
  1640.  
  1641. SUB X8
  1642.     gameString$ = gameString$ + "O5"
  1643.     CALL PrintO(5)
  1644.     playerMove = GetLocation
  1645.     gameString$ = gameString$ + "X" + S$(playerMove)
  1646.     CALL PrintX(playerMove)
  1647.     SELECT CASE gameString$
  1648.         CASE "X8O5X1"
  1649.             gameString$ = gameString$ + "O4"
  1650.             CALL PrintO(4)
  1651.         CASE "X8O5X2"
  1652.             gameString$ = gameString$ + "O7"
  1653.             CALL PrintO(7)
  1654.         CASE "X8O5X3"
  1655.             gameString$ = gameString$ + "O6"
  1656.             CALL PrintO(6)
  1657.         CASE "X8O5X4"
  1658.             gameString$ = gameString$ + "O7"
  1659.             CALL PrintO(7)
  1660.         CASE "X8O5X6"
  1661.             gameString$ = gameString$ + "O9"
  1662.             CALL PrintO(9)
  1663.         CASE "X8O5X7"
  1664.             gameString$ = gameString$ + "O9"
  1665.             CALL PrintO(9)
  1666.         CASE "X8O5X9"
  1667.             gameString$ = gameString$ + "O7"
  1668.             CALL PrintO(7)
  1669.     END SELECT
  1670.     playerMove = GetLocation
  1671.     gameString$ = gameString$ + "X" + S$(playerMove)
  1672.     CALL PrintX(playerMove)
  1673.     SELECT CASE gameString$
  1674.         CASE "X8O5X1O4X2", "X8O5X1O4X3", "X8O5X1O4X7", "X8O5X1O4X9"
  1675.             gameString$ = gameString$ + "O6"
  1676.             CALL PrintO(6)
  1677.             CALL WinLine(acrossMid)
  1678.         CASE "X8O5X1O4X6" '**********
  1679.             gameString$ = gameString$ + "O3"
  1680.             CALL PrintO(3)
  1681.         CASE "X8O5X2O7X1", "X8O5X2O7X4", "X8O5X2O7X6", "X8O5X2O7X9"
  1682.             gameString$ = gameString$ + "O3"
  1683.             CALL PrintO(3)
  1684.             CALL WinLine(diagBL)
  1685.         CASE "X8O5X2O7X3" '******************
  1686.             gameString$ = gameString$ + "O1"
  1687.             CALL PrintO(1)
  1688.         CASE "X8O5X3O6X1", "X8O5X3O6X2", "X8O5X3O6X7", "X8O5X3O6X9"
  1689.             gameString$ = gameString$ + "O4"
  1690.             CALL PrintO(4)
  1691.             CALL WinLine(acrossMid)
  1692.         CASE "X8O5X3O6X4" '&&&&&&&&&T
  1693.             gameString$ = gameString$ + "O1"
  1694.             CALL PrintO(1)
  1695.         CASE "X8O5X4O7X1", "X8O5X4O7X2", "X8O5X4O7X6", "X8O5X4O7X9"
  1696.             gameString$ = gameString$ + "O3"
  1697.             CALL PrintO(3)
  1698.             CALL WinLine(diagBL)
  1699.         CASE "X8O5X4O7X3" 'ERRRRRRRRRRRRRR
  1700.             gameString$ = gameString$ + "O1"
  1701.             CALL PrintO(1)
  1702.         CASE "X8O5X6O9X2", "X8O5X6O9X3", "X8O5X6O9X4", "X8O5X6O9X7"
  1703.             gameString$ = gameString$ + "O1"
  1704.             CALL PrintO(1)
  1705.             CALL WinLine(diagTL)
  1706.         CASE "X8O5X6O9X1" ' *(*******************
  1707.             gameString$ = gameString$ + "O7"
  1708.             CALL PrintO(7)
  1709.         CASE "X8O5X7O9X2", "X8O5X7O9X3", "X8O5X7O9X4", "X8O5X7O9X6"
  1710.             gameString$ = gamest4ring$ + "O1"
  1711.             CALL PrintO(1)
  1712.             CALL WinLine(diagTL)
  1713.         CASE "X8O5X7O9X1" '*************
  1714.             gameString$ = gameString$ + "O4"
  1715.             CALL PrintO(4)
  1716.         CASE "X8O5X9O7X1", "X8O5X9O7X2", "X8O5X9O7X4", "X8O5X9O7X6"
  1717.             gameString$ = gameString$ + "O3"
  1718.             CALL PrintO(3)
  1719.             CALL WinLine(diagBL)
  1720.         CASE "X8O5X9O7X3" '''''''''''''''''
  1721.             gameString$ = gameString$ + "O6"
  1722.             CALL PrintO(6)
  1723.     END SELECT
  1724.     playerMove = GetLocation
  1725.     gameString$ = gameString$ + "X" + S$(playerMove)
  1726.     CALL PrintX(playerMove)
  1727.     SELECT CASE gameString$
  1728.         CASE "X8O5X1O4X6O3X2", "X8O5X1O4X6O3X9"
  1729.             gameString$ = gameString$ + "O7"
  1730.             CALL PrintO(7)
  1731.             CALL WinLine(diagBL)
  1732.         CASE "X8O5X1O4X6O3X7"
  1733.             gameString$ = gameString$ + "O9"
  1734.             CALL PrintO(9)
  1735.         CASE "X8O5X2O7X3O1X4", "X8O5X2O7X3O1X6"
  1736.             gameString$ = gameString$ + "O9"
  1737.             CALL PrintO(9)
  1738.             CALL WinLine(diagTL)
  1739.         CASE "X8O5X2O7X3O1X9"
  1740.             gameString$ = gameString$ + "O4"
  1741.             CALL PrintO(4)
  1742.             CALL WinLine(vertL)
  1743.         CASE "X8O5X3O6X4O1X2", "X8O5X3O6X4O1X7"
  1744.             gameString$ = gameString$ + "O9"
  1745.             CALL PrintO(9)
  1746.             CALL WinLine(diagTL)
  1747.         CASE "X8O5X3O6X4O1X9"
  1748.             gameString$ = gameString$ + "O7"
  1749.             CALL PrintO(7)
  1750.         CASE "X8O5X4O7X3O1X2", "X8O5X4O7X3O1X6"
  1751.             gameString$ = gameString$ + "O9"
  1752.             CALL PrintO(9)
  1753.             CALL WinLine(diagTL)
  1754.         CASE "X8O5X4O7X3O1X9"
  1755.             gameString$ = gameString$ + "O2"
  1756.             CALL PrintO(2)
  1757.         CASE "X8O5X6O9X1O7X2", "X8O5X6O9X1O7X4"
  1758.             gameString$ = gameString$ + "O3"
  1759.             CALL PrintO(3)
  1760.             CALL WinLine(diagBL)
  1761.         CASE "X8O5X6O9X1O7X3"
  1762.             gameString$ = gameString$ + "O2"
  1763.             CALL PrintO(2)
  1764.         CASE "X8O5X7O9X1O4X3", "X8O5X7O9X1O4X2"
  1765.             gamestreing$ = gameString$ + "O6"
  1766.             CALL PrintO(6)
  1767.             CALL WinLine(acrossMid)
  1768.         CASE "X8O5X7O9X1O4X6"
  1769.             gameString$ = gameString$ + "O2"
  1770.             CALL PrintO(2)
  1771.         CASE "X8O5X9O7X3O6X1", "X8O5X9O7X3O6X2"
  1772.             gameString$ = gameString$ + "O4"
  1773.             CALL PrintO(4)
  1774.             CALL WinLine(acrossMid)
  1775.         CASE "X8O5X9O7X3O6X4"
  1776.             gameString$ = gameString$ + "O1"
  1777.             CALL PrintO(1)
  1778.     END SELECT
  1779.     playerMove = GetLocation
  1780.     gameString$ = gameString$ + "X" + S$(playerMove)
  1781.     CALL PrintX(playerMove)
  1782.  
  1783. SUB X9
  1784.     gameString$ = gameString$ + "O5"
  1785.     CALL PrintO(5)
  1786.     playerMove = GetLocation
  1787.     gameString$ = gameString$ + "X" + S$(playerMove)
  1788.     CALL PrintX(playerMove)
  1789.     SELECT CASE gameString$
  1790.         CASE "X9O5X1"
  1791.             gameString$ = gameString$ + "O2"
  1792.             CALL PrintO(2)
  1793.         CASE "X9O5X2"
  1794.             gameString$ = gameString$ + "O4"
  1795.             CALL PrintO(4)
  1796.         CASE "X9O5X3"
  1797.             gameString$ = gameString$ + "O6"
  1798.             CALL PrintO(6)
  1799.         CASE "X9O5X4"
  1800.             gameString$ = gameString$ + "O8"
  1801.             CALL PrintO(8)
  1802.         CASE "X9O5X6"
  1803.             gameString$ = gameString$ + "O3"
  1804.             CALL PrintO(3)
  1805.         CASE "X9O5X7"
  1806.             gameString$ = gameString$ + "O8"
  1807.             CALL PrintO(8)
  1808.         CASE "X9O5X8"
  1809.             gameString$ = gameString$ + "O7"
  1810.             CALL PrintO(7)
  1811.     END SELECT
  1812.     playerMove = GetLocation
  1813.     gameString$ = gameString$ + "X" + S$(playerMove)
  1814.     CALL PrintX(playerMove)
  1815.     SELECT CASE gameString$
  1816.         CASE "X9O5X1O2X3", "X9O5X1O2X4", "X9O5X1O2X6", "X9O5X1O2X7"
  1817.             gameString$ = gameString$ + "O8"
  1818.             CALL PrintO(8)
  1819.             CALL WinLine(vertM)
  1820.         CASE "X9O5X1O2X8" '''''''''''''''''''''''''
  1821.             gameString$ = gameString$ + "O7"
  1822.             CALL PrintO(7)
  1823.         CASE "X9O5X2O4X1", "X9O5X2O4X3", "X9O5X2O4X7", "X9O5X2O4X8"
  1824.             gameString$ = gameString$ + "O6"
  1825.             CALL PrintO(6)
  1826.             CALL WinLine(acrossMid)
  1827.         CASE "X9O5X2O4X6"
  1828.             gameString$ = gameString$ + "O3" '''''''''''''''''''''''''
  1829.             CALL PrintO(3)
  1830.         CASE "X9O5X3O6X1", "X9O5X3O6X2", "X9O5X3O6X7", "X9O5X3O6X8"
  1831.             gameString$ = gameString$ + "O4"
  1832.             CALL PrintO(4)
  1833.             CALL WinLine(acrossMid)
  1834.         CASE "X9O5X3O6X4" '''''''''''''''''''
  1835.             gameString$ = gameString$ + "O2"
  1836.             CALL PrintO(2)
  1837.         CASE "X9O5X4O8X1", "X9O5X4O8X3", "X9O5X4O8X6", "X9O5X4O8X7"
  1838.             gameString$ = gameString$ + "O2"
  1839.             CALL PrintO(2)
  1840.             CALL WinLine(vertM)
  1841.         CASE "X9O5X4O8X2"
  1842.             gameString$ = gameString$ + "O3"
  1843.             CALL PrintO(3)
  1844.         CASE "X9O5X6O3X1", "X9O5X6O3X2", "X9O5X6O3X4", "X9O5X6O3X8"
  1845.             gameString$ = gameString$ + "O7"
  1846.             CALL PrintO(7)
  1847.             CALL WinLine(diagBL)
  1848.         CASE "X9O5X6O3X7" ''''''''''''''''
  1849.             gameString$ = gameString$ + "O8"
  1850.             CALL PrintO(8)
  1851.         CASE "X9O5X7O8X1", "X9O5X7O8X3", "X9O5X7O8X4", "X9O5X7O8X6"
  1852.             gameString$ = gameString$ + "O2"
  1853.             CALL PrintO(2)
  1854.             CALL WinLine(vertM)
  1855.         CASE "X9O5X7O8X2"
  1856.             gameString$ = gameString$ + "O4"
  1857.             CALL PrintO(4)
  1858.         CASE "X9O5X8O7X1", "X9O5X8O7X2", "X9O5X8O7X4", "X9O5X8O7X6"
  1859.             gameString$ = gameString$ + "O3"
  1860.             CALL PrintO(3)
  1861.             CALL WinLine(diagBL)
  1862.         CASE "X9O5X8O7X3" ''''''''''''''''''
  1863.             gameString$ = gameString$ + "O6"
  1864.             CALL PrintO(6)
  1865.     END SELECT
  1866.     playerMove = GetLocation
  1867.     gameString$ = gameString$ + "X" + S$(playerMove)
  1868.     CALL PrintX(playerMove)
  1869.     SELECT CASE gameString$
  1870.         CASE "X9O5X1O2X8O7X4", "X9O5X1O2X8O7X6"
  1871.             gameString$ = gameString$ + "O3"
  1872.             CALL PrintO(3)
  1873.             CALL WinLine(diagBL)
  1874.         CASE "X9O5X1O2X8O7X3"
  1875.             gameString$ = gameString$ + "O6"
  1876.             CALL PrintO(6)
  1877.         CASE "X9O5X2O4X6O3X1", "X9O5X2O4X6O3X8"
  1878.             gameString$ = gameString$ + "O7"
  1879.             CALL PrintO(7)
  1880.             CALL WinLine(diagBL)
  1881.         CASE "X9O5X2O4X6O3X7"
  1882.             gameString$ = gameString$ + "O8"
  1883.             CALL PrintO(8)
  1884.         CASE "X9O5X3O6X4O2X1", "X9O5X3O6X4O2X7"
  1885.             gameString$ = gameString$ + "O8"
  1886.             CALL PrintO(8)
  1887.             CALL WinLine(vertM)
  1888.         CASE "X9O5X3O6X4O2X8"
  1889.             gameString$ = gameString$ + "O7"
  1890.             CALL PrintO(7)
  1891.         CASE "X9O5X4O8X2O3X1", "X9O5X4O8X2O3X6"
  1892.             gameString$ = gameString$ + "O7"
  1893.             CALL PrintO(7)
  1894.             CALL WinLine(diagBL)
  1895.         CASE "X9O5X4O8X2O3X7"
  1896.             gameString$ = gameString$ + "O1"
  1897.             CALL PrintO(1)
  1898.         CASE "X9O5X6O3X7O8X1", "X9O5X6O3X7O8X4"
  1899.             gameString$ = gameString$ + "O2"
  1900.             CALL PrintO(2)
  1901.             CALL WinLine(vertM)
  1902.         CASE "X9O5X6O3X7O8X2"
  1903.             gameString$ = gameString$ + "O1"
  1904.             CALL PrintO(1)
  1905.         CASE "X9O5X7O8X2O4X1", "X9O5X7O8X2O4X3"
  1906.             gameString$ = gameString$ + "O6"
  1907.             CALL PrintO(6)
  1908.             CALL WinLine(acrossMid)
  1909.         CASE "X9O5X7O8X2O4X6"
  1910.             gameString$ = gameString$ + "O3"
  1911.             CALL PrintO(3)
  1912.         CASE "X9O5X8O7X3O6X1", "X9O5X8O7X3O6X2"
  1913.             gameString$ = gameString$ + "O4"
  1914.             CALL PrintO(4)
  1915.             CALL WinLine(acrossMid)
  1916.         CASE "X9O5X8O7X3O6X4"
  1917.             gameString$ = gameString$ + "O1"
  1918.             CALL PrintO(1)
  1919.     END SELECT
  1920.     playerMove = GetLocation
  1921.     gameString$ = gameString$ + "X" + S$(playerMove)
  1922.     CALL PrintX(playerMove)
  1923.  
  1924. FUNCTION GetLocation
  1925.     nope:
  1926.     where$ = INPUT$(1)
  1927.     here = VAL(where$)
  1928.     IF here < 1 OR here > 9 OR INSTR(gameString$, where$) <> 0 THEN
  1929.         GOTO nope
  1930.     ELSE
  1931.         IF MID$(gameString$, LEN(gameString$) - 1, 1) = "X" THEN
  1932.             CALL PrintO(here)
  1933.         ELSE
  1934.             CALL PrintX(here)
  1935.         END IF
  1936.     END IF
  1937.     GetLocation = here
  1938.  
  1939.  
  1940. FUNCTION Center (this$)
  1941.     Center = INT((80 - LEN(this$)) / 2)
  1942.  
  1943. SUB P (onOff)
  1944.     pause$ = INPUT$(1)
  1945.     IF onOff = TRUE AND pause$ = CHR$(27) THEN END
  1946.  
  1947. FUNCTION S$ (number)
  1948.     S$ = LTRIM$(STR$(number))

13
QB64 Discussion / Break Thru
« on: July 19, 2021, 02:47:54 pm »
This game is a clone of Break Out on the Atari 2600 and Arkanoid for the 8-bit Nintendo. I gave up trying to make a bonus drop creating 2 balls. Anyway, it came out pretty good. I'm thinking of doing another clone with graphics instead of text like this one. It will be my first foray into graphics of any kind. The graphics would be filled rectangles and a circle so I think it would be a good starting point.

Code: QB64: [Select]
  1. ' Creator: Jaze McAskill -- mcaskilljaze@gmail.com
  2.  
  3. WIDTH 80, 50
  4. TYPE coordinate
  5.     x AS INTEGER
  6.     y AS INTEGER
  7.  
  8. TYPE droppingLetter
  9.     x AS INTEGER
  10.     y AS SINGLE
  11.     letter AS INTEGER
  12.  
  13.  
  14. GOTO beginning
  15. crap:
  16. PRINT "Error, error line"
  17.  
  18. beginning:
  19. CONST TRUE = 1
  20. CONST FALSE = 0
  21. CONST leftDirection = 19200 '   to make the code more readable with the left and right arrowkeys
  22. CONST rightDirection = 19712 '
  23. CONST upAndLeft = 1 'the ball always moves in one diagonal direction
  24. CONST upAndRight = 2
  25. CONST downAndLeft = 3
  26. CONST downAndRight = 4
  27. CONST theBackground = 0 '           to determine what the ball hit
  28. CONST theBrick = 1
  29. CONST theWall = 2
  30. CONST thePaddle = 3
  31. CONST theBall = 4
  32. CONST theBonus = 5
  33. CONST hitWallSound$ = "O2L30G"
  34. CONST hitPaddleSound$ = "O3L30C"
  35. CONST hitBrickSound$ = "O3L30G"
  36. CONST deathSound$ = "O4L15CO3CO2CO1L10C"
  37. CONST successBeep = "L9O2DL15DL9DL4F"
  38. CONST letterE = 69 'to lengthen / expand the paddle
  39. CONST letterS = 83 'to shrink the paddle
  40. CONST letterPlus = 43 ' score increase
  41. CONST letterMinus = 45 ' score decrease
  42. CONST letterStar = 42 'score multiplier
  43.  
  44. 'I share everything so I don't have to worry whether or not I was supposed to pass something. Plus it removes the need to pass the same variable multiple times
  45. DIM SHARED creationBoard(2 TO 79, 2 TO 46) AS INTEGER 'the colors on the board when creating a level
  46. FOR initializeArrayX = 2 TO 79
  47.     FOR initializeArrayY = 2 TO 46
  48.         creationBoard(initializeArrayX, initializeArrayY) = 1 'set the board to the background color
  49. DIM SHARED brick AS coordinate: brick.x = 2: brick.y = 2 'start the creation board at 2, 2
  50. DIM SHARED ball(1 TO 2) AS coordinate 'to track where the ball is on the board
  51. DIM SHARED ballDirection(1 TO 2) AS INTEGER 'track the ball's direction using the directional constants above
  52. DIM SHARED paddleLeft AS SINGLE ' the leftmost character of the paddle
  53. DIM SHARED board(1 TO 80, 1 TO 48, 1 TO 2) AS INTEGER 'the board for the game
  54. DIM SHARED numberOfBricks AS INTEGER 'the number of bricks currently on the board
  55. DIM SHARED currentLevel AS INTEGER: currentLevel = 1 'start at level 1
  56. DIM SHARED numberOfGuys AS INTEGER: numberOfGuys = 5
  57. DIM SHARED score AS INTEGER: scorte = 0
  58. DIM SHARED spaceToStart: spaceToStart = FALSE 'whether or not the spacebar was pushed to begin the level
  59. DIM SHARED debugMode AS INTEGER: debugMode = FALSE 'to bounce the ball off the bottom or to decrement numberOfGuys
  60. DIM SHARED penUp, currentColor, eraserOn AS INTEGER: penUp = TRUE: currentColor = 0: eraserOn = FALSE
  61. DIM SHARED mute AS INTEGER: mute = -1 ' -1 mute is off (sound on)
  62. DIM SHARED lastLevelCreated AS INTEGER: lastLevelCreated = 0
  63. DIM SHARED changeBallSomewhat AS INTEGER: changeBallSomewhat = 0 'used to move the ball a little bit to avoid never hitting all of the bricks
  64. DIM levelChecking AS INTEGER: levelChecking = 0 'used in the following loop to check what is the highest level
  65. DIM SHARED activeLetter AS droppingLetter: activeLetter.x = 0: activeLetter.y = 0: activeLetter.letter = 0
  66. DIM SHARED paddleLength AS INTEGER: paddleLength = 8
  67. DIM SHARED activeBall AS INTEGER 'as is or both if 3
  68.  
  69. CALL Menu
  70.  
  71. SUB Menu
  72.     printTheMenu = TRUE 'used to stop the menu from flickering
  73.     DO
  74.         IF printTheMenu = TRUE THEN
  75.             COLOR 14, 1
  76.             CLS
  77.             LOCATE 20, 1
  78.             PRINT CenterText$("Menu")
  79.             PRINT CenterText$("------")
  80.             PRINT
  81.             PRINT CenterText$("1.) Instructions")
  82.             PRINT
  83.             PRINT CenterText$("2.) Create A Level")
  84.             PRINT
  85.             PRINT CenterText$("3.) Play The Game")
  86.             PRINT
  87.             PRINT CenterText$("4.) Exit")
  88.             printTheMenu = FALSE
  89.         END IF
  90.         menuCommand$ = INKEY$
  91.         SELECT CASE menuCommand$
  92.             CASE "1"
  93.                 CALL Instructions
  94.                 printTheMenu = TRUE
  95.             CASE "2"
  96.                 CALL CreationMain
  97.                 printTheMenu = TRUE
  98.             CASE "3"
  99.                 CALL Main
  100.                 printTheMenu = TRUE
  101.         END SELECT
  102.     LOOP UNTIL menuCommand$ = "4"
  103.     END
  104.  
  105. SUB Instructions
  106.     COLOR 10, 1
  107.     CLS
  108.     LOCATE 2
  109.     PRINT CenterText$("Level Creator")
  110.     PRINT CenterText$("---------------")
  111.  
  112.     PRINT CenterText$("The available commands are listed at the bottom of the screen.")
  113.     PRINT CenterText$("When the pen is up, the cursor moves without adding to the level")
  114.     PRINT CenterText$("being created. When the pen is down the current brick is added")
  115.     PRINT CenterText$("to the level being created. The other commands are self explanatory.")
  116.     COLOR 12, 1
  117.     PRINT CenterText$("If no levels have been created, the default level is used.")
  118.     PRINT CenterText$("If you progress beyond all levels created, the last level created repeats.")
  119.     PRINT
  120.     PRINT
  121.     COLOR 14, 1
  122.     PRINT CenterText$("Game")
  123.     PRINT CenterText$("------")
  124.  
  125.     PRINT CenterText$("The object of the game is to progress to the next level by")
  126.     PRINT CenterText$("destroying all of the bricks. To do this you must position the")
  127.     PRINT
  128.     COLOR 15, 1
  129.     PRINT CenterText$(CHR$(219) + CHR$(219) + CHR$(219) + CHR$(219) + CHR$(219) + CHR$(219) + CHR$(219) + CHR$(219))
  130.     PRINT
  131.     COLOR 14, 1
  132.     PRINT CenterText$("under the ball so that it is reflected toward the bricks using")
  133.     PRINT CenterText$("the left and right arrow keys.")
  134.     LOCATE 24, 21
  135.     PRINT "Push ";: COLOR 13, 1: PRINT "[SPACEBAR]";: COLOR 14, 1: PRINT " to set the ball in motion."
  136.     PRINT: PRINT
  137.     COLOR 13, 1:
  138.     LOCATE , 5: PRINT "     Available Commands                         Bonus Drops": COLOR 14, 1: PRINT
  139.     LOCATE , 5: PRINT "+ to increase the game speed               E = Expand paddle": PRINT
  140.     LOCATE , 5: PRINT "- to decrease the game speed               S = Shrink paddle": PRINT
  141.     LOCATE , 5: PRINT "P to pause the game                        + = Plus 15 points": PRINT
  142.     LOCATE , 5: PRINT "M to toggle mute on and off                - = Minus 15 points": PRINT
  143.     LOCATE , 2: PRINT "[ESC] to return to the main menu           * = Score multiplier (-1, 1.5 or 2)": PRINT
  144.     PRINT: PRINT
  145.     PRINT CenterText$("Push C to turn on debug mode and O to turn it off.")
  146.     LOCATE 48
  147.     COLOR 15, 1
  148.     PRINT CenterText$("Push any key to continue.")
  149.     CALL P(FALSE)
  150.  
  151. FUNCTION CenterText$ (thisString$)
  152.     returnString$ = SPACE$(INT((80 - LEN(thisString$)) / 2)) + thisString$
  153.     CenterText$ = returnString$
  154.  
  155. SUB PrintBrick (x, y, onOrOff)
  156.     IF onOrOff = TRUE THEN
  157.         useColor = board(x, y, 2) 'print the brick instead of erasing it, pick up the color there
  158.     ELSEIF onOrOff = FALSE THEN
  159.         useColor = 1
  160.     END IF
  161.     FOR across = 0 TO 5
  162.         LOCATE y, x + across
  163.         COLOR useColor
  164.         PRINT CHR$(219)
  165.         board(x + across, y, 1) = 219
  166.         board(x + across, y, 2) = useColor
  167.     NEXT across
  168.     IF onOrOff = FALSE THEN 'brick is destroyed
  169.         numberOfBricks = numberOfBricks - 1
  170.         score = score + 5
  171.         chanceOfLetter = INT(RND * 100) + 1
  172.         IF chanceOfLetter <= 25 AND activeLetter.letter = 0 THEN ' 25% chance of bonus
  173.             pickingLetter = INT(RND * 5) + 1 'choose which bonus to activate
  174.             SELECT CASE pickingLetter
  175.                 CASE 1
  176.                     activeLetter.letter = letterE
  177.                 CASE 2
  178.                     activeLetter.letter = letterS
  179.                 CASE 3
  180.                     activeLetter.letter = letterPlus
  181.                 CASE 4
  182.                     activeLetter.letter = letterMinus
  183.                 CASE 5
  184.                     activeLetter.letter = letterStar
  185.             END SELECT
  186.             activeLetter.x = x + 3 'place the falling letter near the center of destroyed brick
  187.             activeLetter.y = y + 1
  188.             CALL PrintLetter(TRUE)
  189.         END IF
  190.         CALL PrintBoard
  191.     END IF
  192.  
  193. SUB PrintLetter (onOrOff)
  194.     IF INT(activeLetter.y) < 47 THEN 'whether the bonus letter is done falling
  195.         IF onOrOff = TRUE THEN 'display the bonus letter
  196.             clr = 9
  197.         ELSE
  198.             clr = 1 'remove bonus letter from display
  199.         END IF
  200.         CALL PlaceChar(activeLetter.x, activeLetter.y, activeLetter.letter, clr) 'put the letter on the board
  201.     ELSEIF activeLetter.y >= 47 THEN 'activate the letter or ignore it
  202.         IF paddleLeft <= activeLetter.x AND activeLetter.x <= paddleLeft + paddleLength - 1 THEN 'letter was caught
  203.             SELECT CASE activeLetter.letter 'which letter to activate
  204.                 CASE letterE 'lengthen the paddle
  205.                     IF paddleLength <= 10 THEN paddleLength = paddleLength + 2
  206.                     CALL PrintPaddle(TRUE)
  207.                 CASE letterS 'shrink the paddle
  208.                     IF paddleLength >= 8 THEN
  209.                         CALL PrintPaddle(FALSE)
  210.                         paddleLength = paddleLength - 2
  211.                         CALL PrintPaddle(TRUE)
  212.                     ELSEIF paddleLength > 5 AND paddleLength <= 7 THEN
  213.                         CALL PrintPaddle(FALSE)
  214.                         paddleLength = paddleLength - 1
  215.                         CALL PrintPaddle(TRUE)
  216.                     END IF
  217.                 CASE letterPlus 'increase score
  218.                     score = score + 15
  219.                 CASE letterMinus ' decrease score
  220.                     score = score - 15
  221.                 CASE letterStar 'multiply the score
  222.                     DIM multiplier AS SINGLE
  223.                     multiplier = INT(RND * 3) + 1
  224.                     IF multiplier = 1 THEN
  225.                         multiplier = -1
  226.                     ELSEIF multiplier = 3 THEN
  227.                         multiplier = 1.5
  228.                     END IF
  229.                     score = INT(score * multiplier)
  230.             END SELECT 'action has been done with selected bonus letter
  231.         END IF ' the letter has finished being caught
  232.         activeLetter.x = 0: activeLetter.y = 0: activeLetter.letter = 0 'the letter is no longer active
  233.     END IF
  234.  
  235. SUB PrintLevel (cl)
  236.     'clear the playing field
  237.     FOR x = 1 TO 80: FOR y = 1 TO 48 'make the board blue
  238.             board(x, y, 1) = 219 '    ASCII code of board space
  239.             board(x, y, 2) = 1 '      color of board space
  240.     NEXT y: NEXT x
  241.     COLOR 1, 1: CLS
  242.     'print left, right and top borders and put them on the board
  243.     FOR y = 1 TO 48
  244.         LOCATE y, 1: COLOR 12, 1: PRINT CHR$(219) 'print the left border to the screen
  245.         LOCATE y, 80: COLOR 12, 1: PRINT CHR$(219) 'print the right border to the screen
  246.         CALL PlaceChar(1, y, 219, 12) ' put the position, ASCII code and color on the board to make the left border
  247.         CALL PlaceChar(80, y, 219, 12) ' same to make the left border on the board
  248.     NEXT y
  249.     FOR x = 1 TO 80
  250.         LOCATE 1, x: COLOR 12, 1: PRINT CHR$(219) 'print the top border to the screen
  251.         CALL PlaceChar(x, 1, 219, 12) ' put the top border on the board
  252.     NEXT x
  253.     paddleLeft = INT(RND * (72 - 2 + 1)) + 2 'position the paddle to start
  254.     paddleLength = 8
  255.     CALL PrintPaddle(TRUE) ' put the paddle on the board with the left at x coordinate 36
  256.     activeBall = 1
  257.     ball(activeBall).x = paddleLeft + 4: ball(activeBall).y = 47 ' position the ball/moving ball
  258.     CALL PrintBall(activeBall, TRUE) ' put the ball on the board
  259.     ballDirection(activeBall) = INT(RND * 2) + 1 'randomize the starting direction of the ball as up and left or up and right
  260.     IF _FILEEXISTS("Highest Level") THEN
  261.         OPEN "Highest Level" FOR INPUT AS #1
  262.         INPUT #1, highLev$
  263.         highestLevel = VAL(highLev$)
  264.         CLOSE #1
  265.     ELSE
  266.         highestLevel = 0
  267.     END IF
  268.     filename$ = ""
  269.     IF currentLevel < highestLevel THEN
  270.         filename$ = "Level " + S$(currentLevel)
  271.     ELSEIF highestLevel <> 0 THEN
  272.         filename$ = "Level " + S$(highestLevel)
  273.     END IF
  274.     IF filename$ <> "" THEN
  275.         OPEN filename$ FOR INPUT AS #1 'open the file with the level information
  276.         FOR xCounting = 2 TO 79 ' x coordinate of the board
  277.             FOR yCounting = 2 TO 46 ' y coordinate of the board
  278.                 INPUT #1, boardColor$ ' get the color of the board at xCounting, yCounting
  279.                 board(xCounting, yCounting, 2) = VAL(boardColor$) 'color the board at xCounting, yCounting
  280.         NEXT: NEXT
  281.         CLOSE #1
  282.     ELSE
  283.         FOR x = 2 TO 79
  284.             CALL PlaceChar(x, 2, 219, 14) 'put a yellow (14) block (219) at x, y on the board
  285.             CALL PlaceChar(x, 4, 219, 14)
  286.             CALL PlaceChar(x, 6, 219, 14)
  287.         NEXT x
  288.         lastLevelCreated = 1
  289.     END IF
  290.     numberOfBricks = 0 ' after a level has been put on the board, count the number of bricks on it
  291.     FOR brickCountingY = 2 TO 46 'with this set to 47 the ball was being counted as a brick sometimes
  292.         FOR brickCountingX = 2 TO 79 STEP 6 'each brick is 6 blocks long
  293.             IF board(brickCountingX, brickCountingY, 2) <> 1 THEN
  294.                 numberOfBricks = numberOfBricks + 1
  295.             END IF
  296.     NEXT: NEXT
  297.     CALL PrintBoard 'print the board to the screen
  298.     spaceToStart = FALSE 'spacebar has yet to be puched to start the current level
  299.  
  300. SUB Main
  301.     CALL PrintLevel(currentLevel) 'put the current level on the board and print it out
  302.     printOutBoard = FALSE ' to avoid flicker of the board being constantly printed, the need to print it is false
  303.     delaySpeed = 0.029 'delay to use inside the main DO-LOOP
  304.     activeBall = 1
  305.     DO
  306.         debugging$ = INKEY$ 'using strings instead of _KEYDOWN(code) is easier. i initially added INKEY$ for debugging
  307.         IF spaceToStart = TRUE THEN ' the spacebar has been hit to start the game
  308.             IF activeBall <> 3 THEN
  309.                 CALL PrintBall(activeBall, FALSE)
  310.                 CALL MoveBall(activeBall)
  311.                 CALL PrintBall(activeBall, TRUE)
  312.             ELSE
  313.                 CALL PrintBall(1, FALSE)
  314.                 CALL PrintBall(2, FALSE)
  315.                 CALL MoveBall(1)
  316.                 CALL MoveBall(2)
  317.                 CALL PrintBall(1, TRUE)
  318.                 CALL PrintBall(2, TRUE)
  319.             END IF
  320.             IF _KEYDOWN(leftDirection) = -1 THEN 'the left arrow key had been pushed
  321.                 CALL PrintPaddle(FALSE) ' remove the paddle from the board
  322.                 paddleLeft = paddleLeft - 1.5 ' move the paddle leftward
  323.                 CALL PrintPaddle(TRUE) ' put the paddle on the board at the new position
  324.                 printOutBoard = TRUE 'it is now needed to print the board to the screen
  325.             ELSEIF _KEYDOWN(rightDirection) = -1 THEN
  326.                 CALL PrintPaddle(FALSE)
  327.                 paddleLeft = paddleLeft + 1.5
  328.                 CALL PrintPaddle(TRUE)
  329.                 printOutBoard = TRUE
  330.             END IF
  331.             IF printOutBoard = TRUE THEN 'print the board to the screen
  332.                 CALL PrintBoard ' print the board to the screen
  333.                 printOutBoard = FALSE 'stop the board from being printed now
  334.             END IF
  335.             IF numberOfBricks = 0 THEN 'there are no bricks left on the board
  336.                 currentLevel = currentLevel + 1 'increment the current level
  337.                 activeLetter.letter = 0: activeLetter.x = 0: activeLetter.y = 0
  338.                 CALL PrintLevel(currentLevel) 'put the newest level on the board
  339.                 spaceToStart = FALSE 'the spacebar has not been pressed since the new level has been output
  340.                 score = score + 200 '200 points for finishing a level
  341.                 IF mute = -1 THEN PLAY successBeep '1 is mute, -1 is note muted
  342.             END IF
  343.             IF activeLetter.letter <> 0 THEN
  344.                 CALL PrintLetter(FALSE)
  345.                 activeLetter.y = activeLetter.y + 0.5
  346.                 CALL PrintLetter(TRUE)
  347.                 printOutBoard = TRUE
  348.             END IF
  349.         END IF
  350.         IF debugging$ = "C" THEN debugMode = TRUE
  351.         IF debugging$ = "O" THEN debugMode = FALSE
  352.         IF _KEYDOWN(32) = -1 THEN ' the spacebar has been pushed
  353.             spaceToStart = TRUE ' the spacebar has been pushed
  354.             printOutBoard = TRUE ' it is needed to print the board to the screen
  355.         END IF
  356.         _DELAY (delaySpeed) ' insert a delay to make the movement playable and visible
  357.         IF numberOfGuys = 0 THEN CALL EndOfGame
  358.         IF score MOD 750 = 0 AND score <> 0 THEN numberOfGuys = numberOfGuys + 1 ' new guy every 2,000 points
  359.         IF debugging$ = "+" THEN 'increase the game speed
  360.             delaySpeed = delaySpeed - 0.005
  361.             IF delaySpeed < 0 THEN delaySpeed = 0 'don't allow a negative delay
  362.         END IF
  363.         IF debugging$ = "-" THEN delaySpeed = delaySpeed + 0.005 'decrease the game speed
  364.         IF debugging$ = "m" OR debugging$ = "M" THEN mute = mute * -1 'turn mute on or off
  365.         IF debugging$ = "p" OR debugging$ = "P" THEN pause$ = INPUT$(1) 'pause the game
  366.         IF debugging$ = CHR$(27) THEN EXIT DO 'end the game and return to the main menu
  367.     LOOP
  368.  
  369. SUB EndOfGame
  370.     COLOR 15, 0
  371.     CLS
  372.     PRINT "Game over"
  373.     CALL P(FALSE)
  374.  
  375. SUB MoveBall (whichOne)
  376.     changeBallSomewhat = changeBallSomewhat + 1 'keep track of the number of times the ball has moved to occasionally nudge it
  377.     SELECT CASE ballDirection(whichOne)
  378.         CASE upAndRight
  379.             CALL MoveUpAndRight(whichOne)
  380.         CASE upAndLeft
  381.             CALL MoveUpAndLeft(whichOne)
  382.         CASE downAndRight
  383.             CALL MoveDownAndRight(whichOne)
  384.         CASE downAndLeft
  385.             CALL MoveDownAndLeft(whichOne)
  386.     END SELECT
  387.  
  388. FUNCTION Report (x, y) 'determine what element is at specified x, y location
  389.     'if color  12 then border, 1 then background, 15 then paddle, 11 ball, 9 bonus, else brick
  390.     rtn = -1 'initialize what should be returned
  391.     SELECT CASE board(x, y, 2)
  392.         CASE 12
  393.             rtn = theWall
  394.         CASE 1
  395.             rtn = theBackground
  396.         CASE 15
  397.             rtn = thePaddle
  398.         CASE 11
  399.             rtn = theBall
  400.         CASE 9
  401.             rtn = theBonus
  402.         CASE ELSE
  403.             rtn = theBrick
  404.     END SELECT
  405.     Report = rtn
  406.  
  407. SUB MoveUpAndRight (thisBall)
  408.     SELECT CASE Report(ball(thisBall).x + 1, ball(thisBall).y - 1) 'report one away from where the ball currently is
  409.         CASE theBackground, theBall ' move it even if both balls are in the same place
  410.             ball(thisBall).x = ball(thisBall).x + 1
  411.             ball(thisBall).y = ball(thisBall).y - 1
  412.             IF changeBallSomewhat MOD 100 = 0 AND ball(thisBall).x + 1 < 80 THEN ball(thisBall).x = ball(thisBall).x + 1
  413.         CASE theWall
  414.             IF mute = -1 THEN PLAY hitWallSound
  415.             IF ball(thisBall).x + 1 = 80 THEN
  416.                 'hit the right wall
  417.                 ballDirection(thisBall) = upAndLeft
  418.             ELSEIF ball(thisBall).y - 1 = 1 THEN
  419.                 'hit top wall
  420.                 ballDirection(thisBall) = downAndRight
  421.             END IF
  422.         CASE theBrick
  423.             IF mute = -1 THEN PLAY hitBrickSound
  424.             leftSideOfBrick = FindBrickLeft(ball(thisBall).x + 1)
  425.             vertOfBrick = FindBrickVertical(ball(thisBall).y - 1)
  426.             CALL PrintBrick(leftSideOfBrick, vertOfBrick, FALSE)
  427.             ballDirection(thisBall) = downAndRight
  428.     END SELECT
  429.  
  430. SUB MoveUpAndLeft (b)
  431.     SELECT CASE Report(ball(b).x - 1, ball(b).y - 1)
  432.         CASE theBackground, theBall, theBonus
  433.             ball(b).x = ball(b).x - 1
  434.             ball(b).y = ball(b).y - 1
  435.             IF changeBallSomewhat MOD 100 = 0 AND ball(b).x - 1 > 1 THEN ball(b).x = ball(b).x - 1
  436.         CASE theWall
  437.             IF mute = -1 THEN PLAY hitWallSound
  438.             IF ball(b).x - 1 = 1 THEN
  439.                 ballDirection(b) = upAndRight
  440.             ELSEIF ball(b).y - 1 = 1 THEN 'hit the top
  441.                 ballDirection(b) = downAndLeft
  442.             END IF
  443.         CASE theBrick
  444.             IF mute = -1 THEN PLAY hitBrickSound
  445.             leftSideOfBrick = FindBrickLeft(ball(b).x - 1)
  446.             vertOfBrick = FindBrickVertical(ball(b).y - 1)
  447.             CALL PrintBrick(leftSideOfBrick, vertOfBrick, FALSE)
  448.             ballDirection = downAndLeft
  449.     END SELECT
  450.  
  451. SUB MoveDownAndRight (var)
  452.     SELECT CASE Report(ball(var).x + 1, ball(var).y + 1)
  453.         CASE theBackground, theBall, theBonus
  454.             IF ball(var).y + 1 = 48 THEN
  455.                 IF debugMode = FALSE THEN
  456.                     CALL PrintBall(var, FALSE) 'remove the ball the fell from the screen
  457.                     IF activeBall <> 3 THEN 'activeBall is 1 or 2
  458.                         score = score - 50
  459.                         spaceToStart = FALSE
  460.                         CALL PrintPaddle(FALSE)
  461.                         paddleLength = 8
  462.                         paddleLeft = INT(RND * (72 - 2 + 1)) + 2
  463.                         activeBall = 1
  464.                         ball(activeBall).x = paddleLeft + 4: ball(activeBall).y = 47
  465.                         CALL PrintBall(activeBall, TRUE)
  466.                         CALL PrintPaddle(TRUE)
  467.                         ballDirection(activeBall) = INT(RND * 2) + 1
  468.                         IF mute = -1 THEN PLAY deathSound
  469.                         numberOfGuys = numberOfGuys - 1
  470.                         CALL PrintBoard
  471.                     ELSEIF activeBall = 3 THEN
  472.                         IF var = 1 THEN
  473.                             activeBall = 2
  474.                         ELSEIF var = 2 THEN
  475.                             activeBall = 1
  476.                         END IF
  477.                         ball(var).x = 0
  478.                         ball(var).y = 0
  479.                         COLOR 10, 0: LOCATE 10, 1
  480.                         PRINT "ball(var).x, ball(var).y"
  481.                         PRINT "ball(" + S$(var) + ").x, ball(+"; S$(var) + ").y"
  482.                         PRINT S$(ball(var).x) + ", " + S$(ball(var).y)
  483.                         PRINT "activeBall: " + S$(activeBall)
  484.                         CALL P(TRUE)
  485.                     ELSE
  486.                         LOCATE 40, 1: COLOR 15, 0: PRINT "MoveDownAndRight has active ball<>1, 2 or 3": CALL P(TRUE)
  487.                     END IF
  488.                 ELSE 'debug mode is on (true)
  489.                     IF mute = -1 THEN PLAY hitWallSound
  490.                     ballDirection(var) = upAndRight
  491.                     ball(var).x = ball(var).x + 1
  492.                     ball(var).y = ball(var).y - 1
  493.                     IF changeBallSomewhat MOD 100 = 0 AND ball(var).x + 1 < 80 THEN ball(var).x = ball(var).x + 1
  494.                 END IF
  495.             ELSE 'debug is on
  496.                 ball(var).x = ball(var).x + 1
  497.                 ball(var).y = ball(var).y + 1
  498.             END IF
  499.         CASE theWall
  500.             IF mute = -1 THEN PLAY hitWallSound
  501.             IF ball(var).x + 1 = 80 THEN ballDirection(var) = downAndLeft
  502.         CASE theBrick
  503.             IF mute = -1 THEN PLAY hitBrickSound
  504.             leftSideOfBrick = FindBrickLeft(ball(var).x + 1)
  505.             vertOfBrick = FindBrickVertical(ball(var).y + 1)
  506.             CALL PrintBrick(leftSideOfBrick, vertOfBrick, FALSE)
  507.             ballDirection(var) = upAndRight
  508.         CASE thePaddle
  509.             IF mute = -1 THEN PLAY hitPaddleSound
  510.             ballDirection(var) = upAndRight
  511.     END SELECT
  512.  
  513. SUB MoveDownAndLeft (i)
  514.     SELECT CASE Report(ball(i).x - 1, ball(i).y + 1)
  515.         CASE theBackground, theBall, theBonus
  516.             IF ball(i).y + 1 = 48 THEN
  517.                 IF debugMode = FALSE THEN
  518.                     CALL PrintBall(i, FALSE)
  519.                     IF activeBall <> 3 THEN 'only one ball was active
  520.                         score = score - 50
  521.                         spaceToStart = FALSE
  522.                         CALL PrintPaddle(FALSE)
  523.                         paddleLeft = INT(RND * (72 - 2% + 1)) + 2
  524.                         paddleLength = 8
  525.                         activeBall = 1
  526.                         ball(activeBall).x = paddleLeft + 4: ball(activeBall).y = 47
  527.                         CALL PrintBall(activeBall, TRUE)
  528.                         CALL PrintPaddle(TRUE)
  529.                         ballDirection(activeBall) = INT(RND * 2) + 1
  530.                         IF mute = -1 THEN PLAY deathSound
  531.                         numberOfGuys = numberOfGuys - 1
  532.                         CALL PrintBoard
  533.                     ELSE 'one ball fell off the screen
  534.                         IF i = 1 THEN
  535.                             activeBall = 2
  536.                         ELSEIF i = 2 THEN
  537.                             activeBall = 1
  538.                         END IF
  539.                         ball(i).x = 0
  540.                         ball(i).y = 0
  541.                     END IF
  542.                 ELSE 'in debug mode
  543.                     IF mute = -1 THEN PLAY hitWallSound
  544.                     ballDirection(i) = upAndLeft
  545.                     ball(i).x = ball(i).x - 1
  546.                     ball(i).y = ball(i).y - 1
  547.                     IF changeBallSomewhat MOD 100 = 0 AND ball(i).x - 1 > 1 THEN ball(i).x = ball(i).x + 1
  548.                 END IF
  549.             ELSE 'not at bottom of screen
  550.                 ball(i).x = ball(i).x - 1
  551.                 ball(i).y = ball(i).y + 1
  552.             END IF
  553.         CASE theWall
  554.             IF mute = -1 THEN PLAY hitWallSound
  555.             IF ball(i).x - 1 = 1 THEN ballDirection(i) = downAndRight
  556.         CASE theBrick
  557.             IF mute = -1 THEN PLAY hitBrickSound
  558.             leftSideOfBrick = FindBrickLeft(ball(i).x - 1)
  559.             vertOfBrick = FindBrickVertical(ball(i).y + 1)
  560.             CALL PrintBrick(leftSideOfBrick, vertOfBrick, FALSE)
  561.             ballDirection(i) = upAndLeft
  562.         CASE thePaddle
  563.             IF mute = -1 THEN PLAY hitPaddleSound
  564.             ballDirection(i) = upAndLeft
  565.     END SELECT
  566.  
  567. FUNCTION FindBrickLeft (x) 'this returns the x coordinate of the brick that was hit
  568.     rtn = 0
  569.     FOR cnt = 2 TO 79 STEP 6
  570.         IF cnt <= x AND x <= cnt + 5 THEN rtn = cnt
  571.     NEXT cnt
  572.     FindBrickLeft = rtn
  573.  
  574. FUNCTION FindBrickVertical (y)
  575.     rtn = 0
  576.     FOR cnt = 2 TO 47
  577.         IF cnt = y THEN rtn = cnt
  578.     NEXT
  579.     FindBrickVertical = rtn
  580.  
  581. SUB PrintBall (whichBall, onOrOff) 'put the ball on the board or remove it from the board to effect position change
  582.     IF onOrOff = TRUE THEN
  583.         useColor = 11
  584.     ELSEIF onOrOff = FALSE THEN
  585.         useColor = 1
  586.     END IF
  587.     CALL PlaceChar(ball(whichBall).x, ball(whichBall).y, 254, useColor)
  588.     CALL PrintBoard
  589.  
  590. SUB PrintPaddle (onOrOff)
  591.     IF onOrOff = TRUE THEN
  592.         theColor = 15
  593.     ELSEIF onOrOf = FALSE THEN
  594.         theColor = 1
  595.     END IF
  596.     IF paddleLeft < 2 THEN paddleLeft = 2
  597.     IF paddleLeft > 80 - paddleLength THEN paddleLeft = 80 - paddleLength
  598.     FOR across = 0 TO paddleLength - 1
  599.         LOCATE 48, INT(paddleLeft) + across: COLOR theColor: PRINT CHR$(219)
  600.         CALL PlaceChar(INT(paddleLeft) + across, 48, 219, theColor)
  601.     NEXT across
  602.  
  603. SUB PlaceChar (X, Y, char, clr) 'put the character ASCII with specified color on the board
  604.     board(X, Y, 1) = char 'character
  605.     board(X, Y, 2) = clr ' color
  606.  
  607. SUB PrintBoard 'print the current board configurationg to the screen and update the current stats displayed
  608.     FOR y = 2 TO 48: FOR x = 2 TO 79
  609.             this$ = CHR$(board(x, y, 1))
  610.             theColor = board(x, y, 2)
  611.             COLOR theColor, 1
  612.             LOCATE y, x
  613.             PRINT this$
  614.             IF BrickIsThere(x, y) = TRUE THEN
  615.                 xCo = FindBrickLeft(x)
  616.                 yCo = FindBrickVertical(y)
  617.                 CALL PrintBrick(xCo, yCo, TRUE)
  618.             END IF
  619.     NEXT x: NEXT y
  620.     LOCATE 1, 2: COLOR 10, 12
  621.     PRINT "  Level " + S$(currentLevel) + "       ";
  622.     PRINT "Men: " + S$(numberOfGuys) + "       ";
  623.     PRINT "Bricks remaining: " + S$(numberOfBricks) + "       ";
  624.     PRINT "Score: " + S$(score) + "    "
  625.  
  626. FUNCTION BrickIsThere (xCoord, yCoord)
  627.     x = xCoord: y = yCoord
  628.     rtn = FALSE
  629.     IF board(x, y, 2) <> 11 AND board(x, y, 2) <> 15 AND board(x, y, 2) <> 12 AND board(x, y, 2) <> 9 AND board(x, y, 2) <> 1 THEN rtn = TRUE
  630.     BrickIsThere = rtn
  631.  
  632. SUB CreationMain 'main subroutine for the level creation feature
  633.     penUp = TRUE
  634.     eraserOn = FALSE
  635.     currentColor = 0
  636.     brick.x = 2
  637.     brick.y = 2
  638.     FOR countX = 2 TO 79
  639.         FOR countY = 2 TO 46
  640.             creationBoard(countX, countY) = 1
  641.     NEXT: NEXT
  642.     CALL PrintBackdrop
  643.     CALL PrintCreationBoard
  644.     CALL PrintCreationBrick
  645.     printOutCurrentBoard = FALSE
  646.     DO
  647.         whichCommand$ = INKEY$
  648.         SELECT CASE whichCommand$
  649.             CASE "P", "p"
  650.                 IF penUp = TRUE THEN
  651.                     penUp = FALSE
  652.                     CALL PutBrickOnBoard
  653.                 ELSEIF penUp = FALSE AND eraserOn = FALSE THEN
  654.                     penUp = TRUE
  655.                 END IF
  656.                 CALL PrintBackdrop
  657.                 printOutCurrentBoard = TRUE
  658.             CASE "E", "e"
  659.                 IF eraserOn = FALSE THEN
  660.                     eraserOn = TRUE
  661.                     currentColor = 1
  662.                     penUp = FALSE
  663.                     CALL PutBrickOnBoard
  664.                 ELSEIF eraserOn = TRUE THEN
  665.                     eraserOn = FALSE
  666.                     currentColor = 0
  667.                     penUp = TRUE
  668.                 END IF
  669.                 printOutCurrentBoard = TRUE
  670.             CASE "C", "c" 'game uses 12, 15, 11, 1 and 9, 17
  671.                 IF currentColor = 0 THEN
  672.                     currentColor = 2
  673.                 ELSEIF currentColor = 8 THEN
  674.                     currentColor = 10
  675.                 ELSEIF currentColor = 10 THEN
  676.                     currentColor = 13
  677.                 ELSEIF currentColor = 14 THEN
  678.                     currentColor = 16
  679.                 ELSEIF currentColor = 16 THEN
  680.                     currentColor = 18
  681.                 ELSEIF currentColor < 31 THEN
  682.                     currentColor = currentColor + 1
  683.                 ELSEIF currentColor = 31 THEN
  684.                     currentColor = 0
  685.                 END IF
  686.                 printOutCurrentBoard = TRUE
  687.                 IF penUp = FALSE THEN CALL PutBrickOnBoard
  688.             CASE "A", "a"
  689.                 penUp = TRUE
  690.                 eraserOn = FALSE
  691.                 currentColor = 0
  692.                 FOR xCount = 2 TO 79
  693.                     FOR yCount = 2 TO 46
  694.                         creationBoard(xCount, yCount) = 1
  695.                 NEXT: NEXT
  696.                 printOutCurrentBoard = TRUE
  697.             CASE "s", "S"
  698.                 IF SaveBoard$ = "END" THEN EXIT DO
  699.             CASE CHR$(0) + "H" ' up
  700.                 IF brick.y > 2 THEN
  701.                     brick.y = brick.y - 1
  702.                     IF penUp = FALSE THEN CALL PutBrickOnBoard
  703.                     printOutCurrentBoard = TRUE
  704.                 END IF
  705.             CASE CHR$(0) + "K" ' left
  706.                 IF brick.x > 7 THEN
  707.                     brick.x = brick.x - 6
  708.                     IF penUp = FALSE THEN CALL PutBrickOnBoard
  709.                     printOutCurrentBoard = TRUE
  710.                 END IF
  711.             CASE CHR$(0) + "P" ' down
  712.                 IF brick.y < 47 THEN
  713.                     brick.y = brick.y + 1
  714.                     IF penUp = FALSE THEN CALL PutBrickOnBoard
  715.                     printOutCurrentBoard = TRUE
  716.                 END IF
  717.             CASE CHR$(0) + "M" ' right
  718.                 IF brick.x < 73 THEN
  719.                     brick.x = brick.x + 6
  720.                     IF penUp = FALSE THEN CALL PutBrickOnBoard
  721.                     printOutCurrentBoard = TRUE
  722.                 END IF
  723.             CASE CHR$(27)
  724.                 EXIT DO
  725.         END SELECT
  726.         IF printOutCurrentBoard = TRUE THEN
  727.             CALL PrintBackdrop
  728.             CALL PrintCreationBoard
  729.             CALL PrintCreationBrick
  730.             printOutCurrentBoard = FALSE
  731.         END IF
  732.     LOOP
  733.  
  734. FUNCTION SaveBoard$
  735.     COLOR 10, 0
  736.     CLS
  737.     hghstLvl = 0
  738.     IF _FILEEXISTS("Highest Level") THEN
  739.         OPEN "Highest Level" FOR INPUT AS #1
  740.         INPUT #1, hl$
  741.         highestLevel = VAL(hl$)
  742.         CLOSE #1
  743.         highestLevel = highestLevel + 1
  744.         OPEN "Highest Level" FOR OUTPUT AS #1
  745.         PRINT #1, S$(highestLevel)
  746.         CLOSE #1
  747.     ELSE
  748.         OPEN "Highest Level" FOR OUTPUT AS #1
  749.         PRINT #1, S$(1)
  750.         CLOSE #1
  751.         highestLevel = 1
  752.     END IF
  753.  
  754.     filename$ = "Level " + S$(highestLevel)
  755.     LOCATE 10, 10
  756.     PRINT "The game board has been saved as " + CHR$(34) + "Level " + S$(highestLevel) + CHR$(34)
  757.     PRINT
  758.     IF highestLevel > 1 THEN PRINT "It will automatically be loaded after Level " + S$(highestLevel - 1) + " is completed."
  759.     PRINT
  760.     OPEN filename$ FOR OUTPUT AS #1
  761.     FOR x = 2 TO 79
  762.         FOR y = 2 TO 46
  763.             COLOR 10, 0: LOCATE 15, 15: PRINT "Working"
  764.             stringOut$ = S$(creationBoard(x, y))
  765.             IF LEN(stringOut$) = 1 THEN stringOut$ = " " + stringOut$
  766.             PRINT #1, stringOut$
  767.             COLOR 0, 0: LOCATE 15, 15: PRINT "Working"
  768.     NEXT: NEXT
  769.     CLOSE #1
  770.     COLOR 10, 0
  771.     a$ = "Push " + CHR$(34) + "A" + CHR$(34) + " to make (a)nother level"
  772.     LOCATE 30, (80 - LEN(a$)) / 2
  773.     PRINT a$
  774.     b$ = "Push any other key to exit."
  775.     PRINT: PRINT
  776.     PRINT CenterText$(b$)
  777.     pause$ = INPUT$(1)
  778.     IF UCASE$(pause$) = "A" THEN
  779.         CALL CreationMain
  780.     ELSE
  781.         SaveBoard$ = "END"
  782.     END IF
  783.  
  784. SUB PutBrickOnBoard
  785.     FOR counting = 0 TO 5
  786.         creationBoard(brick.x + counting, brick.y) = currentColor
  787.     NEXT counting
  788.  
  789. SUB PrintCreationBrick
  790.     IF penUp = TRUE AND eraserOn = FALSE THEN
  791.         LOCATE brick.y, brick.x
  792.         COLOR 15, 1
  793.         PRINT CHR$(219)
  794.     ELSEIF penUp = FALSE AND eraserOn = TRUE THEN
  795.         LOCATE brick.y, brick.x
  796.         COLOR 7, 1
  797.         PRINT "-"
  798.     ELSE
  799.         LOCATE brick.y, brick.x
  800.         COLOR currentColor, 1
  801.         PRINT CHR$(219)
  802.     END IF
  803.     FOR count = 1 TO 5
  804.         LOCATE brick.y, brick.x + count
  805.         IF eraserOn = TRUE THEN
  806.             COLOR 7, 1
  807.             PRINT "-"
  808.         ELSE
  809.             COLOR currentColor, 1
  810.             PRINT CHR$(219)
  811.         END IF
  812.     NEXT
  813.  
  814.  
  815. SUB PrintCreationBoard
  816.     CALL PrintBackdrop
  817.     FOR y = 2 TO 46
  818.         FOR x = 2 TO 79
  819.             COLOR creationBoard(x, y), 1
  820.             LOCATE y, x
  821.             PRINT CHR$(219)
  822.     NEXT: NEXT
  823.  
  824. SUB PrintBackdrop
  825.     COLOR 1, 1: CLS
  826.     COLOR 12, 1
  827.     FOR x = 1 TO 80
  828.         LOCATE 1, x: PRINT CHR$(219)
  829.     NEXT
  830.     FOR y = 1 TO 48
  831.         LOCATE y, 1: PRINT CHR$(219)
  832.         LOCATE y, 80: PRINT CHR$(219)
  833.     NEXT
  834.     COLOR 14, 1
  835.     LOCATE 47, 3
  836.     PRINT "Use the Arrow Keys To Move      P - Pen ";
  837.     IF penUp = TRUE THEN
  838.         COLOR 10, 1
  839.         PRINT "up";
  840.         COLOR 14, 1
  841.         PRINT "/";
  842.         COLOR 7, 1
  843.         PRINT "down";
  844.     ELSE
  845.         COLOR 7, 1
  846.         PRINT "up";
  847.         COLOR 14, 1
  848.         PRINT "/";
  849.         COLOR 10, 1
  850.         PRINT "down";
  851.     END IF
  852.     PRINT "       ";
  853.     IF currentColor = 0 THEN
  854.         COLOR 0, 7
  855.     ELSE
  856.         COLOR currentColor, 0
  857.     END IF
  858.     PRINT "C - Cycle colors"
  859.     LOCATE 48, 2
  860.     COLOR 14, 1: PRINT "E - Eraser ";
  861.     'LOCATE 20, 20: COLOR 15, 0: PRINT "eraserOn = " + S$(eraserOn): CALL P
  862.     '    LOCATE 48, 26
  863.     IF eraserOn = TRUE THEN
  864.         COLOR 10, 1
  865.         PRINT "On";
  866.         COLOR 14, 1: PRINT "/";
  867.         COLOR 7, 1
  868.         PRINT "Off";
  869.     ELSE
  870.         COLOR 7, 1
  871.         PRINT "On";
  872.         COLOR 14, 1
  873.         PRINT "/";
  874.         COLOR 10, 1
  875.         PRINT "Off";
  876.     END IF
  877.     COLOR 14, 1
  878.     PRINT "     A - Clear All";
  879.     PRINT "     S - Save     [ESC] - End Without Save"
  880.     CALL PrintCreationBrick
  881.     '    LOCATE 45, 10: COLOR 10, 1: PRINT "eraserOn = " + S$(eraserOn)
  882.  
  883. SUB P (EndAllowed)
  884.     pause$ = INPUT$(1)
  885.     IF pause$ = CHR$(27) AND EndAllowed = TRUE THEN END
  886.  
  887. FUNCTION S$ (number)
  888.     S$ = LTRIM$(STR$(number))

14
QB64 Discussion / Password generator
« on: July 17, 2021, 03:50:23 pm »
Makes sure one of each character type is in the password. All passwords contain an uppercase letter, a lowercase letter and an integer with the length give by the user. User must input which special characters are valid. No very user friendly. For example if you try to make a two character password, the program goes into an endless loop while it tries to find a password with an uppercase, lowercase and integer. If you add special characters, the password length has to be at least four. I like this better than chrome generating a password.
Code: QB64: [Select]
  1. 'Creator: Jaze C McAskill
  2.  
  3. CONST FALSE = 0
  4. CONST TRUE = 1
  5.  
  6. PRINT "Special characters? ";
  7. specialCharsYN$ = UCASE$(INPUT$(1))
  8.  
  9. characterSet$ = "" 'define the list of characters from which to make the password
  10. FOR upperLower = 65 TO 64 + 26
  11.     characterSet$ = characterSet$ + CHR$(upperLower) 'add upper case letters
  12.     characterSet$ = characterSet$ + CHR$(upperLower + (96 - 64)) 'add lower case letters
  13.  
  14. FOR integers = 48 TO 48 + 9
  15.     characterSet$ = characterSet$ + CHR$(integers) 'add numbers
  16. NEXT integers
  17.  
  18. IF specialCharsYN$ = "Y" THEN 'get special characters from user
  19.     PRINT
  20.     PRINT "Type in character set to use, <ENTER> to stop."
  21.     another$ = ""
  22.     DO
  23.         characterSet$ = characterSet$ + another$ 'add provided special characters
  24.         another$ = INPUT$(1): PRINT another$ + " ";
  25.     LOOP UNTIL another$ = CHR$(13)
  26.  
  27. INPUT "Password length: "; pwlength
  28.  
  29. makePwAgain: 'place to return to if the password is missing an upper case, lower case, integer or special character
  30. pw$ = "": newChar$ = ""
  31.  
  32. FOR pickAcharFromCharacterSet = 1 TO pwlength 'loop from 1 to the length of the password to be generated
  33.     newChar$ = MID$(characterSet$, INT(RND * LEN(characterSet$) + 1), 1) 'pick a new character from the predefined set
  34.     pw$ = pw$ + newChar$ 'add it to the password
  35.  
  36. intInPw = FALSE '      used to make sure and integer is in the password
  37. upperCaseInPw = FALSE ' same for upper case
  38. lowerCaseInPw = FALSE ' lower case
  39. specialCharInPw = FALSE ' special character
  40.  
  41. 'the specialChar checking is the one I can't see yet
  42. FOR parsing = 1 TO LEN(pw$) 'check each character in the generated password to make sure one of each is there
  43.     IF ASC(MID$(pw$, parsing, 1)) >= 65 AND ASC(MID$(pw$, parsing, 1)) < 65 + 26 THEN 'there is an uppercase letter
  44.         upperCaseInPw = TRUE
  45.     ELSEIF ASC(MID$(pw$, parsing, 1)) >= 96 AND ASC(MID$(pw$, parsing, 1)) < 96 + 65 THEN 'there is a lowercase letter
  46.         lowerCaseInPw = TRUE
  47.     ELSEIF VAL(MID$(pw$, parsing, 1)) >= 0 AND VAL(MID$(pw$, parsing, 1)) < 10 THEN 'there is an integer
  48.         intInPw = TRUE
  49.     END IF
  50. NEXT parsing
  51. 'program knows if pw$ has an int, an upper case and a lower case
  52.  
  53. IF specialCharsYN$ = "Y" THEN 'check to make sure a special character was added
  54.     FOR parsing = (26 * 2 + 10) + 1 TO LEN(characterSet$) 'skip the uppercase, lowercase and integers in the set from wich the password is made
  55.         ifThisCharIsInPW$ = MID$(characterSet$, parsing, 1) ' cycle throgh the special characters
  56.         FOR parsing2 = 1 TO LEN(pw$)
  57.             IF MID$(pw$, parsing2, 1) = ifThisCharIsInPW$ THEN specialCharInPw = TRUE
  58.         NEXT parsing2
  59.     NEXT parsing
  60.     specialCharInPw = TRUE
  61.  
  62. IF intInPw = FALSE OR upperCaseInPw = FALSE OR lowerCaseInPw = FALSE OR specialCharInPw = FALSE THEN GOTO makePwAgain
  63. PRINT pw$

15
Programs / Function for the difference in minutes between two times
« on: July 16, 2021, 02:21:23 pm »
I previously posted this but later found an error. It takes two strings containing the time and date. It assumes the first string is the earlier of the two times. The time strings are in the format with one or two digits for hours, month and day. Assumes the time is in 12 hour time. For example, one valid string is 1:25 PM 12/7/2021
Code: QB64: [Select]
  1. FUNCTION GetDifference (earlierTime$, moreRecentTime$)
  2.     colonPosition1 = INSTR(earlierTime$, ":") 'format is H:MM #M M/D/YYYY to HH:MM #M MM/DD/YYYY so finging the colon is needed
  3.     colonPosition2 = INSTR(moreRecentTime$, ":") 'same
  4.     hours1 = VAL(LEFT$(earlierTime$, colonPosition1 - 1)) 'hours portion of the time
  5.     hours2 = VAL(LEFT$(moreRecentTime$, colonPosition2 - 1))
  6.     minutes1 = VAL(MID$(earlierTime$, colonPosition1 + 1, 2)) ' minutes portion of the time
  7.     minutes2 = VAL(MID$(moreRecentTime$, colonPosition2 + 1, 2))
  8.     IF MID$(earlierTime$, colonPosition1 + 4, 1) = "P" AND hours1 <> 12 THEN hours1 = hours1 + 12 'convert to 24hr
  9.     IF MID$(moreRecentTime$, colonPosition2 + 4, 1) = "P" AND hours2 <> 12 THEN hours2 = hours2 + 12
  10.     month1 = VAL(LTRIM$(MID$(earlierTime$, INSTR(earlierTime$, "/") - 2, 2))) 'the month of the earlier string
  11.     month2 = VAL(LTRIM$(MID$(moreRecentTime$, INSTR(moreRecentTime$, "/") - 2, 2))) 'month of the later string
  12.     rightCut1$ = MID$(earlierTime$, INSTR(earlierTime$, "/") + 1, LEN(earlierTime$)) 'cut the string to find the 2nd "/"
  13.     rightcut2$ = MID$(moreRecentTime$, INSTR(moreRecentTime$, "/") + 1, LEN(moreRecentTime$))
  14.     day1 = VAL(LEFT$(rightCut1$, INSTR(rightCut1$, "/") - 1)) 'get the day of the month
  15.     day2 = VAL(LEFT$(rightcut2$, INSTR(rightcut2$, "/") - 1))
  16.     year1 = VAL(MID$(rightCut1$, INSTR(rightCut1$, "/") + 1, 4)) 'and finally the year
  17.     year2 = VAL(MID$(rightcut2$, INSTR(rightcut2$, "/") + 1, 4))
  18.     IF hours1 = 24 THEN hours1 = 0 'puts midnight to hour 0
  19.     IF hours2 = 24 THEN hours2 = 0
  20.     minutesDifferent = 0 'initialize the number of minutes the two times differ
  21.     currentMinute = minutes1 'hours, minutes, days, months and years need to stay the same to exit the following loop
  22.     currentHour = hours1
  23.     currentDay = day1
  24.     currentMonth = month1
  25.     currentYear = year1
  26.     DO
  27.         minutesDifferent = minutesDifferent + 1 'increment the number of minutes different
  28.         currentMinute = currentMinute + 1 'move the counter for exiting the loop
  29.         IF currentMinute = 60 THEN '60 minutes is the next hour
  30.             currentMinute = 0
  31.             currentHour = currentHour + 1
  32.             IF currentHour = 24 THEN 'go to the next day
  33.                 currentHour = 0
  34.                 currentDay = currentDay + 1
  35.                 IF currentDay >= 28 THEN 'see if the months needs to be incremented and do so when it is needed
  36.                     SELECT CASE currentMonth
  37.                         CASE 4, 6, 9, 11 'April, June, September and November have 30 days
  38.                             IF currentDay = 31 THEN 'increment the month
  39.                                 currentMonth = currentMonth + 1
  40.                                 currentDay = 1
  41.                             END IF
  42.                         CASE 1, 3, 5, 7, 8, 10, 12 'January, March, May, July, August, October and December
  43.                             IF currentDay = 32 THEN 'increment the month
  44.                                 currentMonth = currentMonth + 1
  45.                                 currentDay = 1
  46.                             END IF
  47.                         CASE 2 'february
  48.                             IF currentDay = 29 AND currentYear MOD 4 <> 0 THEN 'if not a leap year, increment the month
  49.                                 currentMonth = 3
  50.                                 currentDay = 1
  51.                             ELSEIF currentDay = 30 AND currentYear MOD 4 = 0 THEN 'if is leap year, increment month
  52.                                 currentMonth = 3
  53.                                 currentDay = 1
  54.                             END IF
  55.                     END SELECT
  56.                     IF currentMonth = 13 THEN 'increment the year
  57.                         currentYear = currentYear + 1
  58.                         currentMonth = 1
  59.                     END IF
  60.                 END IF
  61.             END IF
  62.         END IF
  63.     LOOP UNTIL (currentHour = hours2 AND currentMinute = minutes2 AND currentMonth = month2 AND currentDay = day2 AND currentYear = year2)
  64.     GetDifference = minutesDifferent
  65.  

Pages: [1] 2