Hexangle – BBC Micro – Basic

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 ‘&gt’ e ‘&lt’. 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

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.