Rivista: PC Personal Computer – Anno: 1984 – Numero: 1 – Trascrizione: Francesco Fiorentini
Primo listato della rivista PC Personal Computer anno II numero 1:
https://www.retromagazine.net/pc-personal-computer-club-anno-ii-numero-1/
Ecco un esempio di un gioco di simulazione scritto in Basic: simulazione di un mercato competitivo come quello dell’automotive!
Il programma in oggetto usa la competizione tra tre compagnie, ma il dato non è critico e può essere cambiato molto facilmente. Non esiste una «fine» del programma, esso può andare avanti quanto volesse, ed anche qui è abbastanza facile mettere una fine quando una «compagnia» va sotto o sopra un certo ammontare di soldi. Ogni turno di gioco rappresenta una settimana di «mercato». In ogni turno il presidente della compagnia deve decidere quanto spendere in pubblicità, quanto in migliorie al prodotto ed infine a quanto vendere l’autovettura (prezzo di vendita al pubblico). Dopo che tutti i presidenti di tutte le compagnie hanno fatto le loro scelte, tocca all’arbitro o all’insegnante dare dei dati esterni alle scelte di ogni compagnia, e cioè: il numero totale di macchine vendute in quella settimana, il costo di produzione di ogni automobile (costi variabili), ed infine i costi fissi (uguali per tutte le compagnie). Se non si vuole un intervento esterno (arbitro, insegnante) o non c’è la persona che lo può fare, potete sostituire alle istruzioni che accettano questi dati delle semplici routine di generazione dei numeri necessari (vedere nei commenti al listato per un esempio di queste routine). Tutti questi dati sono usati da programmazione per calcolare come il pubblico immaginario risponderà e comprerà i prodotti.
Fatti i dovuti calcoli il programma darà parecchie «videos» di risultati. La prima videoa è un sommario di come sono andate tutte le compagnie; vendite, percentuale vecchia e nuova di mercato, prezzi e spese ed infine gli utili. Dopo il sommario ci saranno, per ogni compagnia, risultati dettagliati della settimana, comprendenti i particolari delle spese e delle entrate, oltre naturalmente alle tasse (molto alte: 50%, ma ovviamente potete intervenire anche qui per rendere la simulazione più reale).
Dopo qualche settimana, utile per capire come i costi fissi ed il prezzo di vendita incidono sul profitto, provate a giocare con le opzioni presenti nel programma per simulare gli effetti di una recessione, oppure un aumento dei costi fissi dovuto ad una guerra che fa lievitare il costo dell’energia…
Ultimo ma sicuramente altrettanto interessante, potete modificare il programma per renderlo sempre piu’ realistico: il costo variabile delle auto e’ il solito per tutte le compagnie, decisamente irreale…
Nota: interessante la subroutine dalla riga 6000 per formattare i valori numerici in formato valuta!

Titolo: Compagnie automobilistiche
Piattaforma: Commodore 64
Linguaggio: Basic
Versione originale: N/A
Pubblicazione: PC Personal Computer
Anno: 1984, numero 1
Trascrizione: Francesco Fiorentini
Anno: 2026
Note: Il programma e’ stato modificato per adattarlo alle 40 colonne del Commodre 64.

