Rivista: Acorn User – Numero: 9 – Anno: 1983 – Trascrizione: Francesco Fiorentini
Quello che andiamo a presentarvi é un gioco estratto dalla rivista inglese Acorn User, numero 9 di Aprile 1983, che mettera’ a dura prova la vostra intelligenza.
Hexangle è un gioco di abilità – tu contro il computer. Entrambi giocate a turno tracciando le linee tra i sei punti gialli; il computer disegna linee rosse e tu le disegni in bianco. Il primo che disegna un triangolo del proprio colore perde. Contano però solo i triangoli che hanno un punto in ogni vertice. Quando la scacchiera viene disegnata, appare una linea bianca lampeggiante: questa è il cursore. Puoi spostare il cursore tenendo premuti i tasti freccia sinistra e destra. Quando il cursore è nella posizione desiderata, premi Invio. Alla prima mossa del gioco puoi saltare il tuo turno premendo la barra spaziatrice. Il computer muove quindi nei vertici, esaminando ogni linea mentre sposta il cursore – poi ne riempie una in rosso. Non è possibile pareggiare, e il computer gioca piuttosto bene nella modalità difficile – specialmente se si inizia per primi. La procedura che decide quale mossa fare si chiama CHOOSEMYOVE. Prova una linea rossa in ogni posizione legale e calcola un ‘punteggio’. Questo misura quanto buona o cattiva sia quella posizione e viene chiamata euristica.

Titolo: Hexangle
Piattaforma: BBC Micro
Linguaggio: Basic
Versione originale: P.R. Balch
Pubblicazione: Acorn User – numero 9
Anno: 1983 – Aprile
Trascrizione: Francesco Fiorentini
Anno: 2026
Download: Il codice e’ stato corretto in diversi parti perché presentava errori.

Istruzioni:
Disegnerò un esagono come questo, con dei puntini agli angoli.
Poi, a turno, tracceremo le linee. Io disegnerò in rosso e tu in bianco.
La prima persona a disegnare un triangolo del proprio colore con un punto in ogni angolo perde. In questo disegno, io ho un triangolo e tu no, quindi ho perso.
Usa i tasti freccia finché la linea che vuoi non lampeggia, poi premi INVIO.
Premi SPAZIO se vuoi che inizi io.




