home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / go / prog / go.bas < prev    next >
Encoding:
BASIC Source File  |  1993-06-20  |  13.2 KB  |  433 lines

  1.  
  2.  
  3.  
  4. --------------------------------------------------
  5. From root@ccb.ucsf.EDU Fri Feb 16 17:19:07 1990
  6. Path: ucsfcgl!ucbvax!dual!bill
  7. From: bill@dual.UUCP (Bill Kanawyer)
  8. Subject: A Go program for the Mac.
  9.  
  10. > The software won't let me post it to net.games.go, so I'm sending
  11. > it as mail.  I'm a very new user of this system.  Hope you will
  12. > know what to do with it.  Enjoy.
  13. >         --George Acton
  14.  
  15.     I am posting this for George Acton with his ok. Any questions should be
  16. sent to Mr. Acton. I do not know if this works nor do I make any claims as
  17. to its function or ownership.
  18.  
  19.     You can contact Mr. Acton at proper!gsa.
  20.  
  21.     Have fun,
  22.  
  23. Bill Kanawyer
  24. {ucbvax,amd70,ihnp4,cbosgd,decwrl,fortune,zehntel,hplabs,sun}!dual!bill
  25. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
  26.  
  27. 1000 '     GO.BAS -- a program for go on the Macintosh
  28. 1010 '
  29. 1020 '         by George Acton, Compuserve 73026,2663
  30. 1030 '
  31. 1040 ' Copyright (c) 1984 -- George Acton, Shreveport, La.
  32. 1050 ' Permission is hereby granted for personal, non-commercial
  33. 1060 ' reproduction and use of this program, provided that this notice
  34. 1070 ' is included in any copy.
  35. 1080 '
  36. 10000 '
  37. 10010 '     setup
  38. 10020 ' 
  39. 10030 CLEAR,20000
  40. 10040 DEFINT A-Z
  41. 10050 SENTE=1
  42. 10060 CALL TEXTSIZE(14): CALL TEXTFONT(2)
  43. 10070 DIM BOARD(19,19), CBOARD(19,19)
  44. 10080 DIM FIRST(500), REST(500)
  45. 10090 DIM SENTEREC(500), MOVREC(500), CAPREC(500)
  46. 10100 DIM BS(50), WS(50)
  47. 11000 ' 
  48. 11010 '     main loop
  49. 11020 '
  50. 11030 GOSUB 54000
  51. 11040 FREE=1
  52. 11050 GOSUB 11060: GOTO 11050
  53. 11060 '
  54. 11070 '     input
  55. 11080 '
  56. 11090 GOSUB 50000
  57. 11100 IF PFLAG=1 THEN LINE (300,0)-(512,400),30,BF
  58. 11110 ON INFLAG GOSUB 20000,30000: RETURN
  59. 20000 '
  60. 20010 '     command
  61. 20020 '
  62. 20030 IF K$="h" THEN GOSUB 21000: RETURN
  63. 20040 IF K$="?" THEN GOSUB 21000: RETURN
  64. 20050 IF K$="i" THEN GOSUB 29000: RETURN
  65. 20060 IF K$="b" THEN GOSUB 22000: RETURN
  66. 20070 IF K$="w" THEN GOSUB 22080: RETURN
  67. 20080 IF K$="d" THEN GOSUB 23000: RETURN
  68. 20090 IF K$="s" THEN GOSUB 24000: RETURN
  69. 20100 IF K$="r" THEN GOSUB 24150: RETURN
  70. 20110 IF K$="c" THEN GOSUB 28000: RETURN
  71. 20120 IF K$="-" THEN GOSUB 26000: RETURN
  72. 20130 IF K$="+" THEN GOSUB 27000: RETURN
  73. 20140 IF K$="q" THEN SYSTEM
  74. 20150 MESS$="h for help": RETURN
  75. 21000 '
  76. 21010 '     help screen
  77. 21020 '
  78. 21030 CALL MOVETO(300,45): PRINT "b     place black stones";
  79. 21040 CALL MOVETO(300,65): PRINT "w     place white stones";
  80. 21050 CALL MOVETO(300,85): PRINT"d     remove stones";
  81. 21060 CALL MOVETO(300,105): PRINT "-     retract move";
  82. 21070 CALL MOVETO(300,125): PRINT"+     advance move";
  83. 21080 CALL MOVETO(300,145): PRINT "c     count board";
  84. 21090 CALL MOVETO(300,165): PRINT "s     save position";
  85. 21100 CALL MOVETO(300,185): PRINT "r     recall position";
  86. 21110 CALL MOVETO(300,205): PRINT"i     initialize";
  87. 21120 RETURN
  88. 22000 '
  89. 22010 '     place black stones
  90. 22020 '
  91. 22030 MESS$="place black stones": GOSUB 50500: COLOR=1
  92. 22040 GOSUB 50000: IF INFLAG=1 THEN GOTO 23100
  93. 22050 GOSUB 51000: IF P=0 THEN GOTO 23100
  94. 22060 MOV=P: GOSUB 60000: BOARD(X,Y)=COLOR: GOSUB 56000: GOSUB 30170
  95. 22070 GOTO 22040
  96. 22080 '
  97. 22090 MESS$="place white stones": GOSUB 50500: COLOR=-1
  98. 22100 GOTO 22040
  99. 23000 '
  100. 23010 '     remove stones
  101. 23020 '
  102. 23030 MESS$="removing dead stones": GOSUB 50500
  103. 23040 GOSUB 50000: IF INFLAG=1 THEN GOTO 23100
  104. 23050 GOSUB 51000: IF P=0 THEN GOTO 23100
  105. 23060  COLOR=BOARD(X,Y): BOARD(X,Y)=0: GOSUB 55000
  106. 23070 MOV=0: FIRST(FREE)=P: REST(FREE)=0: CAPLIST=FREE: FREE=FREE+1
  107. 23080 COLOR=-COLOR: GOSUB 30170
  108. 23090 GOTO 23040
  109. 23100  LINE (300,0)-(512,400),30,BF: RETURN
  110. 24000 '
  111. 24010 '     save position
  112. 24020 '
  113. 24030 MESS$="file name?": GOSUB 50500
  114. 24040 CALL MOVETO(300,65): INPUT F$: IF F$="" THEN 24040
  115. 24050 OPEN F$ FOR OUTPUT AS #1
  116. 24060 FOR I=1 TO MOVNUM
  117. 24070     PRINT #1, STR$(SENTEREC(I))
  118. 24080     PRINT #1,  STR$(MOVREC(I))
  119. 24090     TEMP=CAPREC(I)
  120. 24100     WHILE TEMP<>0
  121. 24110        PRINT #1, STR$(FIRST(TEMP)): TEMP=REST(TEMP)
  122. 24120     WEND
  123. 24130     PRINT #1, STR$(0)
  124. 24140 NEXT I: CLOSE #1: RETURN
  125. 24150 '
  126. 24160 '     retrieve file
  127. 24170 '
  128. 24180 MESS$="file name?": GOSUB 50500
  129. 24190 CALL MOVETO(300,65): INPUT F$: IF F$="" THEN 24190
  130. 24200 GOSUB 29000 ! INITIALIZE BOARD
  131. 24210 OPEN F$ FOR INPUT AS #1
  132. 24220 WHILE NOT EOF(1): MOVNUM=MOVNUM+1
  133. 24230     INPUT #1, A$: SENTEREC(MOVNUM)=VAL(A$)
  134. 24240     INPUT #1,A$: :MOVREC(MOVNUM)=VAL(A$)
  135. 24250     INPUT #1,A$: V=VAL(A$): IF V=0 THEN 24290
  136. 24260         FIRST(FREE)=V: REST(FREE)=CAPREC(MOVNUM)
  137. 24270         CAPREC(MOVNUM)=FREE: FREE=FREE+1
  138. 24280         GOTO 24250
  139. 24290 WEND
  140. 24300 CLOSE #1: GOSUB 25040: RETURN         
  141. 25000 ' 
  142. 25010 '     restore board
  143. 25020 '
  144. 25030 GOSUB 54000
  145. 25040 FOR K=1 TO 19: FOR L=1 TO 19: BOARD(K,L)=0: NEXT L: NEXT K
  146. 25050 BDEAD=0: WDEAD=0
  147. 25060 FOR M=1 TO MOVNUM
  148. 25070     COLOR=SENTEREC(M)
  149. 25080     P=MOVREC(M)
  150. 25090     CAPLIST=CAPREC(M)
  151. 25100     GOSUB 52000
  152. 25110 NEXT M
  153. 25120 RETURN
  154. 26000 '
  155. 26010 '     retract move
  156. 26020 '
  157. 26030 IF MOVNUM=0 THEN RETURN
  158. 26040 CAPLIST=CAPREC(MOVNUM): P=MOVREC(MOVNUM)
  159. 26050 COLOR=-SENTEREC(MOVNUM):  GOSUB 53000
  160. 26060 MOVNUM=MOVNUM-1 :RETURN
  161. 27000 '
  162. 27010 '     advance move
  163. 27020 '
  164. 27030 IF SENTEREC(MOVNUM+1)=0 THEN RETURN
  165. 27040 MOVNUM=MOVNUM+1
  166. 27050 CAPLIST=CAPREC(MOVNUM): P=MOVREC(MOVNUM)
  167. 27060 COLOR=SENTEREC(MOVNUM):  GOSUB 52000
  168. 27070 RETURN
  169. 28000 '
  170. 28010 '     count board
  171. 28020 '
  172. 28030 FOR K=1 TO 19: FOR L=1 TO 19: CBOARD(K,L)=0: NEXT L: NEXT K
  173. 28040 MESS$="counting": GOSUB 50500
  174. 28050 BCOUNT=0: WCOUNT=0: OFREE=FREE
  175. 28060 FOR L=1 TO 19: FOR K=1 TO 19
  176. 28070     IF  CBOARD(K,L)<>0 THEN GOTO 28100
  177. 28080     IF BOARD(K,L)<>0 THEN GOTO 28100
  178. 28090 GOSUB 28500
  179. 28100 NEXT K: NEXT L
  180. 28110  LINE (300,0)-(512,400),30,BF
  181. 28120 CALL MOVETO (300,65): PRINT "                      B          W";
  182. 28130 CALL MOVETO (300,85): PRINT "prisoners";
  183. 28140 CALL MOVETO (365,85): PRINT USING "#####";WDEAD,BDEAD
  184. 28150 CALL MOVETO(300,105): PRINT "land"
  185. 28160 CALL MOVETO(365,105): PRINT  USING "#####";BCOUNT, WCOUNT
  186. 28170 CALL MOVETO(300,125): PRINT "score";
  187. 28180 CALL MOVETO(365,125): PRINT USING "#####";WDEAD+BCOUNT, BDEAD+WCOUNT
  188. 28220  FREE=OFREE: PFLAG=1: RETURN
  189. 28500 '
  190. 28510 '     mark and count one group of empty points based on k,l
  191. 28520 '
  192. 28530 BFLAG=0: WFLAG=0
  193. 28540 COUNT=1: CBOARD(K,L)=1
  194. 28550 FIRST(FREE)=K+19*(L-1): REST(FREE)=0
  195. 28560 QLIST=FREE: FREE=FREE+1
  196. 28570 WHILE QLIST<>0
  197. 28580     P=FIRST(QLIST): QLIST=REST(QLIST)
  198. 28590     GOSUB 60000
  199. 28610     FOR N=4 TO 1 STEP -1: GOSUB 61000
  200. 28620         IF NB=0 THEN GOTO 28700
  201. 28630         IF CBOARD(NBX,NBY)<>0 THEN GOTO 28700
  202. 28640         IF BOARD(NBX,NBY)=1 THEN BFLAG=1: GOTO 28700
  203. 28650         IF BOARD(NBX,NBY)=-1 THEN WFLAG=1: GOTO 28700
  204. 28660         COUNT=COUNT+1: CBOARD(NBX,NBY)=1
  205. 28680         FIRST(FREE)=NB: REST(FREE)=QLIST
  206. 28690         QLIST=FREE: FREE=FREE+1
  207. 28700     NEXT N
  208. 28710 WEND
  209. 28720 '
  210. 28730 IF (BFLAG=1 AND WFLAG=1) THEN 28750
  211. 28740 IF BFLAG=1 THEN BCOUNT=BCOUNT+COUNT ELSE WCOUNT=WCOUNT+COUNT
  212. 28750 RETURN
  213. 29000 '
  214. 29010 '     initialize
  215. 29020 '
  216. 29030 FREE=1: MOVNUM=0
  217. 29040 GOSUB 54000
  218. 29050 FOR K=1 TO 19: FOR L=1 TO 19: BOARD(K,L)=0: NEXT L: NEXT K
  219. 29060 FOR K=1 TO 500: FIRST(K)=0: REST(K)=0: NEXT K
  220. 29070 FOR K=1 TO 500: SENTEREC(K)=0: MOVREC(K)=0: CAPREC(K)=O: NEXT K
  221. 29080 RETURN
  222. 30000 '
  223. 30010 '     main loop for move
  224. 30020 '
  225. 30030 IF MOVNUM=0 THEN SENTE=1 ELSE SENTE=-SENTEREC(MOVNUM)
  226. 30040 GOSUB 51000: IF P=0 THEN RETURN ELSE MOV=P
  227. 30050 IF BOARD(X,Y)=0 THEN 30070
  228. 30060     MESS$="point occupied": GOSUB 50500: RETURN
  229. 30070 GOSUB 31000
  230. 30080 IF CAPLIST>0 THEN 30120
  231. 30090 IF MLIB>0 THEN 30120
  232. 30100 GOSUB 32000: IF SUICIDE=0 THEN 30120
  233. 30110     MESS$="suicide": GOSUB 50500: RETURN
  234. 30120 GOSUB 33000: IF KO=0 THEN 30150
  235. 30130     MESS$="ko": GOSUB 50500: RETURN
  236. 30140 '
  237. 30150 COLOR=SENTE: GOSUB 52000     ' change screen and board
  238. 30160 '
  239. 30170 MOVNUM=MOVNUM+1:  SENTEREC(MOVNUM)=COLOR
  240. 30180     MOVREC(MOVNUM)=MOV: CAPREC(MOVNUM)=CAPLIST
  241. 30190     SENTEREC(MOVNUM+1)=0
  242. 30200 '
  243. 30210 RETURN
  244. 31000 '
  245. 31010 '     evaluate move for capture
  246. 31020 '
  247. 31030 CAPLIST=0: GPCOLOR=-SENTE
  248. 31040 BOARD(X,Y)=SENTE: MLIB=0
  249. 31050 FOR N=1 TO 4: GOSUB 61000: IF NB=0 THEN 31120
  250. 31060     B=BOARD(NBX,NBY)
  251. 31070     IF B=0 THEN MLIB=MLIB+1: GOTO 31120
  252. 31080     IF B=SENTE THEN GOTO 31120
  253. 31090      BIGLIST=CAPLIST: ITEM=NB: GOSUB 36000
  254. 31100     IF MEMBER=1 THEN 31120
  255. 31110     GOSUB 35000: IF LIBERTY=0 THEN GOSUB 37000
  256. 31120 NEXT N
  257. 31130 BOARD(X,Y)=0: RETURN
  258. 32000 '
  259. 32010 '     check for suicide
  260. 32020 '
  261. 32030 BOARD(X,Y)=SENTE
  262. 32040 XSAV=X: YSAV=Y
  263. 32050 NB=X+19*(Y-1)
  264. 32060 NBX=X: NBY=Y: NB=P: GPCOLOR=SENTE:GOSUB 35000
  265. 32070 X=XSAV: Y=YSAV
  266. 32080 IF LIBERTY=0 THEN SUICIDE=1: BOARD(X,Y)=0: RETURN
  267. 32090 SUICIDE=0: RETURN
  268. 32100 X=SAVX: Y=SAVY: N=SAVN
  269. 32110 RETURN
  270. 33000 '
  271. 33010 '    check for ko
  272. 33020 '
  273. 33030 KO=0
  274. 33040 IF (CAPLIST=0 OR CAPREC(MOVNUM)=0) THEN RETURN
  275. 33050 IF (REST(CAPLIST)<>0 OR REST(CAPREC(MOVNUM))<>0) THEN RETURN
  276. 33060 IF FIRST(CAPLIST)<>MOVREC(MOVNUM) THEN RETURN
  277. 33070 IF MOV<>FIRST(CAPREC(MOVNUM)) THEN RETURN
  278. 33080 KO=1: RETURN
  279. 35000 '
  280. 35010 ' determine survival of a group of stones
  281. 35020 '
  282. 35030 GPLIST=0:SAVP=P: SAVX=X: SAVY=Y: SAVN=N: LIBERTY=0
  283. 35040 OFREE=FREE
  284. 35050 FIRST(FREE)=NB: REST(FREE)=0
  285. 35060 QLIST=FREE: FREE=FREE+1
  286. 35070 WHILE (QLIST<>0 AND LIBERTY=0)
  287. 35080     P=FIRST(QLIST): QLIST=REST(QLIST)
  288. 35090     TEST=P
  289. 35100     GOSUB 60000
  290. 35110     FOR N=1 TO 4: GOSUB 61000
  291. 35120         IF NB=0 THEN GOTO 35240
  292. 35130         B=BOARD(NBX,NBY)
  293. 35140         IF B=0 THEN LIBERTY=LIBERTY+1: GOTO 35240
  294. 35150         IF B=-GPCOLOR THEN GOTO 35240
  295. 35160         '
  296. 35170         BIGLIST=QLIST: ITEM=NB: GOSUB 36000
  297. 35180         IF MEMBER=1 THEN 35240
  298. 35190         BIGLIST=GPLIST: ITEM=NB: GOSUB 36000
  299. 35200         IF MEMBER=1 THEN 35240
  300. 35210         FIRST(FREE)=NB: REST(FREE)=QLIST
  301. 35220         QLIST=FREE: FREE=FREE+1
  302. 35230         '
  303. 35240     NEXT N
  304. 35250     IF LIBERTY<>0 THEN 35280
  305. 35260     FIRST(FREE)=TEST: REST(FREE)=GPLIST
  306. 35270     GPLIST=FREE: FREE=FREE+1
  307. 35280 WEND
  308. 35290 IF LIBERTY<>0 THEN FREE=OFREE
  309. 35300 P=SAVP:X=SAVX: Y=SAVY: N=SAVN
  310. 35310 RETURN
  311. 36000 '
  312. 36010 '     determine membership
  313. 36020 '
  314. 36030 TESTLIST=BIGLIST
  315. 36040 WHILE TESTLIST<>0
  316. 36050     IF ITEM=FIRST(TESTLIST) THEN MEMBER=1: RETURN
  317. 36060     TESTLIST=REST(TESTLIST)
  318. 36070 WEND
  319. 36080 MEMBER=0: RETURN
  320. 37000 '
  321. 37010 '     append gplist to caplist
  322. 37020 '
  323. 37030 IF CAPLIST=0 THEN CAPLIST=GPLIST: RETURN
  324. 37040 LAST=CAPLIST
  325. 37050 WHILE REST(LAST)<>0: LAST=REST(LAST): WEND
  326. 37060 REST(LAST)=GPLIST
  327. 37070 RETURN
  328. 50000 '
  329. 50010 '     wait for input
  330. 50020 '
  331. 50030 INFLAG=0: DUMMY=MOUSE(0)
  332. 50040 WHILE INFLAG=0
  333. 50050     K$=INKEY$: IF K$<>"" THEN INFLAG=1: RETURN
  334. 50060     M=MOUSE(0): IF M<>0 THEN INFLAG=2: RETURN
  335. 50070 WEND: RETURN
  336. 50500 '
  337. 50510 '     print message
  338. 50520 '
  339. 50530 CALL MOVETO(300,45): PRINT MESS$: PFLAG=1: RETURN
  340. 51000 '
  341. 51010 '     get point from mouse
  342. 51020 '
  343. 51030 WHILE MOUSE(0)<>0: WEND
  344. 51040 X=INT((MOUSE(1)+7)/14)
  345. 51050 Y=INT((MOUSE(2)+7)/14)
  346. 51060 IF X<1 OR X >19 THEN P=0: RETURN
  347. 51070 IF Y<1 OR Y>19 THEN P=0: RETURN
  348. 51080 P=X+19*(Y-1)
  349. 51090 RETURN
  350. 52000 '
  351. 52010 '     execute move
  352. 52020 '
  353. 52030 IF P=0 THEN 52050
  354. 52040 GOSUB 60000: BOARD(X,Y)=COLOR: GOSUB 56000
  355. 52050 RESTCAP=CAPLIST
  356. 52060 WHILE RESTCAP<>0
  357. 52070     P=FIRST(RESTCAP): RESTCAP=REST(RESTCAP)
  358. 52080     GOSUB 60000
  359. 52090     BOARD(X,Y)=0: GOSUB 55000
  360. 52100     IF COLOR=1 THEN WDEAD=WDEAD+1 ELSE BDEAD=BDEAD+1
  361. 52110 WEND
  362. 52120 RETURN
  363. 53000 '
  364. 53010 '     retract move
  365. 53020 '
  366. 53030 PSAV=P
  367. 53040 WHILE CAPLIST<>0
  368. 53050     P=FIRST(CAPLIST): CAPLIST=REST(CAPLIST)
  369. 53060     GOSUB 60000
  370. 53070     BOARD(X,Y)=COLOR: GOSUB 56000
  371. 53080     IF COLOR=1 THEN BDEAD=BDEAD-1 ELSE WDEAD=WDEAD-1
  372. 53090 WEND
  373. 53100 P=PSAV: IF P=0 THEN RETURN
  374. 53110 GOSUB 60000:BOARD(X,Y)=0: GOSUB 55000
  375. 53120 RETURN
  376. 54000 '
  377. 54010 '     draw screen
  378. 54020 '
  379. 54030 CLS
  380. 54040 CIRCLE(10,10),7,33
  381. 54050 GET (3,3)-(17,17),WS
  382. 54060 FOR I=0 TO 7: CIRCLE(10,10),I,33: NEXT I
  383. 54070 GET (3,3)-(17,17),BS
  384. 54080 CLS
  385. 54090 FOR I=1 TO 19
  386. 54100 LINE(14,14*I)-(266,14*I)
  387. 54110 LINE(14*I,14)-(14*I,266)
  388. 54120 NEXT I 
  389. 54130 FOR I=4 TO 16 STEP 6:FOR J=4 TO 16 STEP 6
  390. 54140 CIRCLE(14*I,+14*J),1,33
  391. 54150 NEXT J: NEXT I
  392. 54160 RETURN
  393. 55000 '
  394. 55010 '     delete a stone
  395. 55020 ' 
  396. 55030 LINE(7+14*(X-1),7+14*(Y-1))-(21+14*(X-1),21+14*(Y-1)),30,BF
  397. 55040 CLEFT=7: CRIGHT=7: CUP=7: CDOWN=7
  398. 55050 IF X=1 THEN CLEFT=0
  399. 55060 IF X=19 THEN CRIGHT=0
  400. 55070 IF Y=1 THEN CUP=0
  401. 55080 IF Y=19 THEN CDOWN=0
  402. 55090 LINE(14-CLEFT+14*(X-1),14+14*(Y-1))-(14+CRIGHT+14*(X-1),14+14*(Y-1))
  403. 55100 LINE(14+14*(X-1),14-CUP+14*(Y-1))-(14+14*(X-1),14+CDOWN+14*(Y-1))
  404. 55110 IF (X=4 OR X=10 OR X=16) THEN 55120 ELSE 55150
  405. 55120 IF (Y=4 OR Y=10 OR Y=16) THEN 55130 ELSE 55150
  406. 55130 CIRCLE(14*X,14*Y),1,33
  407. 55140 '
  408. 55150 XSAVD=X: YSAVD=Y: NSAVD=N: PSAVD=P: CSAVD=COLOR
  409. 55160 FOR N=1 TO 4: GOSUB 61000
  410. 55170     IF NB=0 THEN 55200
  411. 55180     COLOR=BOARD(NBX,NBY): IF COLOR=0 THEN 55200
  412. 55190     CIRCLE (14+14*(NBX-1),14+14*(NBY-1)),7,33
  413. 55200 NEXT N
  414. 55210 X=XSAVD: Y=YSAVD: N=NSAVD: P=PSAVD: COLOR=CSAVD
  415. 55220 RETURN
  416. 56000 ' 
  417. 56010 '     put stone on screen
  418. 56020 '
  419. 56030 IF COLOR=-1 THEN 56070
  420. 56040 PUT (7+14*(X-1),7+14*(Y-1)),BS,PSET
  421. 56050 RETURN
  422. 56060 REM
  423. 56070 PUT (7+14*(X-1),7+14*(Y-1)),WS,PSET
  424. 56080 RETURN
  425. 60000 X=P MOD 19: IF X=0 THEN X=19
  426. 60010 Y=(P-X+19)/19: RETURN
  427. 61000  ON N GOTO 61010,61020,61030, 61040
  428. 61010 IF X=1 THEN NB=0: RETURN ELSE NB=P-1:NBX=X-1: NBY=Y:  RETURN
  429. 61020 IF X=19 THEN NB=0: RETURN ELSE NB=P+1:NBX=X+1: NBY=Y: RETURN
  430. 61030 IF Y=1 THEN NB=0: RETURN ELSE NB=P-19: NBX=X: NBY=Y-1: RETURN
  431. 61040 IF Y=19 THEN NB=0: RETURN ELSE NB=P+19:NBX=X: NBY=Y+1: RETURN
  432.  
  433.