BASIC2\ENIGMA.BAS  ·  BAS  ·  7.9 KB  ·  1988-03-07  ·  from PCPlus_Issue-24_Sep-1988
   WINDOW #1 OPEN:WINDOW #1 FULL:CLS #1
'
'  dimension all arrays and strings
'  and initialise variables and screen
'
   DIM arr$(8,10) :  'used in valid move logic
   DIM l(10)      :  'block lengths
   DIM h(10)      :  ' "    heights
   DIM c(10)      :  ' "    colors
   DIM x(10)      :  'x-cords
   DIM y(10)      :  'y-co-ords
   DIM bk$(10)    :  'data for blocks
   DIM k$(16)     :  '
'
'  setup screen
'
   GOSUB setup
'
'  ***** MAIN ******
'
   play$="yes"
'
   WHILE play$="yes
'
     GOSUB initdata
     finish$="no"
     ans$="no"
     ians=0
'
        WHILE finish$="no"
          IF ans$="no" THEN GOSUB getmove ELSE GOSUB getans
          IF move$="q" THEN finish$="quit"
          IF move$="a" THEN ans$="yes":GOSUB initdata:GOSUB getans
          GOSUB checkmove
          IF move$="valid" THEN GOSUB checkend
        WEND
'
     MOVE 200;100
     IF ans$="yes" THEN finish$="no": PRINT MODE(1);"EASY,wasn't it..try again ?"
     IF finish$="yes"  THEN PRINT MODE(1);"WELL DONE.....another go  ?"
     IF finish$="quit" THEN PRINT MODE(1);"HARD LUCK.......try again   ?"
'
        ans$=""
        WHILE ans$=""
          ans$=INKEY$
          IF ans$<>"y" AND ans$<>"n" THEN ans$=""
        WEND
'
        IF ans$="n" THEN play$="no"
'
   WEND
'
   WINDOW #1 CLOSE : CLS : STOP
'
'  *** ENDMAIN ****
'
'
'
   LABEL getans
   ians=ians+1
   block=VAL(MID$(ac$,ians,1))
   IF block=0 THEN block=10
   move$=MID$(ad$,ians,1)
   RETURN
'
'
'
   LABEL checkmove
   lp=l(block):hp=h(block):xp=x(block):yp=y(block):cp=c(block)
   e$=bk$(block):dk$=k$(block):oldmv$=mv$:mv$=dk$+"-"+move$
   dx=0 : dy=0
   IF move$="u" AND yp>1     THEN dy=-1
   IF move$="d" AND yp+hp<11 THEN dy=1
   IF move$="l" AND xp>2     THEN dx=-2
   IF move$="r" AND xp+lp<9  THEN dx=2
   IF dx=0 AND dy=0 THEN move$="invalid" : RETURN
   GOSUB dummy  :'check valid move
   IF move$="invalid" THEN RETURN
   MOVE 100;167:PRINT MODE(1);mv$
   cp=7:GOSUB drawblock
   cp=c(block):xp=x(block):yp=y(block):m=1:GOSUB drawblock:cp=1:GOSUB drawoutline
   IF lastblock=block THEN RETURN
   movecount=movecount+1
   lastblock=block
   MOVE 100;153:PRINT MODE(1);movecount
   RETURN
'
'
'
   LABEL checkend
   IF x(1)<>5 OR y(1)<>7 THEN RETURN
   IF x(2)<>7 OR y(2)<>7 THEN RETURN
   IF x(7)<>1 OR y(7)<>1 THEN RETURN
   IF x(10)<>1 OR y(10)<>3 THEN RETURN
   finish$="yes"
   RETURN
'
'
'
   LABEL getmove
   ik=0
     WHILE ik<11
        GOSUB getkeys
        IF ik<11 THEN block=ik:MOVE 100;167:PRINT MODE(1); k$(ik)+"  "
     WEND
   move$=ky$
   RETURN
'
'
'
   LABEL getkeys
   ik=0
   WHILE ik=0
   ky$=""
       WHILE ky$=""
         ky$=INKEY$
       WEND
           FOR k=1 TO 16
           IF ky$=k$(k) THEN ik=k
           NEXT k
   WEND
   RETURN
'
'
'
   LABEL dummy
   xd=xp+dx : yd=yp+dy
   xd1=xd+lp-1 : yd1=yd+hp-1
   xa=xp : ya=yp : a$=" "
   GOSUB arrmove : ' delete block
   move$="valid" : i=0
   FOR id=yd TO yd1
   FOR jd=xd TO xd1
   i=i+1
   IF arr$(jd,id)<>" " AND MID$(e$,i,1)="X" THEN move$="invalid"
   NEXT jd
   NEXT id
   xa=xp : ya=yp : a$=k$(block)
   GOSUB arrmove : ' return block after check
   IF move$="invalid" THEN RETURN
   xa=xp : ya=yp : a$=" "
   GOSUB arrmove
   xa=xd : ya=yd : a$=dk$
   GOSUB arrmove
   x(block)=xd : y(block)=yd
   RETURN
'
'
'
   LABEL arrmove
   x1=xa : x2=x1+lp-1 : y1=ya : y2=y1+hp-1
   i=0
   FOR ym=y1 TO y2
     FOR xm=x1 TO x2
     i=i+1
     IF MID$(e$,i,1)="X" THEN arr$(xm,ym)=a$
                         ELSE arr$(xm,ym)=" "
     NEXT xm
   NEXT ym
   RETURN