Come sempre, qui di seguito trovate il codice ottimizzato per essere copiato direttamente sul vostro BBC Micro oppure su un emulatore. Il nostro consiglio é quello di utilizzare BeebEm.
Una volta avviato BeebEm non dovrete far altro che copiare il listato sottostante ed incollarlo sull’emulatore tramite: Edit -> Paste. Dopodiché digitate RUN ed il gioco é fatto!
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.
Listato: Hexangle – BBC Micro – Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363 10 ENVELOPE 2,144,2,44,29,113,105,220,57,-25,-94,-42,123,57:SOUND 17,2,100,255
20 REM HEX
30 REM COPYRIGHT (C) P.R. BALCH
40 REM ANALOGUE INFORMATION SYSTEMS
50 REM 1982
60 REM
70 REM ======================
80
90 DIM PX(6),PY(6),VX(6),VY(6)
100 DIM LIN%(6,6)
110 PROCINIT
120 :
130 REM PRINT THE RULES
140 :
150 MODE 4
160 VDU 19,0,4,0,0,0
170 VDU 19,2,1,0,0,0
180 VDU 19,1,0,0,0,0
190 PRINT TAB(10,7);"H E X A N G L E"
200 PRINT TAB(10,8);"==============="
210 PRINT TAB(1,11);"Do you want the Rules";
220 INPUT S$
230 VDU 23;8202;0;0;0;0
240 IF LEFT$(S$,1)="y" OR LEFT$(S$,1)="Y" THEN PROCRULES
250 PRINT TAB(1,14);"(E:easy I:intemediate D:difficult)"
260 PRINT TAB(1,13);"What level of difficulty";
270 INPUT S$
280 DIFF%=2
290 IF LEFT$(S$,1)="E" THEN DIFF%=0
300 IF LEFT$(S$,1)="I" THEN DIFF%=1
310 MODE 5
320 :
330 VDU 23;8202;0;0;0;0;
340 :
350 REM START OF NEW GAME
360 :
370 REM DRAW THE BOARD
380 :
390 PROCDRAWBOARD
400 START%=0
410 FOR A%=1 TO 6
420 FOR B%=1 TO 6
430 LIN%(A%,B%)=0
440 NEXT
450 NEXT
460 GOTO 740
470 :
480 REM IF I HAVE WON
490 :
500 REM I WIN
510 PRINT TAB(6,3);"I Win "
520 ENVELOPE 2,28,-108,-17,-19,61,76,193,-63,-117,-1,-50,107,74:SOUND 17,2,100,255
530 PROCDRAWTRIAN
540 MYSCORE=MYSCORE+1
550 GOTO 670
560 :
570 REM IF THE HUMAN HAS WON
580 :
590 REM YOU WIN
600 PRINT TAB(6,3);"You Win "
610 ENVELOPE 2,1,4,-4,4,10,20,10,127,0,0,-5,126,126:SOUND 17,2,100,255
620 PROCDRAWTRIAN
630 YOURSCORE=YOURSCORE+1
640 :
650 REM WRITE THE SCORE
660 :
670 IF YOURSCORE>MYSCORE THEN PRINT TAB(3,30);YOURSCORE;" - ";MYSCORE;" to YOU"
680 IF YOURSCORE<MYSCORE THEN PRINT TAB(3,30);MYSCORE;" - ";YOURSCORE;" to Me"
690 IF YOURSCORE=MYSCORE THEN PRINT TAB(3,30);MYSCORE;" Each "
700 GOTO 350
710 :
720 REM DO THE HUMAN'S MOVE
730 :
740 REM YOUR MOVE
750 PROCGETMOVE
760 IF A%=0 THEN 810
770 LIN%(A%,B%)=2
780 PROCDRAWLINE(A%,B%,3)
790 PROCTRIANGLE(2)
800 IF WIN%=1 THEN 500
810 START%=START%+1
820 :
830 REM DO MY MOVE
840 :
850 PROCCHOOSEMYMOVE
860 PROCDRAWLINE(T%,U%,2)
870 LIN%(T%,U%)=1
880 PROCTRIANGLE(1)
890 IF WIN%=1 THEN 600
900 GOTO 740
910 REM ================
920 DEF PROCRULES
930 :
940 REM PRINT THE RULES
950 :
960 CLS: PRINT TAB(0,1)
970 ENVELOPE 2,20,25,5,-30,88,217,41,67,-51,-2,-14,127,34:SOUND 17,2,100,25
980 PRINT "I will draw a hexagon like this with"
990 PRINT "dots at the corners."
1000 PRINT TAB(14,15);"o";TAB(23,15);
1010 PRINT"o";TAB(14,29);"o"
1020 PRINT TAB(23,29);"o";TAB(9,22);
1030 PRINT"o";TAB(28,22);"o"
1040 GCOL 0,1
1050 FOR I=1 TO 5
1060 FOR J=I+1 TO 6
1070 MOVE PX(I),PY(I): DRAW PX(J),PY(J)
1080 NEXT
1090 NEXT
1100 A=INKEY(500)
1110 PRINT TAB(0,4);"Then we will take turns to draw in"
1120 PRINT "the lines. I will draw in Red and"
1130 PRINT "you will draw in White."
1140 GCOL 0,3
1150 MOVE PX(5),PY(5): DRAW PX(2),PY(2)
1160 DRAW PX(4),PY(4): DRAW PX(6),PY(6)
1170 GCOL 0,2
1180 MOVE PX(1),PY(1): DRAW PX(3),PY(3)
1190 DRAW PX(4),PY(4): DRAW PX(1),PY(1)
1200 A=INKEY(1000)
1210 PRINT "The first person to draw a triangle of"
1220 PRINT "his or her own colour with a dot at"
1230 PRINT "each corner loses. In this drawing,"
1240 PRINT "I have a triangle and you haven't so"
1250 PRINT "I have lost."
1260 A=INKEY(1000)
1270 PRINT "Use the arrow keys until the line you"
1280 PRINT "want flashes then press RETURN. Press"
1290 PRINT "SPACE if you want me to go first."
1300 A=INKEY(10000): CLS
1310 ENDPROC
1320 REM ============================================
1330 DEF PROCINIT
1340 :
1350 REM INITIALISE VARIOUS THINGS
1360 :
1370 REM THE COORDINATES OF THE
1380 REM BOARD IN THE RULES
1390 :
1400 PX(1)=300: PY(1)=300
1410 PX(2)=464: PY(2)=526
1420 PX(3)=750: PY(3)=526
1430 PX(4)=908: PY(4)=300
1440 PX(5)=750: PY(5)=76
1450 PX(6)=464: PY(6)=76
1460 :
1470 REM THE COORDINATES OF THE
1480 REM MAIN BOARD
1490 :
1500 VX(1)=160: VY(1)=494
1510 VX(2)=416: VY(2)=844
1520 VX(3)=862: VY(3)=844
1530 VX(4)=1112: VY(4)=494
1540 VX(5)=862: VY(5)=140
1550 VX(6)=416: VY(6)=140
1560 :
1570 REM THE SCORES
1580 :
1590 MYSCORE=0
1600 YOURSCORE=0
1610 ENDPROC
1620 REM ============================================
1630 DEF PROCDRAWBOARD
1640 :
1650 REM DRAW THE MAIN BOARD
1660 :
1670 VDU 19,0,4,0,0,0
1680 VDU 19,2,1,0,0,0
1690 VDU 19,1,0,0,0,0
1700 COLOUR 3
1710 :
1720 REM DRAW THE DOTS
1730 :
1740 PRINT TAB(6,5);"O";TAB(13,5);
1750 PRINT"O";TAB(17,16);"O"
1760 PRINTTAB(6,27);"O";TAB(13,27);
1770 PRINT"O";TAB(2,16);"O"
1780 :
1790 REM DRAW THE LINES IN BLACK
1800 :
1810 GCOL 0,1
1820 FOR I=1 TO 5
1830 FOR J=I+1 TO 6
1840 MOVE VX(J),VY(J)
1850 DRAW VX(I),VY(I)
1860 NEXT
1870 NEXT
1880 ENDPROC
1890 REM ===========================================
1900 DEF PROCGETMOVE
1910 :
1920 REM GET THE HUMAN'S MOVE
1930 :
1940 VDU 19,4,10,0,0,0
1950 PRINT TAB(6,3);"Your Move"
1960 ENVELOPE 2,24,15,29,34,19,37,194,0,89,-78,-114,68,69:SOUND 17,2,100,255
1970 FOR J=1 TO 1000: NEXT
1980 :
1990 REM CYCLE THROUGH EACH LINE
2000 REM WHEN AN ARROW KEY IS PRESSED
2010 REM MEANWHILE FLASH THE CURSOR
2020 :
2030 A%=1: B%=1: I=1
2040 IF A%>B% THEN 2190
2050 IF A%>B% OR LIN%(A%,B%)>0 THEN 2190
2060 D=3: E=10
2070 PROCDRAWLINE(A%,B%,D)
2080 IF INKEY(-26) THEN I=1:GOTO 2160
2090 IF INKEY(-122) THEN I=-1:GOTO 2160
2100 IF INKEY(-74) THEN 2310
2110 IF INKEY(-99) AND START%=0 THEN PROCDRAWLINE(A%,B%,1): A%=0:GOTO 2310
2120 E=E-1: IF E>0 THEN GOTO 2070
2130 D=D-1: E=5
2140 GOTO 2070
2150 :
2160 PROCDRAWLINE(A%,B%,1)
2170 IF I=1 THEN ENVELOPE 2,23,19,37,-70,178,245,232,-2,29,-10,-117,101,34:SOUND 17,2,100,255
2180 IF I=-1 THEN ENVELOPE 2,135,-47,74,66,240,43,136,-106,-17,-74,-62,121,70:SOUND 17,2,100,255
2190 B%=B%+I
2200 IF B%=7 THEN B%=1:GOTO 2230
2210 IF B%=0 THEN B%=6:GOTO 2230
2220 GOTO 2040
2230 A%=A%+I
2240 IF A%=7 THEN A%=1
2250 IF A%=0 THEN A%=6
2260 GOTO 2040
2270 :
2280 REM THIS IS THE LINE CHOSEN
2290 REM MAKE SURE A%<B%
2300 :
2310 IF A%>B% THEN C=A%: A%=B%: B%=C
2320 ENVELOPE 2,6,56,-15,-87,133,99,158,9,-20,-49,-50,123,79:SOUND 17,2,100,255
2330 ENDPROC
2340 REM ============================================
2350 DEF PROCDRAWLINE(A,B,C)
2360 :
2370 REM DRAW THE LINE FROM A TO B
2380 REM IN COLOUR C
2390 :
2400 GCOL 0,C
2410 MOVE VX(A),VY(A)
2420 DRAW VX(B), VY(B)
2430 ENDPROC
2440 REM ============
2450 DEF PROCTRIANGLE(C)
2460 :
2470 REM LOOK FOR A TRIANGLE
2480 REM OF COLOUR C
2490 :
2500 WIN%=0
2510 FOR AX=1 TO 4
2520 FOR BX=AX+1 TO 5
2530 IF LIN%(AX,BX)<>C THEN 2600
2540 FOR CX=BX+1 TO 6
2550 IF LIN%(AX,CX)<>C THEN 2590
2560 IF LIN%(BX,CX)<>C THEN 2590
2570 TA=AX: TB=BX: TC=CX
2580 WIN%=1
2590 NEXT
2600 NEXT
2610 NEXT
2620 ENDPROC
2640 REM ============
2650 DEF PROCDRAWTRIAN
2660 :
2670 REM DRAW THE WINNING TRIANGLE
2680 REM IN AMAZING COLOURS
2690 :
2700 PROCDRAWLINE(TB,TC,3)
2710 PLOT 86,VX(TA),VY(TA)
2720 FOR I=1 TO 15
2730 FOR C=0 TO 7
2740 PROCDRAWLINE(TA,TB,C)
2750 PROCDRAWLINE(TA,TC,C)
2760 PROCDRAWLINE(TB,TC,C)
2770 NEXT
2780 NEXT
2790 PLOT 86,VX(TA),VY(TA)
2800 ENDPROC
2810 REM ============
2820 DEF PROCCHOOSEMYMOVE
2830 :
2840 REM CHOOSE MY BEST MOVE
2850 :
2860 PRINT TAB(6,3);"My Move "
2870 IF START%>1 THEN 2990
2880 :
2890 REM MY FIRST MOVE IS RANDOM
2900 :
2910 T%=RND(5)
2920 U%=RND(6)
2930 IF U%<T% THEN 2910
2940 IF LIN%(T%,U%)>0 THEN 2910
2950 ENDPROC
2960 :
2970 REM OTHER MOVES NEED MORE THOUGHT
2980 :
2990 BEST%=-30000
3000 :
3010 REM CONSIDER EACH LINE IN TURN
3020 :
3030 FOR X%=1 TO 5
3040 FOR Y%=X%+1 TO 6
3050 IF LIN%(X%,Y%)>0 THEN 3470
3060 PROCDRAWLINE(X%,Y%,15)
3070 ENVELOPE 2,5,21,19,38,31,105,12,85,13,-35,-53,99,42:SOUND 17,2,100,255
3080 S% = 0
3090 :
3100 REM TRY IT FIRST IN MY COLOUR
3110 :
3120 LIN%(X%,Y%) = 1
3130 PROCTRIANGLE(1)
3140 IF WIN% = 1 THEN S% = -10000: GOTO 3160
3160 IF DIFF% = 0 THEN 3350
3170 IF DIFF% = 1 AND RND(3) = 1 THEN S% = S% + 1
3180 GOTO 3350
3190 :
3200 REM IS IT BAD FOR THE HUMAN?
3210 :
3220 LIN%(X%,Y%) = 2
3230 PROCTRIANGLE(2)
3240 IF WIN% < 1 THEN 3310
3250 S% = S% - 9
3260 IF START% < 4 THEN S% = S% - 2
3270 :
3280 REM RED,RED,WHITE TRIANGLES
3290 REM ARE GOOD
3300 :
3310 FOR J% = 1 TO 6
3320 IF X% = J% OR Y% = J% THEN 3340
3330 IF LIN%(X%,J%) + LIN%(Y%,J%) + LIN%(J%,Y%) = 3 THEN S% = S% + 3
3340 NEXT
3350 LIN%(X%,Y%) = 0
3360 :
3370 REM IF IT'S BETTER THAN THE
3380 REM BEST SO FAR THEN
3390 REM REMEMBER IT
3400 :
3410 IF S% < BEST% THEN 3460
3420 IF S% = BEST% AND RND(2) > 1 THEN 3460
3430 BEST% = S%
3440 T% = X%
3450 U% = Y%
3460 PROCDRAWLINE(X%,Y%,1)
3470 NEXT
3480 NEXT
3490 ENDPROC
3500 REM = = = = = = = = = = = = = = = = = = = = =
3510 DEF PROCCOUNTBAD(F%)
3520 :
3530 REM COUNT THE NUMBER OF LINES
3540 REM THAT FX CAN'T PLAY
3550 :
3560 FOR G% = 1 TO 5
3570 FOR H% = G% + 1 TO 6
3580 IF LIN%(G%,H%) > 0 THEN 3630
3590 LIN%(G%,H%) = F%
3600 PROCTRIANGLE(F%)
3610 IF WIN% = 1 THEN S% = S% - 1
3620 LIN%(G%,H%) = 0
3630 NEXT
3640 NEXT
3650 ENDPROC
