[net.micro.amiga] ABasiC source for simple Robots game

cg@myrias.UUCP (Chris Gray) (01/09/86)

*** rEplAcE thIs lInE wIth yOUr mEssAge ***

Two programs are included here. The first is "robots.bas", which actually
plays the game. The second is "makepic.bas" which is a very simple graphics
editor which you must use to create four pictures:

     man - the image you want to use for the player
     robot - the image you want to use for the robots
     bomb - the image you want to use for the bombs
     none - all colour 0 ('a') - used to "undraw" moving things
          (kludgy, but attempts at using 'drawmode' and modifying an
           existing saved image didn't work. Of course, now that I think
           about it, the logical thing to do would have been to do a 'GET'
           to create 'n%' from a blank screen region. Sigh.)

"robots" reads these four images in when it starts up.

Robots asks you how many robots you want to start with. Pick any number
between 1 and 100. The challenge is to start at 1 and work up to 100 (you
get more if you clear a screenful.) Before any move in a given screenful,
you can type a '0' to relocate yourself. When playing, use the numeric
keypad to move yourself.

Makepic lets you use the mouse to draw an 8 x 8 image for use with Robots.
Typing keys 'a' - 'p' selects the current drawing colour. 'q' exits the
program, 's' saves the image to a named file, and 'r' restores an image
from a named file.

I apologize for the hacky nature of the programs. ABasiC seems to be one of
those BASIC's that is slowed down by many lines, long identifiers and spaces;
so I kept those to a minimum in order to make the programs as responsive
as possible. (This helps a lot on the Mandelbrot program, too.)

This file was created by copying the files from my Amiga through various
computers until it got to this one, so there shouldn't be any typos. If
you type it in yourself, make darn sure you get all the '%'s in.

I haven't tried it, but the programs were set up so that if you change the
initial values of 'width%' and 'height%' in makepic and 'w%' and 'h%'
correspondingly in robots, the size of the images changes to what you pick.
(Larger size means less 'space' on the screen of course.)

