home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / 83win / data1.cab / Basic_Plus_Examples / TICTACTO < prev    next >
Encoding:
Text File  |  2001-03-02  |  16.4 KB  |  500 lines

  1. 10    ! ************************************************************
  2. 20    ! Example: Tic-Tac-Toe
  3. 30    !
  4. 40    ! This example program plays tic-tac-toe.
  5. 50    ! It illustrates the use of STRING widgets with different fonts, and
  6. 60    ! shows how attribute arrays can be used. The PUSHBUTTON object
  7. 70    ! is used to initiate an action. Each of the squares is a pushbutton.
  8. 80    ! When a button is clicked it is given to a player and deactivated.
  9. 90    !
  10. 100    ! The arrays Attr_n$ and Attr are used to program six numeric attributes
  11. 110    ! at once. The arrays Attr_s$ and Attr_sv$ are used to program three
  12. 120    ! string attributes.
  13. 130    !
  14. 140    ! ************************************************************
  15. 150   !
  16. 160  DIM Attr_n$(5)[11],Attr_s$(2)[10],Attr(5),Attr_sv$(2)[10],Xo$(1)[1]
  17. 170  DIM Sel$(4)[1],Grid$(1)[10],Buttons$(2)[5]
  18. 180  DIM Xo(3,3)
  19. 190  Dims=4
  20. 200  Attr_n$(0)="X"
  21. 210  Attr_n$(1)="Y"
  22. 220  Attr_n$(2)="WIDTH"
  23. 230  Attr_n$(3)="HEIGHT"
  24. 240  Attr_n$(4)="RESIZABLE"
  25. 250  Attr_n$(5)="MAXIMIZABLE"
  26. 260  Attr(0)=100                     ! x position
  27. 270  Attr(1)=20                      ! y position
  28. 280  Attr(2)=50                      ! width
  29. 290  Attr(3)=50                      ! height
  30. 300  Attr(4)=0                       ! not resizable
  31. 310  Attr(5)=0                       ! not maximizable
  32. 320  Attr_s$(0)="FONT"
  33. 330  Attr_s$(1)="TITLE"
  34. 340  Attr_s$(2)="LABEL"
  35. 350  Attr_sv$(0)="20 BY 30"          ! A large font
  36. 360  Attr_sv$(1)=""                  ! Makes the title area disappear
  37. 370  Attr_sv$(2)=""                  ! Use a blank label to start
  38. 380  Sel$(0)="0"
  39. 390  Sel$(1)="1"
  40. 400  Sel$(2)="2"
  41. 410  Sel$(3)="3"
  42. 420  Sel$(4)="4"
  43. 430  Grid$(0)="3 BY 3"
  44. 440  Grid$(1)="4 BY 4"
  45. 450  Buttons$(0)="1"
  46. 460  Buttons$(1)="2"
  47. 470  Buttons$(2)="Quit"
  48. 480  DIALOG "QUESTION","How many players?",Button;SET ("DIALOG BUTTONS":Buttons$(*))
  49. 490  IF Button=2 THEN STOP
  50. 500  Players=Button+1
  51. 510  DIALOG "LIST","Select Playing Grid",Button;SET ("ITEMS":Grid$(*),"SELECTED ITEM":0),RETURN ("SELECTED ITEM":Grid)
  52. 520  Dims=3
  53. 530  IF Grid=1 THEN Dims=4
  54. 540  IF Button=1 THEN STOP
  55. 550  DIALOG "LIST","Select Level of Difficulty",Button;SET ("ITEMS":Sel$(*),"SELECTED ITEM":1),RETURN ("SELECTED ITEM":Level)
  56. 560  IF Button=1 THEN STOP
  57. 570   !
  58. 580   ! Nine pushbutton widgets are created in three rows and three columns.
  59. 590   ! The use of the attribute arrays allows all the widgets to be changed
  60. 600   ! easily and yet have them still be aligned.
  61. 610   !
  62. 620  ASSIGN @Box11 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  63. 630  Attr(0)=Attr(0)+Attr(2)     ! x position moved one button width right
  64. 640   !
  65. 650  ASSIGN @Box12 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  66. 660  Attr(0)=Attr(0)+Attr(2)     ! x position moved one button width right
  67. 670   !
  68. 680  ASSIGN @Box13 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  69. 690  Attr(0)=Attr(0)+Attr(2)
  70. 700   !
  71. 710  ASSIGN @Box14 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  72. 720  Attr(0)=Attr(0)-3*Attr(2)   ! x position moved two button widths left
  73. 730  Attr(1)=Attr(1)+Attr(3)     ! y position moved one button height down
  74. 740   !
  75. 750  ASSIGN @Box21 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  76. 760  Attr(0)=Attr(0)+Attr(2)
  77. 770   !
  78. 780  ASSIGN @Box22 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  79. 790  Attr(0)=Attr(0)+Attr(2)
  80. 800   !
  81. 810  ASSIGN @Box23 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  82. 820  Attr(0)=Attr(0)+Attr(2)
  83. 830   !
  84. 840  ASSIGN @Box24 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  85. 850  Attr(0)=Attr(0)-3*Attr(2)
  86. 860  Attr(1)=Attr(1)+Attr(3)
  87. 870   !
  88. 880  ASSIGN @Box31 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  89. 890  Attr(0)=Attr(0)+Attr(2)
  90. 900   !
  91. 910  ASSIGN @Box32 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  92. 920  Attr(0)=Attr(0)+Attr(2)
  93. 930   !
  94. 940  ASSIGN @Box33 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  95. 950  Attr(0)=Attr(0)+Attr(2)
  96. 960   !
  97. 970  ASSIGN @Box34 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  98. 980  Attr(0)=Attr(0)-3*Attr(2)
  99. 990  Attr(1)=Attr(1)+Attr(3)
  100. 1000  !
  101. 1010 ASSIGN @Box41 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  102. 1020 Attr(0)=Attr(0)+Attr(2)
  103. 1030  !
  104. 1040 ASSIGN @Box42 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  105. 1050 Attr(0)=Attr(0)+Attr(2)
  106. 1060  !
  107. 1070 ASSIGN @Box43 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  108. 1080 Attr(0)=Attr(0)+Attr(2)
  109. 1090  !
  110. 1100 ASSIGN @Box44 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  111. 1110 IF Dims=4 THEN
  112. 1120     CONTROL @Box44;SET ("VISIBLE":1)
  113. 1130     CONTROL @Box43;SET ("VISIBLE":1)
  114. 1140     CONTROL @Box42;SET ("VISIBLE":1)
  115. 1150     CONTROL @Box41;SET ("VISIBLE":1)
  116. 1160     CONTROL @Box34;SET ("VISIBLE":1)
  117. 1170     CONTROL @Box24;SET ("VISIBLE":1)
  118. 1180     CONTROL @Box14;SET ("VISIBLE":1)
  119. 1190 END IF
  120. 1200 ASSIGN @Quit TO WIDGET "PUSHBUTTON"
  121. 1210 CONTROL @Quit;SET ("TITLE":"","LABEL":"Quit","X":10,"Y":22)
  122. 1220 CONTROL @Quit;SET ("HEIGHT":40,"WIDTH":60)
  123. 1230 ON EVENT @Quit,"ACTIVATED" GOTO Finis
  124. 1240  !
  125. 1250  ! The Turn variable keeps track of whose
  126. 1260  ! turn it is. Zero means X, one means O.
  127. 1270  !
  128. 1280 Turn=0
  129. 1290 Xo$(0)="X"
  130. 1300 Xo$(1)="O"
  131. 1310  !
  132. 1320  ! A STRING widget to remind the players whose turn it is
  133. 1330  !
  134. 1340 Attr(0)=Attr(0)-3*Attr(2)     ! Move x position back to left edge
  135. 1350 IF Dims=4 THEN Attr(1)=Attr(1)+Attr(3)   ! Move y position to bottom
  136. 1360 Attr(2)=Dims*Attr(2)          ! Set width to three buttons wide
  137. 1370  !
  138. 1380 ASSIGN @Who TO WIDGET "STRING";SET (Attr_n$(*):Attr(*),"TITLE":"","VALUE":"It is "&Xo$(Turn)&"'s turn")
  139. 1390  !
  140. 1400  ! This array records who has which square. It is initialized to values
  141. 1410  ! which are unequal and do not correspond to either an X or an O.
  142. 1420  !
  143. 1430 Start: !
  144. 1440 FOR I=0 TO Dims-1
  145. 1450     FOR J=0 TO Dims-1
  146. 1460         Xo(I,J)=-1-I-2*J
  147. 1470     NEXT J
  148. 1480 NEXT I
  149. 1490  !
  150. 1500  ! Each pushbotton calls its own subroutine.
  151. 1510  !
  152. 1520 ON EVENT @Box11,"ACTIVATED" GOSUB Hit_box11
  153. 1530 ON EVENT @Box12,"ACTIVATED" GOSUB Hit_box12
  154. 1540 ON EVENT @Box13,"ACTIVATED" GOSUB Hit_box13
  155. 1550 ON EVENT @Box14,"ACTIVATED" GOSUB Hit_box14
  156. 1560 ON EVENT @Box21,"ACTIVATED" GOSUB Hit_box21
  157. 1570 ON EVENT @Box22,"ACTIVATED" GOSUB Hit_box22
  158. 1580 ON EVENT @Box23,"ACTIVATED" GOSUB Hit_box23
  159. 1590 ON EVENT @Box24,"ACTIVATED" GOSUB Hit_box24
  160. 1600 ON EVENT @Box31,"ACTIVATED" GOSUB Hit_box31
  161. 1610 ON EVENT @Box32,"ACTIVATED" GOSUB Hit_box32
  162. 1620 ON EVENT @Box33,"ACTIVATED" GOSUB Hit_box33
  163. 1630 ON EVENT @Box34,"ACTIVATED" GOSUB Hit_box34
  164. 1640 ON EVENT @Box41,"ACTIVATED" GOSUB Hit_box41
  165. 1650 ON EVENT @Box42,"ACTIVATED" GOSUB Hit_box42
  166. 1660 ON EVENT @Box43,"ACTIVATED" GOSUB Hit_box43
  167. 1670 ON EVENT @Box44,"ACTIVATED" GOSUB Hit_box44
  168. 1680 LOOP
  169. 1690     CONTROL @Who;SET ("VALUE":"It is "&Xo$(Turn)&"'s turn")
  170. 1700     IF Turn=0 OR Players=2 THEN
  171. 1710         WAIT FOR EVENT
  172. 1720     ELSE
  173. 1730         Computer_play(Xo(*),Turn,Level,Row,Col,Dims)
  174. 1740         Set_box(Xo$(Turn),Row,Col,@Box11,@Box12,@Box13,@Box14,@Box21,@Box22,@Box23,@Box24,@Box31,@Box32,@Box33,@Box34,@Box41,@Box42,@Box43,@Box44)
  175. 1750         Xo(Row,Col)=Turn
  176. 1760         Turn=(Turn=0)
  177. 1770     END IF
  178. 1780  !
  179. 1790  ! These IF statements check if anyone has three in a row
  180. 1800  !
  181. 1810     Winner=-1
  182. 1820     Winner=FNCheck_winner(Xo(*),Dims)
  183. 1830     IF Winner>=0 THEN GOTO Win
  184. 1840  !
  185. 1850  ! Check to see if all the squares have been taken
  186. 1860  !
  187. 1870     Tie=FNCheck_tie(Xo(*),Dims)
  188. 1880     IF Tie THEN GOTO Tie
  189. 1890 END LOOP
  190. 1900  !
  191. 1910  ! Each square has its own subroutine. They are nearly identical.
  192. 1920  ! The appropriate square is given to the player whose turn it is.
  193. 1930  ! An X or O is in placed in the square. The pushbutton for that
  194. 1940  ! square is deactivated. The turn indicator is flipped.
  195. 1950  !
  196. 1960 Hit_box11: !
  197. 1970 Xo(0,0)=Turn
  198. 1980 CONTROL @Box11;SET ("LABEL":Xo$(Turn))
  199. 1990 Turn=(Turn=0)
  200. 2000 OFF EVENT @Box11,"ACTIVATED"
  201. 2010 RETURN
  202. 2020  !
  203. 2030 Hit_box12: !
  204. 2040 Xo(0,1)=Turn
  205. 2050 CONTROL @Box12;SET ("LABEL":Xo$(Turn))
  206. 2060 Turn=(Turn=0)
  207. 2070 OFF EVENT @Box12,"ACTIVATED"
  208. 2080 RETURN
  209. 2090  !
  210. 2100 Hit_box13: !
  211. 2110 Xo(0,2)=Turn
  212. 2120 CONTROL @Box13;SET ("LABEL":Xo$(Turn))
  213. 2130 Turn=(Turn=0)
  214. 2140 OFF EVENT @Box13,"ACTIVATED"
  215. 2150 RETURN
  216. 2160  !
  217. 2170 Hit_box14: !
  218. 2180 Xo(0,3)=Turn
  219. 2190 CONTROL @Box14;SET ("LABEL":Xo$(Turn))
  220. 2200 Turn=(Turn=0)
  221. 2210 OFF EVENT @Box14,"ACTIVATED"
  222. 2220 RETURN
  223. 2230  !
  224. 2240 Hit_box21: !
  225. 2250 CONTROL @Box21;SET ("LABEL":Xo$(Turn))
  226. 2260 Xo(1,0)=Turn
  227. 2270 Turn=(Turn=0)
  228. 2280 OFF EVENT @Box21,"ACTIVATED"
  229. 2290 RETURN
  230. 2300  !
  231. 2310 Hit_box22: !
  232. 2320 Xo(1,1)=Turn
  233. 2330 CONTROL @Box22;SET ("LABEL":Xo$(Turn))
  234. 2340 Turn=(Turn=0)
  235. 2350 OFF EVENT @Box22,"ACTIVATED"
  236. 2360 RETURN
  237. 2370  !
  238. 2380 Hit_box23: !
  239. 2390 Xo(1,2)=Turn
  240. 2400 CONTROL @Box23;SET ("LABEL":Xo$(Turn))
  241. 2410 Turn=(Turn=0)
  242. 2420 OFF EVENT @Box23,"ACTIVATED"
  243. 2430 RETURN
  244. 2440  !
  245. 2450 Hit_box24: !
  246. 2460 Xo(1,3)=Turn
  247. 2470 CONTROL @Box24;SET ("LABEL":Xo$(Turn))
  248. 2480 Turn=(Turn=0)
  249. 2490 OFF EVENT @Box24,"ACTIVATED"
  250. 2500 RETURN
  251. 2510  !
  252. 2520 Hit_box31: !
  253. 2530 Xo(2,0)=Turn
  254. 2540 CONTROL @Box31;SET ("LABEL":Xo$(Turn))
  255. 2550 Turn=(Turn=0)
  256. 2560 OFF EVENT @Box31,"ACTIVATED"
  257. 2570 RETURN
  258. 2580  !
  259. 2590 Hit_box32: !
  260. 2600 Xo(2,1)=Turn
  261. 2610 CONTROL @Box32;SET ("LABEL":Xo$(Turn))
  262. 2620 Turn=(Turn=0)
  263. 2630 OFF EVENT @Box32,"ACTIVATED"
  264. 2640 RETURN
  265. 2650  !
  266. 2660 Hit_box33: !
  267. 2670 Xo(2,2)=Turn
  268. 2680 CONTROL @Box33;SET ("LABEL":Xo$(Turn))
  269. 2690 Turn=(Turn=0)
  270. 2700 OFF EVENT @Box33,"ACTIVATED"
  271. 2710 RETURN
  272. 2720  !
  273. 2730 Hit_box34: !
  274. 2740 Xo(2,3)=Turn
  275. 2750 CONTROL @Box34;SET ("LABEL":Xo$(Turn))
  276. 2760 Turn=(Turn=0)
  277. 2770 OFF EVENT @Box34,"ACTIVATED"
  278. 2780 RETURN
  279. 2790  !
  280. 2800 Hit_box41: !
  281. 2810 Xo(3,0)=Turn
  282. 2820 CONTROL @Box41;SET ("LABEL":Xo$(Turn))
  283. 2830 Turn=(Turn=0)
  284. 2840 OFF EVENT @Box41,"ACTIVATED"
  285. 2850 RETURN
  286. 2860  !
  287. 2870 Hit_box42: !
  288. 2880 Xo(3,1)=Turn
  289. 2890 CONTROL @Box42;SET ("LABEL":Xo$(Turn))
  290. 2900 Turn=(Turn=0)
  291. 2910 OFF EVENT @Box42,"ACTIVATED"
  292. 2920 RETURN
  293. 2930  !
  294. 2940 Hit_box43: !
  295. 2950 Xo(3,2)=Turn
  296. 2960 CONTROL @Box43;SET ("LABEL":Xo$(Turn))
  297. 2970 Turn=(Turn=0)
  298. 2980 OFF EVENT @Box43,"ACTIVATED"
  299. 2990 RETURN
  300. 3000  !
  301. 3010 Hit_box44: !
  302. 3020 Xo(3,3)=Turn
  303. 3030 CONTROL @Box44;SET ("LABEL":Xo$(Turn))
  304. 3040 Turn=(Turn=0)
  305. 3050 OFF EVENT @Box44,"ACTIVATED"
  306. 3060 RETURN
  307. 3070 Win: !
  308. 3080  !
  309. 3090  ! Announce the winner
  310. 3100  !
  311. 3110 DIALOG "INFORMATION",Xo$(Winner)&" wins";SET ("X":50,"Y":0,"WIDTH":300,"HEIGHT":300,"FONT":"20 BY 30")
  312. 3120 GOTO Cleanup
  313. 3130 Tie:!
  314. 3140  !
  315. 3150  ! Declare a tie
  316. 3160  !
  317. 3170 DIALOG "INFORMATION","Tie";SET ("X":50,"Y":0,"WIDTH":300,"HEIGHT":300,"FONT":"20 BY 30")
  318. 3180  !
  319. 3190  ! Make the labels in all the squares blank
  320. 3200  !
  321. 3210 Cleanup: !
  322. 3220 CONTROL @Box11;SET ("LABEL":"")
  323. 3230 CONTROL @Box12;SET ("LABEL":"")
  324. 3240 CONTROL @Box13;SET ("LABEL":"")
  325. 3250 CONTROL @Box14;SET ("LABEL":"")
  326. 3260 CONTROL @Box21;SET ("LABEL":"")
  327. 3270 CONTROL @Box22;SET ("LABEL":"")
  328. 3280 CONTROL @Box23;SET ("LABEL":"")
  329. 3290 CONTROL @Box24;SET ("LABEL":"")
  330. 3300 CONTROL @Box31;SET ("LABEL":"")
  331. 3310 CONTROL @Box32;SET ("LABEL":"")
  332. 3320 CONTROL @Box33;SET ("LABEL":"")
  333. 3330 CONTROL @Box34;SET ("LABEL":"")
  334. 3340 CONTROL @Box41;SET ("LABEL":"")
  335. 3350 CONTROL @Box42;SET ("LABEL":"")
  336. 3360 CONTROL @Box43;SET ("LABEL":"")
  337. 3370 CONTROL @Box44;SET ("LABEL":"")
  338. 3380  !
  339. 3390  ! Give the turn indicator to X and start a new game
  340. 3400  !
  341. 3410 Turn=0
  342. 3420 GOTO Start
  343. 3430 Finis: END
  344. 3440 DEF FNCheck_winner(Xo(*),Dims)
  345. 3450     Winner=-1
  346. 3460     Fail=0
  347. 3470  !
  348. 3480  ! Check Rows
  349. 3490  !
  350. 3500     FOR I=0 TO Dims-1
  351. 3510         FOR J=0 TO Dims-2
  352. 3520             IF Xo(I,J+1)<>Xo(I,J) THEN
  353. 3530                 Fail=1
  354. 3540                 GOTO 3590
  355. 3550             END IF
  356. 3560             Tmp=Xo(I,J)
  357. 3570         NEXT J
  358. 3580         IF Fail=0 THEN RETURN Tmp
  359. 3590         Fail=0
  360. 3600     NEXT I
  361. 3610  !
  362. 3620  ! Check Columns
  363. 3630  !
  364. 3640     Fail=0
  365. 3650     FOR J=0 TO Dims-1
  366. 3660         FOR I=0 TO Dims-2
  367. 3670             IF Xo(I+1,J)<>Xo(I,J) THEN
  368. 3680                 Fail=1
  369. 3690                 GOTO 3740
  370. 3700             END IF
  371. 3710             Tmp=Xo(I,J)
  372. 3720         NEXT I
  373. 3730         IF Fail=0 THEN RETURN Tmp
  374. 3740         Fail=0
  375. 3750     NEXT J
  376. 3760  !
  377. 3770  ! Check Diagonals
  378. 3780  !
  379. 3790     Tmp=Xo(0,0)
  380. 3800     Fail=0
  381. 3810     FOR J=0 TO Dims-2
  382. 3820         IF Xo(J,J)<>Xo(J+1,J+1) THEN
  383. 3830             Fail=1
  384. 3840             GOTO 3880
  385. 3850         END IF
  386. 3860     NEXT J
  387. 3870     IF Fail=0 THEN RETURN Tmp
  388. 3880     Tmp=Xo(Dims-1,0)
  389. 3890     Fail=0
  390. 3900     FOR J=0 TO Dims-2
  391. 3910         IF Xo(Dims-1-J,J)<>Xo(Dims-2-J,J+1) THEN
  392. 3920             Fail=1
  393. 3930             RETURN -1
  394. 3940         END IF
  395. 3950     NEXT J
  396. 3960     IF Fail=0 THEN RETURN Tmp
  397. 3970     RETURN -1
  398. 3980 FNEND
  399. 3990 DEF FNCheck_tie(Xo(*),Dims)
  400. 4000     Tie=1
  401. 4010     FOR I=0 TO Dims-1
  402. 4020         FOR J=0 TO Dims-1
  403. 4030             IF Xo(I,J)<0 THEN Tie=0
  404. 4040         NEXT J
  405. 4050     NEXT I
  406. 4060     RETURN Tie
  407. 4070 FNEND
  408. 4080 SUB Computer_play(Xo(*),Turn,Level,Row,Col,Dims)
  409. 4090 Computer_play: !
  410. 4100     DIM Weights(3,3)
  411. 4110     REDIM Weights(Dims-1,Dims-1)
  412. 4120     Opponent=(Turn+1) MOD 2
  413. 4130     MAT Weights=(0)
  414. 4140     IF Level>1 THEN ASSIGN @W TO WIDGET "LABEL";SET ("VALUE":"I'm calculating. Please Wait...","COLUMNS":35,"ROWS":2)
  415. 4150     Find_weights(Xo(*),Weights(*),Turn,Turn,Level,Dims)
  416. 4160     Eval_weights(Xo(*),Weights(*),Row,Col,Dims)
  417. 4170     IF Level>1 THEN ASSIGN @W TO *
  418. 4180 SUBEND
  419. 4190 SUB Find_weights(X(*),Weights(*),Mark,Turn,Level,Dims)
  420. 4200 Find_weights: !
  421. 4210     DIM X1(3,3)
  422. 4220     REDIM X1(Dims-1,Dims-1)
  423. 4230     MAT X1=X
  424. 4240     REAL Temp
  425. 4250     Opponent=(Turn+1) MOD 2
  426. 4260     Opp_mark=(Mark+1) MOD 2
  427. 4270     FOR I=0 TO Dims-1
  428. 4280         FOR J=0 TO Dims-1
  429. 4290             IF X1(I,J)<0 THEN
  430. 4300                 Temp=X1(I,J)
  431. 4310                 X1(I,J)=Turn
  432. 4320                 M=FNCheck_winner(X1(*),Dims)
  433. 4330                 IF M=Mark THEN
  434. 4340                     Weights(I,J)=Weights(I,J)+1
  435. 4350                 ELSE
  436. 4360                     IF M=Opp_mark THEN
  437. 4370                         Weights(I,J)=Weights(I,J)+1
  438. 4380                     ELSE
  439. 4390                         IF Level>0 THEN CALL Find_weights(X1(*),Weights(*),Mark,Opponent,Level-1,Dims)
  440. 4400                     END IF
  441. 4410                 END IF
  442. 4420                 X1(I,J)=Temp
  443. 4430             END IF
  444. 4440         NEXT J
  445. 4450     NEXT I
  446. 4460 SUBEND
  447. 4470 SUB Eval_weights(X(*),W(*),R,C,Dims)
  448. 4480     DIM Opt_rows(16),Opt_cols(16)
  449. 4490     Best=MAX(W(*))
  450. 4500     Count=0
  451. 4510     FOR I=0 TO Dims-1
  452. 4520         FOR J=0 TO Dims-1
  453. 4530             IF W(I,J)=Best AND X(I,J)<0 THEN
  454. 4540                 Opt_rows(Count)=I
  455. 4550                 Opt_cols(Count)=J
  456. 4560                 Count=Count+1
  457. 4570             END IF
  458. 4580         NEXT J
  459. 4590     NEXT I
  460. 4600     Index=MAX(0,PROUND(Count*RND-.5,0))
  461. 4610     R=Opt_rows(Index)
  462. 4620     C=Opt_cols(Index)
  463. 4630 SUBEND
  464. 4640 SUB Set_box(X$,Row,Col,@B11,@B12,@B13,@B14,@B21,@B22,@B23,@B24,@B31,@B32,@B33,@B34,@B41,@B42,@B43,@B44)
  465. 4650     SELECT 10*Row+Col
  466. 4660     CASE 0
  467. 4670         CONTROL @B11;SET ("LABEL":X$)
  468. 4680     CASE 1
  469. 4690         CONTROL @B12;SET ("LABEL":X$)
  470. 4700     CASE 2
  471. 4710         CONTROL @B13;SET ("LABEL":X$)
  472. 4720     CASE 3
  473. 4730         CONTROL @B14;SET ("LABEL":X$)
  474. 4740     CASE 10
  475. 4750         CONTROL @B21;SET ("LABEL":X$)
  476. 4760     CASE 11
  477. 4770         CONTROL @B22;SET ("LABEL":X$)
  478. 4780     CASE 12
  479. 4790         CONTROL @B23;SET ("LABEL":X$)
  480. 4800     CASE 13
  481. 4810         CONTROL @B24;SET ("LABEL":X$)
  482. 4820     CASE 20
  483. 4830         CONTROL @B31;SET ("LABEL":X$)
  484. 4840     CASE 21
  485. 4850         CONTROL @B32;SET ("LABEL":X$)
  486. 4860     CASE 22
  487. 4870         CONTROL @B33;SET ("LABEL":X$)
  488. 4880     CASE 23
  489. 4890         CONTROL @B34;SET ("LABEL":X$)
  490. 4900     CASE 30
  491. 4910         CONTROL @B41;SET ("LABEL":X$)
  492. 4920     CASE 31
  493. 4930         CONTROL @B42;SET ("LABEL":X$)
  494. 4940     CASE 32
  495. 4950         CONTROL @B43;SET ("LABEL":X$)
  496. 4960     CASE 33
  497. 4970         CONTROL @B44;SET ("LABEL":X$)
  498. 4980     END SELECT
  499. 4990 SUBEND
  500.