Istruzioni
Pochi dati da fornire al programma che poi calcolera’ per noi i risultati settimanali della nostra gestione.
Buon divertimento!
Qui di seguito trovate il codice da copiare sul vostro Commodore 64.
Il codice originale é modificato per essere copiato su CBM prg Studio. Gli Screen Codes presenti nel listato originale, sono stati manualmente sostituiti da quelli standard utilizzati da CBM prg Studio.
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori direttamente su CBM prg Studio.
Listato: Compagnie automobilistiche – Commodore 64 – Basic V2
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 1000 rem programma per simulare un mercato competitivo
1010 dim os(3),ns(3),co$(3),cn$(3),tp(3),wp(3),ac(3),qc(3)
1020 dim sp(3),cs(3),mf(3),ts(3)
1030 we=0
1031 print chr$(147): poke 53280,0: poke 53281,0:poke 646,7
1040 input "numero di giocatori (da 1 a 3)";no
1050 input "stessa % di mercato ";m$
1060 mt=0
1070 for i=1 to no
1075 print: print "giocatore "; i
1080 input "> nome compagnia";co$(i)
1090 input "> nome automobile";cn$(i)
1100 if left$(m$,1)="s" then 1140
1110 input "% di mercato (10% = .10)";os(i)
1120 mt=mt+os(i)
1130 goto 1150
1140 mt=1: os(i)=1/no
1150 tp(i)=0: ts(i)=0 :next i
1160 if mt>.98 and mt<1.02 then 1190
1170 print "ci deve essere un errore,"
1180 print "perche' la percentuale totale "
1185 print "non e' 100%, ma ";mt*100; "%"
1190 we=we+1: print "{clear} {down*3} inizio settimana n.";we
1340 rem prende gli input di questa settimana
1350 ps=0 :ta=0 : tq=0 : sf=1e-20
1390 print "{clear} {down*4}"
1400 for i=1 to no
1410 print "compagnia ";co$(i)
1460 input "> prezzo di vendita ";sp(i)
1470 input "> pubblicita ";ac(i)
1480 input "> migliorie ";qc(i)
1490 print: ps=ps+sp(i)
1510 ta=ta+ac(i) : rem totale pubblicita'
1520 tq=tq+qc(i)
1530 next i
1540 print"{clear}": input "vendite settimanali";s
1550 input "costi fissi";fc
1560 input "costi variabili";vc
1565 rem prezzo medio
1570 ap=ps/no
1580 rem viene incontrata una certa resistenza dei
1581 rem compratori quando il prezzo medio supera
1582 rem i 10.000 $, e le vendite scendono al di
1583 rem sotto del valore aspettato
1600 if ap>10000 then s=s*10000/ap
1605 rem spese medie in pubblicita'
1610 aa=ta/no
1620 if aa=0 then aa=1
1629 rem spese medie per le migliorie
1630 aq=tq/no
1640 if aq=0 then aq=1
1650 rem
1660 rem calcola il fattore di 'spartizione' del mercato
1670 rem
1680 rem mf=ap/sp+ac/aa+.5*qc/aq
1690 rem questa equazione puo' essere modificata per cambiare
1700 rem il modo in cui il mercato lavora. al momento essa
1710 rem pesa alla stessa maniera il prezzo relativo e le
1720 rem spese in pubblicita'. le migliorie sono considerate
1730 rem la meta' del peso degli altri due fattori. notare
1740 rem anche che la nuova percentuale di mercato e' anche
1750 rem in funzione della vecchia percentuale
1760 rem
1770 rem la presente equazione assume che non importi quanto
1780 rem alto sia il prezzo di vendita, ci saranno sempre
1790 rem dei compratori. se, d'altro canto, voi pensate che
1800 rem ce' siano alcuni prezzi che taglino le vendite, potete
1810 rem sostituire l'equazione nel programma con questa:
1820 rem
1830 rem mf(i)=ac(i)/aa+5*qc(i)/aq-sqr(ap/sp(i))
1840 rem if mf(i)<0 then mf(i)=0
1850 rem
1860 for i=1 to no
1870 mf(i)=(ap/sp(i))+(ac(i)/aa)+(.5*qc(i)/aq)
1880 ns(i)=os(i)*mf(i)
1890 sf=sf+ns(i)
1900 next i
1909 rem tasse al 50 %
1910 tr=.5
1920 rem calcola vendite e profitti
1930 su=0
1940 for i=1 to no
1949 rem normalizza le percentuali al 100%
1950 ns(i)=ns(i)/sf
1960 cs(i)=int(s*ns(i))
1970 su=su+cs(i) :rem aggiusta le vendite totali
1980 ts(i)=ts(i)+sp(i)*cs(i) :rem vendite totali alla data
1990 wp(i)=cs(i)*sp(i)-fc-ac(i)-qc(i)-vc*cs(i)
1999 rem non paga tasse sulle perdite
2000 if wp(i)>0 then wp(i)=int(wp(i)*(1-tr))
2010 tp(i)=tp(i)+wp(i) : rem totale profitti
2060 ns(i)=int(100*ns(i)+.5)
2070 os(i)=int(100*os(i)+.5)
2100 next i
2110 s=su
2160 print "{clear} {down*3} risultati della settimana n.";we
2190 print"{down*2} le vendite totali sono state ";s
2210 print"{down} i costi fissi $.";fc
2220 print"{down} i costi variabili $.";vc;" per auto"
2230 get a$ : if a$="" then 2230
2250 print "{clear}"
2260 print "compagn.";tab(9);co$(1);tab(20);co$(2);tab(31);co$(3)
2270 print "auto ";tab(9);cn$(1);tab(20);cn$(2);tab(31);cn$(3)
2280 print
2290 print "prezzo ";tab(9);sp(1);tab(20);sp(2);tab(30);sp(3)
2310 print "public. ";tab(9);ac(1);tab(20);ac(2);tab(30);ac(3)
2330 print "miglior. ";tab(9);qc(1);tab(20);qc(2);tab(30);qc(3)
2340 print
2350 print "vecchia %";tab(9);os(1);tab(20);os(2);tab(30);os(3)
2370 print "nuova %";tab(9);ns(1);tab(20);ns(2);tab(30);ns(3)
2380 print
2390 print "vendite ";tab(9);cs(1);tab(20);cs(2);tab(30);cs(3)
2410 print "utili ";tab(9);wp(1);tab(20);wp(2);tab(30);wp(3)
2420 print
2430 print "utili tot";tab(9);tp(1);tab(20);tp(2);tab(30);tp(3)
2440 get a$ : if a$="" then 2440
2470 for i=1 to no: print "{clear}"
2500 print "compagnia ";co$(i)
2510 print "nome auto ";cn$(i)
2530 print
2540 print "prezzo di vendita $.";sp(i)
2550 print "pubblicita $.";ac(i)
2560 print "migliorie $.";qc(i)
2570 print
2575 print "vecchia % di mercato ";os(i);"%"
2580 print "nuova % di mercato ";ns(i);"%"
2590 print "vendite ";cs(i);" auto"
2595 get a$: if a$="" then 2595
2610 print "{clear}"
2630 print"bilancio settimanale. settimana n.";we
2640 print
2650 print "entrate"
2660 print "-------"
2670 l=cs(i)*sp(i): gosub 6000
2680 print "dalla vendita $.";tab(32-len(l$));l$
2690 print
2700 print "uscite"
2710 print "------"
2730 l=cs(i)*vc: gosub 6000
2735 print "costo auto $.";tab(32-len(l$));l$
2739 l=ac(i): gosub 6000
2740 print "pubblicita $.";tab(32-len(l$));l$
2745 l=qc(i): gosub 6000
2750 print "migliorie $.";tab(32-len(l$));l$
2755 l=fc: gosub 6000
2760 print "costi fissi $.";tab(32-len(l$));l$
2770 print " ============="
2780 tx=0
2790 if wp(i)>0 then tx=wp(i)*tr/(1-tr)
2800 te=cs(i)*vc+ac(i)+qc(i)+fc
2810 l=te: gosub 6000
2830 print " totale $.";tab(32-len(l$));l$:print
2835 l=wp(i)+tx: gosub 6000
2840 print "utili lordi $.";tab(32-len(l$));l$
2850 l=tx: gosub 6000
2870 print "tasse $."; tab(32-len(l$));l$
2880 l=wp(i): gosub 6000
2890 print "utili settim. $."; tab(32-len(l$));l$
2900 print " ============="
2930 print: l=tp(i): gosub 6000
2940 print "utili totali $."; tab(32-len(l$));l$
2950 print "fatturato totale $.";:l=ts(i):gosub 6000
2955 printtab(32-len(l$));l$:print
2970 print "margine guadagno del ";int(100*tp(i)/ts(i));"%"
3010 get a$: if a$="" then 3010
3015 if ns(i)=0 then ns(i)=1
3020 os(i)=ns(i)/100: next i
3040 goto 1190
6000 l$=str$(l): l1=len(l$)
6002 if l1<3 then 6010
6004 if mid$(l$,l1-3,1)="e" then return
6010 if l$=" " or l$="-" then l$=l$+"0"
6020 l1=len(l$): if l1<5 then 6060
6030 l1=l1-3: if l1>4 then 6030
6040 l2$=l$: l$=left$(l$,l1): l1=l1+1: for l1=l1 to len(l2$) step 3
6050 l$=l$+"."+mid$(l2$,l1,3): next
6060 return