----------------------------------------------------------------------------
Here follows "robots.bas":
----------------------------------------------------------------------------
10    screen 0,4: drawmode 1%: randomize -1%: pena 1%: penb 0%
20    ask window nc%,nl%
30    h%=8% : w%=8%: maxrobots%=100%
40    size%=(w%+15%)/16%*4%*h%+4%
50    dim r%(size%),b%(size%),m%(size%),n%(size%)
60    bload "robot",varptr(r%(0%))
70    bload "man",varptr(m%(0%))
80    bload "bomb",varptr(b%(0%))
90    bload "none",varptr(n%(0%))
100   cc%=int(nc%/w%) : lc%=int((nl%-8%)/h%)
110   dim sc%(cc%,lc%)
120   input "Number of robots: ",nr%
130   if nr%<1% or nr%>maxrobots% then print "Bad value. Try again." : goto 120
140   ' Loop here after clearing a screenful.
150   erase rl%,rc%,dl%,dc%
160   dim rl%(nr%),rc%(nr%),dl%(nr%),dc%(nr%)
170   for c%=0% to cc%-1%
180   for l%=0% to lc%-1%
190   sc%(c%,l%)=0%
200   next l%
210   next c%
220   scnclr
230   for i%=0% to nr%*4%-1%
240   l%=int(rnd*lc%) : c%=int(rnd*cc%)
250   if sc%(c%,l%)<>0% then 240
260   sc%(c%,l%)=2%
270   gshape (c%*w%,l%*h%),b%()
280   next i%
290   for i%=0% to nr%-1%
300   l%=int(rnd*lc%) : c%=int(rnd*cc%)
310   if sc%(c%,l%)<>0% then 300
320   sc%(c%,l%)=3%
330   gshape (c%*w%,l%*h%),r%()
340   rl%(i%)=l% : rc%(i%)=c%
350   next i%
360   l%=int(rnd*lc%) : c%=int(rnd*cc%)
370   if sc%(c%,l%)<>0% then 360
380   sc%(c%,l%)=1%
390   mc%=c% : ml%=l%
400   n%=nr%
410   gshape(mc%*w%,ml%*h%),m%()
420   mv%=0%
430   graphic(1%)
440   print at(0%,nl%-2%);
450   if n%=1% then print " One robot left" : goto 470
460   print using "###"; n%; : print " robots left"
470   graphic(0%)
480   get k$ : if k$="" then 480
490   if mv%=1% then 520
500   if k$="0" then sc%(mc%,ml%)=0%: gshape (mc%*w%,ml%*h%),n%(): goto 360
510   mv%=1%
520   if k$<"1" or k$>"9" then gosub 1350: goto 480
530   on asc(k$)-asc("0") goto 650,670,690,600,620,630,540,560,580
540   if ml%=0% or mc%=0% then gosub 1350: goto 480
550   nml%=ml%-1%:nmc%=mc%-1%:goto 710
560   if ml%=0% then gosub 1350: goto 480
570   nml%=ml%-1%:nmc%=mc%: goto 710
580   if ml%=0% or mc%=cc%-1% then gosub 1350: goto 480
590   nml%=ml%-1%:nmc%=mc%+1%: goto 710
600   if mc%=0% then gosub 1350: goto 480
610   nml%=ml%:nmc%=mc%-1%: goto 710
620   nml%=ml%:nmc%=mc%: goto 710
630   if mc%=cc%-1% then gosub 1350: goto 480
640   nml%=ml%:nmc%=mc%+1: goto 710
650   if ml%=lc%-1% or mc%=0% then gosub 1350: goto 480
660   nml%=ml%+1%:nmc%=mc%-1%: goto 710
670   if ml%=lc%-1 then gosub 1350: goto 480
680   nml%=ml%+1%:nmc%=mc%: goto 710
690   if ml%=lc%-1 or mc%=cc%-1 then gosub 1350: goto 480
700   nml%=ml%+1%:nmc%=mc%+1%
710   gshape (mc%*w%,ml%*h%),n%()
720   sc%(mc%,ml%)=0%
730   mc%=nmc%:ml%=nml%
740   gshape (mc%*w%,ml%*h%),m%()
750   if sc%(mc%,ml%)=0% then sc%(mc%,ml%)=1%: goto 800
760   graphic(1%): pena 1%: penb 0%
770   print at(0%,nl%-2%);
780   if sc%(mc%,ml%)=2% then print "You walked into a mine!!": goto 1150
790   print "You walked into a robot!!": goto 1150
800   ' Move the robots (a bit complicated)
810   d%=0%:k%=0%
820   for i%=0% to nr%-1%
830   c%=rc%(i%):if c%<0% then 1000
840   l%=rl%(i%):x%=sc%(c%,l%)
850   gshape (c%*w%,l%*h%),n%()
860   if x%=5% or x%=7% then sc%(c%,l%)=x%-1% else sc%(c%,l%)=0%
870   dl%=l%-ml%:dc%=c%-mc%
880   if abs(dl%)<=2*abs(dc%) then 900
890   l%=l%-dl%/abs(dl%):goto 930
900   if abs(dc%)<=2*abs(dl%) then 920
910   c%=c%-dc%/abs(dc%):goto 930
920   l%=l%-dl%/abs(dl%):c%=c%-dc%/abs(dc%)
930   x%=sc%(c%,l%):rc%(i%)=c%:rl%(i%)=l%
940   on x%+1% goto 950,960,970,980,970,990,1000,1000
950   sc%(c%,l%)=4%:goto 1000
960   d%=1%:goto 1000
970   dl%(k%)=l%:dc%(k%)=c%:k%=k%+1:sc%(c%,l%)=6%:goto 1000
980   sc%(c%,l%)=5%:goto 1000
990   dl%(k%)=l%:dc%(k%)=c%:k%=k%+1%:sc%(c%,l%)=7%
1000  next i%
1010  if d%<>1% then 1030
1020  graphic(1%):print at(0%,nl%-2%);:print "A robot got you!!";: goto 1150
1030  for i%=0% to nr%-1%
1040  c%=rc%(i%):if c%<0% then 1070
1050  l%=rl%(i%)
1060  if sc%(c%,l%)=6% then rc%(i%)=-1%:n%=n%-1% else gshape (c%*w%,l%*h%),r%(): sc%(c%,l%)=3%
1070  next i%
1080  for i%=0% to k%-1%
1090  sc%(dc%(i%),dl%(i%))=0%
1100  gshape (dc%(i%)*w%,dl%(i%)*h%),n%()
1110  next i%
1120  if n%<>0% then 430
1130  graphic(1%):print at(0%,nl%-2%);
1140  print "You got all the robots!!"
1150  gosub 1350
1160  print at(nc%-8%*11%,nl%-2%);: print "PRESS A KEY"
1170  get k$: if k$="" then 1170
1180  print at(0%,nl%-2%);
1190  for i%=0% to cc% : print " "; : next i%
1200  if n%=0% then 1290
1210  print at(0%,nl%-2%);
1220  print "Another game? "
1230  get k$ : if k$ = "" then 1230
1240  if k$<>"y" and k$<>"n" then 1180
1250  if k$="n" then 1330
1260  nr%=nr%-2%
1270  if nr%<=0% then nr%=1%
1280  goto 1310
1290  nr%=int((nr%+1%)*11%/10%)
1300  if nr%>maxrobots% then nr%=maxrobots%
1310  graphic(0%)
1320  goto 150
1330  screen 1,2
1340  end
1350  drawmode 2%: pena 15%: penb 15%
1360  box (-1%,-1%;nc%,nl%),1%
1370  box (-1%,-1%;nc%,nl%),1%
1380  drawmode 1%
1390  pena 1%: penb 0%
1400  return
----------------------------------------------------------------------------
Here follows "makepic.bas":
----------------------------------------------------------------------------
10    screen 0,4 :graphic 0%: scnclr
20    pena 0%: peno 0%: box (0%,0%;7%,7%),1%
30    height% = 8% : width% = 8% : scale% = 10%
40    size% = (width%+15%)/16%*height%*4%+4%
50    dim save%(size%)
60    ask window nc%, nl%
70    x1% = (nc% - width% * scale%) / 2%
80    x2% = x1% + width% * scale%
90    y1% = (nl% - height% * scale%) / 2%
100   y2% = y1% + height% * scale%
110   c% = 1% : pena 1% : penb 1% : peno 1%
120   box (x1%-1%,y1%-1%;x2%,y2%),0%
130   box (40%,40%;60%,60%),1%
140   get k$
150   if k$ <> "" then goto 240
160   ask mouse x%,y%,b%
170   if b% = 0% then goto 140
180   if x% < x1% or x% >= x2% then goto 140
190   if y% < y1% or y% >= y2% then goto 140
200   x%=int((x%-x1%)/scale%)*scale%+x1% : y%=int((y%-y1%)/scale%)*scale%+y1%
210   box(x%,y%;x%+scale%-1%,y%+scale%-1%),1%
220   draw((x%-x1%)/scale%,(y%-y1%)/scale%),c%
230   goto 140
240   if k$<"a" or k$>"p" then goto 290
250   c%=asc(k$)-asc("a")
260   pena c% : penb c% : peno c%
270   box (40%,40%;60%,60%),1%
280   goto 140
290   if k$<> "s" then goto 380
300   sshape (0%,0%;width%,height%),save%()
310   print at(3%,3%);
320   input "File: ", file$
330   if file$ = "" then goto 350
340   bsave file$, varptr(save%(0%)),size%*4%
350   print at (3%,3%);
360   pena 0%: peno 0%: box (0%,16%;nc%-1%,23%),1%: pena c%: peno c%
370   goto 140
380   if k$<>"q" then goto 410
390   screen 1,2
400   end
410   if k$<>"r" then goto 570
420   print at(3%,3%);
430   input "File: ", file$
440   if file$ = "" then goto 540
450   bload file$,varptr(save%(0%))
460   gshape (0%,0%),save%()
470   for x%=0% to width%-1%
480   for y%=0% to height%-1%
490   c%=pixel(x%,y%)
500   peno c% : pena c% : penb c%
510   box (x1%+x%*scale%,y1%+y%*scale%;x1%+(x%+1%)*scale%-1%,y1%+(y%+1%)*scale%-1%),1%
520   next y%
530   next x%
540   box (40%,40%;60%,60%),1%: print at(3%,3%);
550   pena 0%: peno 0%: box (0%,16%;nc%-1%,23%),1%: pena c%: peno c%
560   goto 140
570   drawmode 2%
580   pena 15%
590   box (-1%,-1%;nc%,nl%),1%
600   box (-1%,-1%;nc%,nl%),1%
610   pena c%
620   drawmode 0%
630   goto 140