function prob_monopol(lanci,carte,triplo,azione,FIG); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Programma per determinare la PROBABILITA' di accesso ai vari terreni % %% del gioco da tavolo MONOPOLI (Editrice Giochi) % %% Scritto da Fabio Blasizzo ciubexx@inwind.it nel 01/10/1999 % %% homepage: http://www.geocities.com/blasizzo/fabio/fabio.html % %% % %% >>> ANALISI PROBABILISTICA <<< % %% % %% NOME FILE: prob_monopol.m % %% SINTASSI : prob_monopol.m(lanci,carte,triplo,azione) % %% con: lanci = 1 , infinio % %% carte = 0 , 1 : 0 = no, 1 = si % %% triplo = 0 , 1 : 0 = no, 1 = si % %% azione = 1 pago subito % %% 2 pago al 2°turno % %% 3 pago al 3°turno % %% FIG = 1, 2, 3, 4 : diverse visualizzazioni del risultato % %% versiome 6 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MAX_shots = lanci; disp([ 'Numero di lanci = ' int2str(MAX_shots) ]); t=clock; % avvio il conteggio temporale % ----------------------------------------------------------------------- % Definizione di alcune variabili utili P = [0 1 2 3 4 5 6 5 4 3 2 1]/36; % probabilità di uscita dei valori da 1 a 12 N = MAX_shots * 40; % numero max di colonne delle matrici E & A EXT = (MAX_shots+1) * 40 ; pp = 13/16; % probabilità di rimanere sul terreno 'Probabilità' pi = 9/16; % probabilità di rimanere sul terreno 'Imprevisti' pm = 1/16; % probabilità di pescare un dato cartellino PU = [1 1/6 5/36 25/36]; % probabilità di uscita dal carcere stay = [1 pp 1 1 1 1 pi 1 1 1 ,... 1 1 1 1 1 1 pp 1 1 1 ,... 1 pi 1 1 1 1 1 1 1 0 ,... 1 1 pp 1 1 pi 1 1 1 1]; % promabilità di rimanere su un territorio (1 giro) % Creo il Probabilità, Imprevisti e Carcere for i = 1 : MAX_shots + 1 ; PRB2 (i)= 2+40*(i-1); IMP7 (i)= 7+40*(i-1); PRB17(i)= 17+40*(i-1); IMP22(i)= 22+40*(i-1); CAS30(i)= 30+40*(i-1); PRB33(i)= 33+40*(i-1); IMP36(i)= 36+40*(i-1); % ed il vettore di moltiplicazione da A ad E STAY (1+40*(i-1):40*i)= stay; end; A = zeros ( MAX_shots, EXT ); % inizializzo le tabelle E = zeros ( MAX_shots, EXT ); % ============================= Programma ========================================= for shot = 1 : MAX_shots if triplo & shot >2 ; A(shot,30)= 5/6 * (1/6)^3 + A(shot,30); end; % !!!!!!!!! if shot == 1 % primo shot for dado = 2:12 A(1,dado) = P(dado); end % for dado else for i = 1 : N % scorro tutta la riga con l'indice for dado = 2:12 A(shot,i+dado)=P(dado)*E(shot-1,i)+A(shot,i+dado); end % for dado end % for i end % if shot % ------------ ROUTINE DI 'RIMANDO' SULLA RIGA 'shot' ----------------------- for i = 1 : N - 1 % #30 Carcere if ~isempty(find(CAS30==i)) if azione == 1 for dado = 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+PU(1)*P(dado)*A(shot,i); end; elseif azione == 2 for dado = 2 : 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+PU(2)*1/6*A(shot,i); end; for dado = 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+(1-PU(2))*P(dado)*A(shot,i); end; elseif azione == 3 for dado = 2 : 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+PU(2)*1/6*A(shot,i); end; for dado = 2 : 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+PU(3)*1/6*A(shot,i); end; for dado = 2 : 12 A(shot,i+20+dado)=A(shot,i+20+dado)+PU(4)*P(dado)*A(shot,i); end; % for dado end; % if azione end % if 'casella del carcere' end % for 1:N-1 for i = 1 : N % #30 Carcere solo aggiunta a #10 if ~isempty(find(CAS30==i)) A(shot,i+20) = A(shot,i)+ A(shot,i+20); end; if carte % #2 Probabilità if ~isempty(find(PRB2==i)) A(shot,i+28)= pm*A(shot,i)+A(shot,i+28); % carcere A(shot,i+38)= pm*A(shot,i)+A(shot,i+38); % via A(shot,i+39)= pm*A(shot,i)+A(shot,i+39); % vicolo corto end % #17 Probabilità if ~isempty(find(PRB17==i)) A(shot,i+13)= pm*A(shot,i)+A(shot,i+13); A(shot,i+23)= pm*A(shot,i)+A(shot,i+23); A(shot,i+24)= pm*A(shot,i)+A(shot,i+24); end % #33 Probabilità if ~isempty(find(PRB33==i)) A(shot,i+37)= pm*A(shot,i)+A(shot,i+37); A(shot,i+ 7)= pm*A(shot,i)+A(shot,i+ 7); A(shot,i+ 8)= pm*A(shot,i)+A(shot,i+ 8); end % #7 Imprevisti if ~isempty(find(IMP7==i)) A(shot,i+23)= pm*A(shot,i)+A(shot,i+23); % carcere A(shot,i+33)= pm*A(shot,i)+A(shot,i+33); % via A(shot,i+ 4)= pm*A(shot,i)+A(shot,i+ 4); % via accademia A(shot,i+17)= pm*A(shot,i)+A(shot,i+17); % largo colombo A(shot,i+18)= pm*A(shot,i)+A(shot,i+18); % stazione nord A(shot,i+32)= pm*A(shot,i)+A(shot,i+32); % parco della vittoria A(shot,i+37)= pm*A(shot,i)+A(shot,i+37); % 3 passi indietro end % #22 Imprevisti if ~isempty(find(IMP22==i)) A(shot,i+ 8)= pm*A(shot,i)+A(shot,i+ 8); A(shot,i+18)= pm*A(shot,i)+A(shot,i+18); A(shot,i+29)= pm*A(shot,i)+A(shot,i+29); A(shot,i+ 2)= pm*A(shot,i)+A(shot,i+ 2); A(shot,i+ 3)= pm*A(shot,i)+A(shot,i+ 3); A(shot,i+17)= pm*A(shot,i)+A(shot,i+17); A(shot,i+37)= pm*A(shot,i)+A(shot,i+37); end % #36 Imprevisti if ~isempty(find(IMP36==i)) A(shot,i+34)= pm*A(shot,i)+A(shot,i+34); A(shot,i+ 4)= pm*A(shot,i)+A(shot,i+ 4); A(shot,i+15)= pm*A(shot,i)+A(shot,i+15); A(shot,i+28)= pm*A(shot,i)+A(shot,i+28); A(shot,i+29)= pm*A(shot,i)+A(shot,i+29); A(shot,i+ 3)= pm*A(shot,i)+A(shot,i+ 3); A(shot,i+37)= pm*A(shot,i)+A(shot,i+37); end end % if carte end % for i=1:N % ROUTINE CI COPIA DELLA RIGA TRATTATA da A ad E PESATA E(shot,:) = A(shot,:) .* STAY; end; % for shot % =================== fine del programma vero e proprio ============================ % fine tempo di conteggio e visualizzazione t1=etime(clock,t); disp([' tempo impiegato = ' int2str(t1) ' s' ]); % -------------- ruotine di presentazione dati in forma grafica -------------------- if MAX_shots == 1 SOMMA_RIGA = A; else SOMMA_RIGA = sum(A); end; SOMMA_TOT = zeros(1,40); for k = 0 : MAX_shots for j = 1 : 40 SOMMA_TOT(j)= SOMMA_RIGA(j+k*40) + SOMMA_TOT(j); end; % for j end; % for k SOMMA_TOT_norm = SOMMA_TOT / mean(SOMMA_TOT); % normalizzo rispetto alla media OHNE = SOMMA_TOT; OHNE_norm = SOMMA_TOT_norm; if 1 %carte OHNE(10)=SOMMA_TOT(10)-SOMMA_TOT(30); OHNE_norm(10)=OHNE_norm(10)-OHNE_norm(30); end; % --------------------------------------------------------------------------------- C = ['SENZA' ; ' CON ']; % stringhe da visualizzare AZ = ['1°' ; '2°' ; '3°']; if FIG == 1 figure; hold on; grid on; bar(SOMMA_TOT_norm(1:40),'c'); bar(OHNE_norm(1:40),'b'); xlabel('TERRENI'); ylabel('INDICE DI PROBABILITA'' D''ACCESSO'); title([ int2str(MAX_shots) ' LANCI ',... C(carte+1,:) ' CARTE ED AZIONE TIPO ' AZ(azione,:) ]); axis([0.5 40.5 0 2.5]); end; % FIG 1 if FIG == 2 figure; hold on; grid on; bar(SOMMA_TOT_norm(1:40),'r'); bar(OHNE_norm(1:40),'m'); xlabel('TERRENI'); ylabel('INDICE DI PROBABILITA'' D''ACCESSO'); title([ int2str(MAX_shots) ' LANCI ',... C(carte+1,:) ' CARTE ED AZIONE TIPO ' AZ(azione,:) ]); axis([0.5 40.5 0 5]); end; % FIG 2 if FIG == 3 figure(3); grid on; axis([1 40 0.5 2.2]); set(gca,'NextPlot','add'); plot(SOMMA_TOT_norm(1:40),'b-') xlabel('TERRENI'); ylabel('INDICE DI PROBABILITA'' D''ACCESSO'); title([ ' VISIONE COMPLESSIVA ' ]); end; % FIG 3 if FIG == 4 figure(4); hold on; grid on; axis([1 40 0.5 2.2]); plot(SOMMA_TOT_norm(1:40),'b-') plot(SOMMA_TOT_norm(1:40),'b*') plot(OHNE_norm(1:40),'b-') plot(OHNE_norm(1:40),'b*') xlabel('TERRENI'); ylabel('INDICE DI PROBABILITA'' D''ACCESSO'); title([ int2str(MAX_shots) ' LANCI ',... C(carte+1,:) ' CARTE ED AZIONE TIPO ' AZ(azione,:) ]); end; % FIG 4 if FIG == 5 figure; hold on; grid on; SUM_percent = SOMMA_TOT / sum(SOMMA_TOT)*100; OHNE_SUM_percent = SUM_percent; if carte ; OHNE_SUM_percent(10)=OHNE_SUM_percent(10)-OHNE_SUM_percent(30); end; bar(SUM_percent(1:40),'r'); bar(OHNE_SUM_percent(1:40),'m'); xlabel('TERRENI'); ylabel('INDICE DI PROBABILITA'' D''ACCESSO IN %'); title([ int2str(MAX_shots) ' LANCI ',... C(carte+1,:) ' CARTE ED AZIONE TIPO ' AZ(azione,:) ]); axis([0.5 40.5 0 6]); end; % FIG 5 if FIG == 6 % figure; % axis([0.5 40.5 0 6]); hold on; grid on; SUM_percent = SOMMA_TOT / sum(SOMMA_TOT)*100; OHNE_SUM_percent = SUM_percent; if carte ; OHNE_SUM_percent(10)=OHNE_SUM_percent(10)-OHNE_SUM_percent(30); end; bar3(SUM_percent',0.5) view(95,10); end; % FIG 6 % ================================== FINE =========================================