'
'
'
   LABEL drawblock
   xo=160+(xp*30):yo=190-(yp*15)
   IF block=1 THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-30, xo+118;yo-30,xo+118;yo-59, xo;yo-59, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=2 OR block=4 OR block=8 OR block=10  THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=3 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-13, xo+58;yo-13, xo+58;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=5 THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-16, xo+118;yo-16, xo+118;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=6 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-29, xo+60;yo-29, xo+60;yo-14, xo;yo-14, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=7 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-59, xo+61;yo-59, xo+61;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp MODE 1 FILL
   IF block=9 THEN SHAPE xo;yo-16, xo+60;yo-16, xo+60;yo, xo+118;yo, xo+118;yo-29, xo;yo-29, xo;yo-16 WIDTH 4 COLOR cp MODE 1 FILL
   IF cp=7 THEN RETURN
   IF block=9 THEN MOVE (xo+5);(yo-25) ELSE MOVE (xo+5);(yo-10)
   PRINT k$(block)
   RETURN
'
'
'
   LABEL drawoutline
   xo=160+(xp*30):yo=190-(yp*15)
   IF block=1 THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-30, xo+118;yo-30,xo+118;yo-59, xo;yo-59, xo;yo WIDTH 4 COLOR 1
   IF block=2 OR block=4 OR block=8 OR block=10  THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp
   IF block=3 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-13, xo+58;yo-13, xo+58;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp
   IF block=5 THEN SHAPE xo;yo, xo+58;yo, xo+58;yo-16, xo+118;yo-16, xo+118;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp
   IF block=6 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-29, xo+60;yo-29, xo+60;yo-14, xo;yo-14, xo;yo WIDTH 4 COLOR cp
   IF block=7 THEN SHAPE xo;yo, xo+118;yo, xo+118;yo-59, xo+61;yo-59, xo+61;yo-29, xo;yo-29, xo;yo WIDTH 4 COLOR cp
   IF block=9 THEN SHAPE xo;yo-16, xo+60;yo-16, xo+60;yo, xo+118;yo, xo+118;yo-29, xo;yo-29, xo;yo-16 WIDTH 4 COLOR cp
   RETURN
'
'
   LABEL setup
   USER SPACE 200
   USER ORIGIN 0;0
   BOX 0;0,640,200 COLOR 4 FILL
   SET #1 MODE 2
   BOX 470;100,110,85 COLOR 7 FILL
   BOX 470;100,110,85 WIDTH 2 COLOR 1
   BOX 526;104,49,26 COLOR 3 FILL
   BOX 476;143,49,26 COLOR 5 FILL
   LINE 470;171,580;171
   MOVE 490;175 :PRINT "OBJECTIVE"
   MOVE 476;80  :PRINT "KEYS :"
   MOVE 476;70  :PRINT "0 - 9 .. select"
   MOVE 476;60  :PRINT "u ...... up"
   MOVE 476;50  :PRINT "d ...... down"
   MOVE 476;40  :PRINT "l ...... left"
   MOVE 476;30  :PRINT "r ...... right"
   MOVE 476;20  :PRINT "q ...... quit"
   BOX 30;140,110,45 COLOR 0 FILL
   BOX 30;140,110,45 WIDTH 4
   MOVE 52;167 : PRINT "MOVE"
   MOVE 52;153 : PRINT"TOTAL"
   BOX 30;15,110,100 FILL COLOR 13
   BOX 30;15,110,100 WIDTH 4:MOVE 60;100:PRINT "RATINGS":MOVE 60;90:PRINT"-------":MOVE 40;80:PRINT "<50...WORDS":MOVE 40;70:PRINT"      FAIL":MOVE 40;60:PRINT "51-60 GREAT":MOVE 40;50:PRINT"61-70 GOOD":MOVE 40;40:PRINT"71-80 FAIR"
   MOVE 40;30:PRINT">80   Hmmm"
   RETURN
'
'
'
   LABEL initdata
   RESTORE
   ac$="666611156444522335522666444770981722224445533665554442220009718881117024444422333665577700000888884444222299992211"
   ad$="uurrdddlldddrddlluurruulluuuurrddlddddrddddrruulluuuuuuuuuuruuurrdddllldddddrddddrrrruuululuuuulullluuddlluuuurrrr"
   FOR i=1 TO 10
   READ  l(i),h(i),x(i),y(i),c(i),bk$(i),k$(i)
       FOR j=1 TO 8
       arr$(j,i)=" "
       NEXT j
   NEXT i
   FOR i=11 TO 16
   READ k$(i)
   NEXT i
   DATA 4,4,1,1,3,"XXOOXXOOXXXXXXXX","1"
   DATA 2,2,3,1,3,"XXXX"            ,"2"
   DATA 4,2,5,1,6,"XXXXXXOO"        ,"3"
   DATA 2,2,7,2,6,"XXXX"            ,"4"
   DATA 4,2,5,3,6,"XXOOXXXX"        ,"5"
   DATA 4,2,1,7,6,"XXXXOOXX"        ,"6"
   DATA 4,4,5,7,5,"XXXXXXXXOOXXOOXX","7"
   DATA 2,2,1,8,6,"XXXX"            ,"8"
   DATA 4,2,1,9,6,"OOXXXXXX"        ,"9"
   DATA 2,2,5,9,5,"XXXX"            ,"0"
   DATA "u","d","r","l","q","a"
   lastblock=10:ik=0
   mv$="   ":movecount=0
   MOVE 100;167:PRINT MODE(1);mv$
   MOVE 100;153:PRINT MODE(1);movecount
   BOX 170;15,280,170 COLOR 7 FILL
   BOX 170;15,280,170 WIDTH 4 COLOR 1
   FOR block=1 TO 10
   lp=l(block):hp=h(block):xp=x(block)
   yp=y(block):cp=c(block):dx=0:dy=0
   e$=bk$(block)
   xa=xp : ya=yp : a$=k$(block)
   GOSUB arrmove :m=1: GOSUB drawblock : cp=1 : GOSUB drawoutline
   NEXT block
   block=6
   RETURN