Switchbox – Amiga – AmigaBASIC

Rivista: Compute! – Numero: 70 – Anno 1986- Listato di: Philip I. Nelson

Dopo una serie di listati per computer ad 8 bit, eccone finalmente uno per un computer a 16 bit, il Commodore Amiga.

Questa volta vi presento un gioco di strategia che sembra facile inizialmente, ma richiede del tempo per essere padroneggiato perché permette di adottare diverse strategie. Il programma era originalmente scritto per il Commodore 128, questa che vi trovate di fronte é la versione Amiga con parlato, grafica a colori ed effetti sonori stereofonici.

Nella rivista sono presenti altre versioni del gioco per i seguenti computer: Commodore 128, Commodore 64, Apple II, computer Atari a otto bit, IBM PC/PCjr, Atari 520ST ed ovviamente Amiga. Se qualcuno volesse aiutarci digitando uno di questi altri listati, saremmo lieti di ospitarlo nel nostro sito.

Il listato originale é stato pubblicato sulla rivista inglese Compute! Numero 70 del Marzo 1986 – Vol. 8, No. 3.

Titolo: Switchbox
Piattaforma: Commodore Amiga
Linguaggio: AmigaBASIC
Versione originale: Philip I. Nelson
Pubblicazione: Compute! Issue 70 March 1986 – Vol. 8, No. 3
Anno: 1986
Trascrizione: Francesco Fiorentini
Anno: 2022
Download: switch.zip contenente il file switch.ADF
Download: SwitchBox.adf.zip ADF bootable contenente AmigaBASIC
Note: Il gioco funziona con l’AmigaBasic di Microsoft e non con l’Abasic. Lo schermo deve essere impostato ad 80 colonne (Prefs -> Preferences)

Istruzioni
Utilizzate i tasti numerati dall’1 all’8 per far scendere le palline nei percorsi corrispondenti.
Il tasto ‘-‘ (meno) per passare la mano al vostro avversario.
Il tasto ‘+’ (piú) per far cadere una pallina in un percorso random.
Il gioco é inteso per due giocatori umani, il computer non controlla nessuno dei giocatori. Niente vieta comunque di usare il tasto ‘+’ (piú) con un giocatore per farlo giocare in modo casuale.
Buon divertimento!

Giocare a “Switchbox” è come posizionare le tessere di un domino in posizione per una reazione a catena: o le metti in posizione o le fai cadere. Vincere richiede abilità e la pianificazione di quando andare per i punti e quando stare fermi ed aspettare una tavola migliore. L’obiettivo è semplice: devi segnare più punti del tuo avversario facendo cadere le palle in una scatola piena di interruttori a due vie.
Ogni interruttore ha un deviatore e una piattaforma. Se la palla atterra su una piattaforma vuota, si ferma, ma se colpisce un deviatore, inverte l’interruttore e continua. In molti casi far cadere una singola palla crea un effetto a cascata: una palla ne mette in moto un’altra, che ne mette in moto altre, ecc…

Qui di seguito trovate il codice ottimizzato per essere copiato su un file di testo ed essere scritto su un file ADF utilizzando il programma ADF Opus.

Se invece siete ansiosi di provare il gioco su un Amiga reale o su un emulatore, suggerisco WinUAE, scaricate il file switch.zip contenente il file switch.ADF e seguite queste istruzioni:
– Avviate AmigaBASIC (vi ricordo che AmigaBASIC si trova nel disco Extras del Workbench)
– Dal menú Project, scegliete la voce Open
– Nella finestra Name of program to load: digitate df2:switch.bas (df<x> é il drive dell’Amiga dove avete inserito il dischetto, nel mio caso <df2> perché ho usato il terzo drive)
– Attendete il caricamento del programma e poi dal menú Run scegliete la voce Start
Buon divertimento!

