MMFOUR.BAS (Connect Four)

This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.

MMFOUR.BAS

   10: REM This program was originally found on a demo
   20: REM tape for the MicroBee computer. It was ported
   30: REM to GWbasic and then Qbasic for use on a BBS
   40: REM in 1995.
   50: REM In 2011 yet another port, this time to
   60: REM MMBasic to run on the Maximite computer.
   70: REM Glenn Littleford. www.thebackshed.com
   80: CLS
   90: PRINT TAB(10); "F O U R - R O W": PRINT : PRINT TAB(15); "Ver 1.3"
  100: PRINT : PRINT
  110: PRINT "Try to beat the computer in a simple yet addictive"
  120: PRINT "game similar to CONNECT FOUR": PRINT
  130: PRINT "Using the < and > keys position the arrow above"
  140: PRINT "the column you want, then use the space key to"
  150: PRINT "drop your marker. Press Q to quit."
  160: PRINT : PRINT "Hit any key to continue"
  170: RANDOMIZE TIMER
  180: DIM t(11), s(44), n(7)
  190: IF INKEY$ = "" THEN GOTO 190
  200: CLS
  210: e = 0: f = 0: g = 0
  220: FOR a = 1 TO 44: s(a) = 0: NEXT a
  230: IF s2 = 4 AND s1 = 0 THEN LOCATE 0, 165: PRINT "You really havn't got the hang of this, have you?"
  240: IF s1 - s2 = 3 THEN LOCATE 0,165: PRINT "You think your good, dont ya!"
  250: IF s2 - s1 = 5 THEN LOCATE 0,165: PRINT "Your loosing, ha ha."
  260: FOR x = 1 TO 141 STEP 20
  270:   LINE (x, 20)-(x, 140)
  280:   FOR y = 20 TO 120 STEP 20
  290:     LINE (x - 1, y)-(x + 1, y)
  300:   NEXT
  310: NEXT
  320: LINE (1, 140)-(141, 140)
  330: LOCATE 150,25 : PRINT "Four in a Row"
  340: LOCATE 150,45 : PRINT "Scores...."
  350: LOCATE 150,60 : PRINT "  You:"; s1
  360: LOCATE 150,70 : PRINT "   Me:"; s2
  370: LOCATE 150,80 : PRINT "Drawn:"; s3
  380: LOCATE 150,100 : PRINT "Keys...."
  390: LOCATE 150,115 : PRINT "< > to move"
  400: LOCATE 150,125 : PRINT "[SPACE] to drop"
  410: LOCATE 150,135 : PRINT "Q to quit"
  420: CIRCLE (153,62),3
  430: LINE (150,70)-(156,76),1,"BF"
  440: w = 36
  450: FOR c = 1 TO 7
  460:   n(c) = w
  470:   w = w + 1
  480: NEXT c
  490: c = 4
  500: s4 = s1 + s2 + s3
  510: IF s4 / 2 <> INT(s4 / 2) THEN GOTO 1170
  520: m1$ = "  My Move" : GOSUB 2000
  530: IF g <> 0 THEN g = 0 : GOTO 190
  540: v = 0: x = 0: y = 0: z = 0
  550: j=j+1
  560: IF j>7 THEN
  570:   j=0
  580:   GOTO 670
  590: ELSE
  600:   c=c+1
  610:   IF c>7 THEN c=1
  620: ENDIF
  630: p = c
  640: IF n(c) > 0 THEN GOSUB 1520
  650: IF f <> 0 THEN j = 0 : GOTO 1030
  660: GOTO 550
  670: IF x <> 0 THEN c = x : GOTO 1030
  680: IF y <> 0 THEN  c = y: GOTO 740
  690: IF z <> 0 THEN  c = z: GOTO 740
  700: c=INT(RND()*7)+1
  710: IF n(c)<1 THEN 700
  720: v = v + 1
  730: IF c <> 4 AND v < 5 THEN GOTO 700
  740: IF n(c) < 8 THEN f = 0: GOTO 1030
  750: IF v < 10 THEN GOTO 870
  760: IF v / 3 = INT(v / 3) THEN  m = 1
  770: m1$ = "Now what do I do ???": GOSUB 2130
  780: IF v < 21 THEN GOTO 870
  790: FOR t1=1 TO 200
  800:   LOCATE RND()*300, RND()*300
  810:   PRINT "?"
  820:   SOUND RND()*1000+20,20 : PAUSE 20
  830: NEXT t1
  840: PAUSE 1000
  850: e = 1
  860: GOTO 1420
  870: n(c) = n(c) - 7
  880: z = 0
  890: GOSUB 1520
  900: n(c) = n(c) + 7
  910: IF f <> 0 THEN
  920:   f = 0
  930:   IF v < 9 THEN GOTO 700
  940: ENDIF
  950: IF z <> 0 THEN
  960:   z = 0
  970:   IF v < 6 THEN GOTO 700
  980: ENDIF
  990: IF x <> 0 THEN
 1000:   x = 0
 1010:   GOTO 700
 1020: ENDIF
 1030: ne=((n(c)-c)/7)*20+30
 1040: m=c*20-9
 1050: LINE (m - 5, ne - 5)-(m + 5, ne + 5), 1, BF
 1060: s(n(c)) = 5
 1070: n(c) = n(c) - 7
 1080: IF f<>0 THEN
 1090:   m1$="I Win! haha!    Press any key."
 1100:   GOSUB 2130
 1110:   FOR noise1 = 1 TO 3 : FOR noise2=1000 TO 4000 STEP 500
 1120:     SOUND noise2,100 : PAUSE 100
 1130:   NEXT noise2 : NEXT noise1
 1140:   s2=s2+1
 1150:   GOTO 190
 1160: ENDIF
 1170: m1$ = "Your Move": GOSUB 2000
 1180: IF g <> 0 THEN
 1190:   g = 0
 1200:   GOTO 190
 1210: ENDIF
 1220: p = c
 1230: LINE (0, 0)-(200, 19), 0, BF
 1240: CIRCLE (p*20-9,10),6
 1250: K1$ = INKEY$
 1260: IF K1$ = "," OR K1$ = "." OR K1$ = "q" THEN GOTO 1290
 1270: IF K1$ = " " THEN GOTO 1340
 1280: GOTO 1250
 1290: IF K1$ = "." AND c < 7 THEN c = c + 1
 1300: IF K1$ = "," AND c > 1 THEN c = c - 1
 1310: IF K1$ = "q" OR K1$ = "Q" THEN GOTO 2200
 1320: REM
 1330: GOTO 1220
 1340: w1 = 0
 1350: ne=((n(c)-c)/7)*20+30
 1360: m=p*20-9
 1370: IF (n(c)-c)/7 < 0 THEN GOTO 1220
 1380: CIRCLE (m, ne), 6
 1390: s(n(c)) = 1
 1400: e = 0
 1410: GOSUB 1520
 1420: IF e<>0 THEN
 1430:   m1$="you win.        Press any key."
 1440:   GOSUB 2000
 1450:   SOUND 50,500 : PAUSE 500 : SOUND 30,700
 1460:   s1=s1+1
 1470:   PAUSE 2000
 1480:   GOTO 190
 1490: ENDIF
 1500: n(c) = n(c) - 7
 1510: GOTO 520
 1520: p=c*20-9
 1530: PAUSE 200
 1540: LINE (0, 0)-(300, 19), 0, BF
 1550: LINE (p - 5, 5)-(p + 5, 15), 1, BF
 1560: FOR a = 0 TO 11
 1570:   t(a) = 0
 1580: NEXT a
 1590: i = 0
 1600: o = n(c)
 1610: FOR u = o TO o + 21 STEP 7
 1620:   IF u > 42 THEN GOTO 1640
 1630:   t(i) = t(i) + s(u)
 1640: NEXT u
 1650: i = i + 1
 1660: k = c - 3
 1670: IF k < 1 THEN  k = 1
 1680: FOR a = k TO c + 3
 1690:   IF a > 4 OR a > c THEN GOTO 1810
 1700:   FOR B = a TO a + 3
 1710:     t(i) = t(i) + s(o - c + B)
 1720:   NEXT B
 1730:   i = i + 1
 1740:   w = o - (c - a) * 8
 1750:   IF w < 1 OR w > 18 THEN GOTO 1810
 1760:   FOR d = 0 TO 3
 1770:     t(i) = t(i) + s(w)
 1780:     w = w + 8
 1790:   NEXT d
 1800:   i = i + 1
 1810:   IF a > 7 THEN GOTO 1900
 1820:   IF a < 4 OR a < c THEN GOTO 1900
 1830:   w = o + (c - a) * 6
 1840:   IF w < 4 OR w > 21 THEN GOTO 1900
 1850:   FOR d = 0 TO 3
 1860:     t(i) = t(i) + s(w)
 1870:     w = w + 6
 1880:   NEXT d
 1890:   i = i + 1
 1900: NEXT a
 1910: FOR h = 0 TO i
 1920:   d = t(h)
 1930:   IF d = 4 THEN e = 1
 1940:   IF d = 15 THEN f = c
 1950:   IF d = 10 THEN z = c
 1960:   IF d = 3 THEN x = c
 1970:   IF h <> 0 AND d = 2 THEN y = c
 1980: NEXT h
 1990: RETURN
 2000: a = 0
 2010: a = a + 1
 2020: IF a > 7 THEN
 2030:   GOTO 2110
 2040: ELSE
 2050:   IF s(a) = 0 THEN
 2060:     a = 0
 2070:     GOTO 2130
 2080:   ENDIF
 2090: ENDIF
 2100: GOTO 2010
 2110: m1$ = "Its a draw"
 2120: g = 1
 2130: LOCATE 10,150
 2140: PRINT m1$; "               ";
 2150: IF m = 0 THEN GOTO 2180
 2160: m = 0
 2170: GOTO 2130
 2180: IF g <> 0 THEN s3 = s3 + 1
 2190: RETURN
 2200: CLS
 2210: PRINT : PRINT
 2220: PRINT TAB(20); "Thanks for playing."
 2230: PRINT
 2240: PRINT TAB(20); "www.thebackshed.com"
 2250: END
>