PS – Se incontrate difficoltá ad utilizzare ADF Opus, WinUAE o l’AmigaBASIC, scriveteci: saremo lieti di aiutarvi!

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: Switchbox – Commodore Amiga – AmigaBASIC


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
'Switchbox for 512K Amiga
'Set Preferences for 80 columns
Restart:
CLEAR:GOSUB Setup
Main:
FOR Round=1 TO 4
PUT (80,7+Round*8),Ball
PUT (515,7+Round*8),Ball
GOSUB Values
SAY TRANSLATE$(Intro$(Round))
Keepgoing:
Who=1-Who 'alternate players
GOSUB Taketurn
IF SC(1-Who,Round)=>Points(Round,0) THEN Nextround
GOTO Keepgoing
Nextround:
FOR j=0 TO 1:FOR k=5 TO 8
SC(j,k)=0:NEXT:NEXT
FOR j=0 TO 1:FOR k=1 TO 4
gx=Points(k,0):ac=SC(j,k)
SC(j,5)=SC(j,5)+ac
SC(j,6)=SC(j,6)-(ac=>gx)*gx
SC(j,7)=SC(j,7)+SC(j,k)-SC(1-j,k)
NEXT:NEXT
FOR j=0 TO 1:FOR k=6 TO 7
SC(j,k)=SC(j,k)+SC(j,5)
NEXT:NEXT
FOR j=0 TO 1:FOR k = 5 TO 7
SC(j,8)=SC(j,8)+SC(j,k)
NEXT:NEXT
FOR j=0 TO 1
FOR k=5 TO 8:y$=STR$(SC(j,k))
x=LEN(y$):tx=8+j*64-x:ty=4+k
LOCATE ty,tx-1:PRINT SPACE$(2)
LOCATE ty,tx:PRINT y$
NEXT:NEXT
NEXT Round
Gohome:
LINE (240,70)-(362,100),2,bf
LOCATE 11,32:PRINT " Play again? "
text$=Who$(ABS(SC(1,8)>SC(0,8)))
text$=text$+" wins this game..."
text$=text$+"How about another?"
SAY TRANSLATE$(text$),Voice%
FOR j=0 TO 10:x$=INKEY$:NEXT
Again:
x$=INKEY$:IF x$="" THEN Again
SAY TRANSLATE$("OK."),Voice%
IF x$="y" OR x$="Y" THEN WINDOW CLOSE 2:GOTO Restart
SAY TRANSLATE$("Bye-bye."),Voice%
WINDOW CLOSE 2
END
Taketurn:
FOR j=0 TO nb:LB(j,0)=0:NEXT:nb=1
SAY TRANSLATE$(Who$(Who)+CHR$(46))
PUT (140,5),Larrow:PUT (440,5),Rarrow
FOR j=0 TO 9:x$=INKEY$:NEXT
Getkey:
a$=INKEY$:IF a$="-"THEN RETURN
IF a$="+" THEN a$=STR$(INT(RND(1)*8+1))
a=VAL(a$):IF (a<1) OR (a>8) THEN Getkey
LB(0,0)=1
FOR j=1 TO 3:LB(0,j)=0:NEXT
LB(0,4)=a+3
Moreballs:
ex=1:FOR j=0 TO nb
IF LB(j,0) THEN ex=0:GOSUB Moveone
NEXT:IF ex=0 THEN Moreballs
x=0:FOR j=13 TO 7 STEP -3:FOR k=x TO 15-x
PUT (Column(k),Row(j)+1),Blank,AND
NEXT:x=x+1:NEXT:RETURN
Moveone:
dy=LB(j,0):dx=LB(j,1):LY=LB(j,2)
ny=LB(j,3):nx=LB(j,4)
IF ny THEN
PUT (Column(nx),Row(ny+(LY*3))+1),Blank,AND
END IF
LB(j,3)=(ny+1) MOD 3
ON ny+1 GOTO Pos0,Pos1,Pos2
Pos0:
IF LY>4 THEN LB(j,0)=0:GOTO Score
vx=0:GOSUB Whichway
IF (SW(wx,wy,1)) AND (SW(wx,wy,0)=sd) THEN
vx=1-2*sd:LB(j,3)=ny+1:LB(j,4)=nx+vx
GOTO Putball
END IF
IF SW(wx,wy,0)=sd THEN
LB(j,0)=0
SW(wx,wy,1)=1:ny=ny+1
GOTO Putball
END IF
LB(j,3)=ny+1:GOTO Putball
Pos1:
LB(j,1)=0:LB(j,4)=nx+dx:GOTO Putball
Pos2:
LB(j,2)=LY+1:GOSUB Whichway
SW(wx,wy,0)=1-SW(wx,wy,0)
IF SW(wx,wy,1) THEN
PUT(Column(LB(j,4)+1-sd*2),Row(ny+(LY*3))),Blank,AND
LB(nb,0)=1:LB(nb,1)=0:LB(nb,2)=LY
LB(nb,3)=0:LB(nb,4)=nx+1-sd*2:nb=nb+1
SW(wx,wy,1)=0
END IF
sx=Xpos(wx,wy):sy=Ypos(wx,wy)
wp=SW(wx,wy,0)
'Always fall thru TO Switch
Switch:
PUT(sx,sy),Swblank,AND
ON wp+1 GOTO Left,Right
Left:
PUT(sx,sy),Lswitch,OR:GOTO Bop
Right:
PUT(sx,sy),Rswitch,OR
Bop:
SOUND 100,1,64,Who
SOUND 250,1,64,3-Who
RETURN
Putball:
SOUND INT(RND(1)*10)*(30*LY)+200,1,64,Who
PUT (Column(nx),Row(ny+(LY*3)+1)),Ball,OR
RETURN
Whichway:
wx=LY:wy=INT((nx +LY-4)/2):sd=(nx+LY) AND 1:RETURN
Score:
sf=Points(Round,nx+1):sg=SC(Who,Round)+sf
tx=8+63*Who+(sg>9)+(sg>99)+(sg>999)
ty=2+Round:a$=MID$(STR$(sg),2)
LOCATE ty,tx:PRINT a$
SC(Who,Round)=sg
FOR j=1600 TO 200 STEP -300
SOUND j,1,64,Who
SOUND j+400,1,64,3-Who
NEXT:RETURN
Values:
FOR j=0 TO 1
k=2+70*j:LOCATE 15,k
PRINT SPACE$(3):LOCATE 15,k
PRINT RIGHT$(STR$(Points(Round,0)),3)
NEXT
FOR j=1 TO 16:k=Points(Round,j)
m=6+j*3.75
IF k>9 THEN
x=INT(k/10)
x$=MID$(STR$(x),2,1)
ELSE
x$=CHR$(32)
END IF
LOCATE 22,m:PRINT x$;
LOCATE 23,m:PRINT RIGHT$(STR$(k),1);
NEXT:RETURN
Setup:
RANDOMIZE TIMER
DIM Voice%(8)
FOR j=0 TO 8
READ Voice%(j):NEXT
DATA 110,0,150,0,22200,64,10,1,0
Greet$="Hi. Welcome to Switchbox."
PRINT Greet$
SAY TRANSLATE$(Greet$),Voice%
SCREEN 2,640,200,2,2
PALETTE 0, 0, 0, 0
PALETTE 1, 1, 1, 1
PALETTE 2, 0, .1, .7
PALETTE 3, 1, 1, .13
WINDOW 2,"Switchbox",,0
DIM Larrow(30),Rarrow(30),Wav%(255),Lefthunk(400)
DIM Righthunk(400),Swblank(100),Rswitch(200)
DIM Lswitch(200),Column(16),Row(25)
DIM Blank(70),Ball(60),Piece(80)
DIM SW(8,8,1),LB(32,4),Points(4,16),SC(1,8)
FOR j=0 TO 10:LINE (0,5)-(10,j),3
NEXT
LINE (10,3)-(20,7),3,bf
GET (0,0)-(20,10),Larrow
PUT (0,0),Larrow
FOR j=0 TO 10
LINE (20,5)-(10,j),3
NEXT
LINE (0,3)-(10,7),3,bf
GET (0,0)-(20,10),Rarrow
PUT (0,0),Rarrow
GET (8,2)-(22,9),Blank
CIRCLE (15,4),7,1
PAINT (16,4),1
GET (8,0)-(22,9),Ball
PUT (8,0),Ball
FOR j=0 TO 127:Wav%(j)=-127
Wav%(j+125)=127:NEXT
FOR j=0 TO 3:WAVE j,Wav%
NEXT
DATA 10,"round 1. equal scores."
DATA 2,2,2,2,2,2,2,2
DATA 40,"round2. fibonachie seequence."
DATA 1,2,3,5,8,13,21,34
DATA 20,"Round 3. arithmetic seequence."
DATA 2,3,4,5,6,7,8,9
DATA 80,"Round 4. seequence of squares."
DATA 1,4,9,16,35,36,49,64
FOR j=1 TO 4:READ Points(j,0)
READ Intro$(j)
FOR k=1 TO 8:READ x
Points(j,k+8)=x:Points(j,9-k)=x
NEXT k:NEXT j
a=215:b=2
FOR j=0 TO 4
a=a-30:b=b+30
FOR k=0 TO j+3
Xpos(j,k)=a+k*60
Ypos(j,k)=b
NEXT:NEXT
k=0
FOR j=70 TO 520 STEP 30
Column(k)=j
k=k+1:NEXT
k=0
FOR j=4 TO 154 STEP 10
Row(k)=j:k=k+1:NEXT
Start:
SAY TRANSLATE$("First player's name?"),Voice%
INPUT "Name of Player 1";p0$
SAY TRANSLATE$("Second player's name?"),Voice%
INPUT "Name of Player 2";p1$
Who$(0)=LEFT$(p0$,6):Who$(1)=LEFT$(p1$,6)
text$=Who$(0)+" plays "+Who$(1)+". Is this correct"
PRINT text$;
SAY TRANSLATE$(text$),Voice%
INPUT query$:an$=LEFT$(query$,1)
IF LEN(an$)=0 OR an$="y" OR an$="Y" THEN Draw
GOTO Start
Draw:
SAY TRANSLATE$("OK."),Voice%
CLS
LOCATE 1,6:PRINT Who$(0)
LOCATE 1,66:PRINT Who$(1)
x=4:FOR j=0 TO 1 'score boxes
LINE (x,12)-(x+110,60),2,bf'shadow
LINE (x+6,10)-(x+120,58),3,bf'outline
LINE (x+16,14)-(x+110,48),0,bf'inside
x=x+480:NEXT
x=1:FOR j=24 TO 50 STEP 3.7
LOCATE 2,j:PRINT x
x=x+1:NEXT
LINE (180,0)-(182,40),,bf
GET (180,0)-(182,40),Piece
LINE (180,0)-(420,0)
FOR j=210 TO 420 STEP 60
LINE (j,0)-(j+2,12),,bf
PUT (j,40),Piece
PUT (j,100),Piece
NEXT
FOR j=180 TO 420 STEP 60
PUT (j,0),Piece,OR
PUT (j,70),Piece
PUT (j,126),Piece
NEXT
PUT (120,126),Piece
PUT (150,100),Piece
PUT (460,100),Piece
PUT (480,126),Piece
ERASE Piece 'reclaim memory
FOR j=30 TO 570 STEP 30
LINE (j,155)-(j+2,170),1,bf
NEXT
LINE (176,4)-(186,32),2,bf
LINE (416,4)-(426,32),2,bf
LINE (176,32)-(156,42),2
LINE STEP(0,0)-STEP(-10,0),2
LINE STEP(0,0)-STEP(35,-32),2
PAINT (175,31),2
LINE (426,32)-(446,42),2
LINE STEP(0,0)-STEP(10,0),2
LINE STEP(0,0)-STEP(-36,-32),2
PAINT (427,32),2
GET (136,12)-(186,69),Lefthunk
GET (416,12)-(456,62),Righthunk
l=106:r=446:k=42
FOR j=1 TO 4
PUT (l,k),Lefthunk,OR
PUT (r,k),Righthunk,OR
l=l-30:r=r+30:k=k+30
NEXT
ERASE Lefthunk,Righthunk
LINE (26,153)-(36,165),2,bf
LINE (564,153)-(576,165),2,bf
GET (245,32)-(299,40),Swblank
FOR j=0 TO 18
LINE (270+j,40)-(280+j,32),3
NEXT
LINE (245,39)-(280,40),3,bf
GET (245,32)-(298,40),Rswitch
PUT (184,32),Swblank,AND
FOR j=0 TO 20
LINE (184+j,32)-(193+j,40),3
NEXT
LINE (193,39)-(236,40),3,bf
GET (184,32)-(236,40),Lswitch
FOR m=0 TO 4:FOR n=0 TO m+3
sx=Xpos(m,n):sy=Ypos(m,n)
wp=INT(RND(1)*2)
SW(m,n,0)=wp
SW(m,n,1)=0
Who=1-Who:GOSUB Switch
NEXT n:NEXT m
PUT (140,5),Larrow
RETURN

Share

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.