Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Logica del gioco - OBIETTIVI DA CONSEGUIRE: Definizioni

informatica




Logica del gioco


2.4.0 OBIETTIVI DA CONSEGUIRE: Definizioni


Questa sezione si occupa di creare una logica che consenta principalmente due cose al computer:

1 -> Il sistema deve saper posizionare le proprie navi in maniera corretta e intelligente.

2 -> Il sistema deve decidere dove sparare alla ricerca delle navi nemiche, una volta messo a segno un colpo, il PC deve distruggere la nave completamente.


2.4.0.1 Organizzazione del codice




E' stato scelto di comune accordo di utilizzare il linguaggio visuale Delphi anche se male si adattava alle mie esigenze in quanto fortemente tipizzato. Ho s 939f57j celto di mia spontanea volontà di organizzare il codice in classi per rendere più facile il ritrovamento d'errori all'interno del mio modulo e una maggiore flessibilità dello stesso. Assieme a Davide Pellizzato che si occupava della parte grafica del progetto abbiamo definito alcune particolarità che ci davano la possibilità di interfacciarsi, uno di loro era una matrice che lui voleva "vedere" che conteneva le navi del computer; abbiamo poi definito delle associazioni da usare all'interno di ogni matrice che sintetizzavano lo stato di gioco:

A sta per acqua, C sta per colpito, X sta per affondato, N sta per Nave.


Input e output.


I dati ricevuti in input sono di diversa natura, questo nasce dalla scelta di utilizzare un approccio statistico al problema, innanzi tutto il mio modulo organizzato in classi chiede in input il nome del giocatore e il livello di difficoltà che si desidera per questo mach, il primo serve per ricercare dentro dell'archivio del programma se il giocatore è un best 10, cioè uno dei migliori dieci giocatori e possiede perciò una sua statistica su disco per sapere se è necessario selezionare la sua statistica personale o quella generale.

Alla richiesta del programma di generare la posizione delle navi del computer il mio modulo necessita di avere in input un array di 10 elementi, tale array contiene le informazioni memorizzate seconda la seguente regola, per ogni elemento dello array l'indice dell'elemento indica la dimensione delle navi mentre il valore all'interno il numero delle navi di tale dimensione. Questa organizzazione è necessaria perché è data piena libertà all'utente di scegliere come ripartire le proprie navi che comunque hanno dimensione che va da 1 a 10.

Alla richiesta di fornire la mossa del computer è chiesto un input l'esito della mossa precedente del PC, questo perché è necessario per stabilire dove sparare successivamente.

Alla fine della partita si richiede con una funzione di salvare i dati della partita giocata chiedendoli in input secondo un particolare tracciato record.

In output alla richiesta di disporre la navi il mio modulo aggiorna una matrice di caratteri dove sono memorizzati i dati che è globale, cioè visibile a tutto il progetto. Alla richiesta di una nuova mossa è restituito un oggetto di tipo elemento (da me definito) che contiene le coordinate x e y della prossima mossa.


2.4.1.0 ANALISI:Organizzazione globale


Ho deciso di risolvere i compiti richiesti secondo la metodologia top_down. Ho deciso di utilizzare quattro livelli di difficoltà che potevano essere selezionati dall'utente al momento di iniziare la partita:

Il livello1 (chiamato "Facile" a video) è il livello casuale :la tecnica del computer consiste semplicemente nella generazione casuale delle coordinate dove sparare.

Il livello2 (chiamato "Medio" a video) è il livello statistico: la tecnica del computer consiste nel caricarsi una matrice attraverso i dati in possesso con la percentuale di fare centro in ogni casella, questa matrice può essere generale, cioè statistica sui 10 migliori giocatori , oppure personale sulle precedenti partite del giocatore se si è dimostrato particolarmente bravo entrando nella top ten.

Il livello3 (chiamato "Difficile" a video) è il livello Casuale-Ragionato: la tecnica del computer consiste nella generazione casuale delle coordinate a cui sparare come nel livello1, ma ad ogni nave colpita il PC prova a colpire le parti rimaste per affondarla subito dopo aver individuato un componente.

Il livello4 (chiamato "Terribile" a video) è il livello Statistico-Ragionato: la tecnica del computer consiste nel generare in maniera statistica le coordinate per poi una volta identificata una nave abbatterla come nel livello3.

Per rendere più semplice la programmazione la matrice con le probabilità è divenuta globale e ha assunto il nome mat_prob. Ho pensato di creare un array che contenesse tutte le mosse che il PC aveva all'inizio intenzione di affrontare. Tale array è caricato in maniera casuale o statistica seconda delle richieste ,se si gioca a livello 3 o 4 la sequenza che per gli altri livelli è un ordine di esecuzione è modificata ogni volta che si colpisce la nave.


2..4.1.1 Organizzazione della classe fondamentale.


La classe fondamentale che va sotto il nome di Tcomputer ha il seguente tracciato:


type

Tcomputer=class

private

mosse :tvettore;

modalita: shortint;

index : integer;

positions:shortint;

procedure carica_mat(player: string);

public

procedure disponi_navi(var punt: array of integer);

function mossa (esito: char ):elemento;

constructor create_brain(modo :shortint;player: string) ;

procedure Save(play :dati);

end;


Analizziamone ora il contenuto campo per campo per capire com'è organizzato il programma in questa classe, che funge da radice in un ipotetico albero di analisi top_down.

La prima proprietà è mosse che è a sua volta un oggetto ;l'array contenente le mosse del computer ordinate è una classe poiché è mia intenzione rendere legate alla classe Tvettore stessa le funzioni che trattano il vettore, vedremo meglio nel paragrafo successivo come è organizzata la classe Tvettore.

La proprietà modalità indica il livello di difficoltà selezionato (un intero da 1 a 4),la proprietà index memorizza l' indice dell' array mosse mentre un discorso a parte merita la proprietà positions, tale proprietà ha lo scopo di memorizzare ,una volta che una nave è colpita, le posizioni attive da controllare attorno alla casella colpita; per posizioni attive s'intendono tutte le posizioni che possono essere sede di una nave da colpire. Per esempio se colpiamo una nave più lunga di un'unità al centro del campo di battaglia le posizioni attive sono 4 (su, giù ,destra , sinistra) ma se la colpiamo nell ' ultima casella in basso a destra (L-10) allora le posizioni attive sono due (su, sinistra) .

Passiamo ora ai metodi :vi è un unico metodo privato, la procedura carica_mat che carica la matrice secondo la statistica opportuna ,è utilizzata direttamente e univocamente dal costruttore.

I 3 metodi successivi sono i 3 metodi di interfaccia con la mia unit che ho previsto e che ho già sufficientemente analizzato in 3.1.2 , li ricordo brevemente per facilitarne l' associazione :

constructor create_brain(modo :shortint;player: string) ;

E' il costruttore, inizializza ogni aspetto dell' oggetto Tcomputer compreso mosse che è caricato secondo la richiesta casualmente o statisticamente.

procedure disponi_navi(var punt: array of integer);

E' la procedura che dispone le navi del computer. E' procedura non funzione perché i risultati sono direttamente scritti nella matrice globale mat_prob e quindi niente è restituito alla chiamata.

function mossa (esito: char ):elemento;

E' la funzione che restituisce la mossa successiva del computer in base al risultato della mossa precedente, da notare che l'esito è char secondo i parametri di "standardizzazione" da noi stessi imposti, cioè esito potrà essere 'A', 'C' o 'X;'

Vi è anche un quarto metodo che ha lo scopo di salvare i dati acquisiti alla fine della partita. Verrà salvata cioè la disposizione delle navi se è un best 10 o lo è diventato grazie al punteggio ottenuto.


2.4.1.2 Organizzazione delle classi di supporto.


Vi sono 3 componenti ulteriori che fanno da supporto a tutto il modulo e sono fondamentali al fine che il programma funzioni.

Vi è innanzi tutto la classe elemento:


type

elemento=class

public

x: integer;

y: integer;

end;


Tale classe memorizza una coordinata della battaglia navale come 2 interi x e y .Tale classe poteva essere un record ma essendo classe è possibile il suo scambio tra funzioni e il confronto tra oggetti in maniera più semplice.

Scorrendo il listato si trova poi il record dati:


type

dati=record

nome : string[30];

punti: integer;

n : integer;

mat:array[1..10 ,1..10]of real;

end;


Tale record è il record che salva i dati di ogni partita (se è opportuno farlo) sul disco; contiene informazioni di base fondamentali, quali nell' ordine :nome giocatore, punti totalizzati, numero di partite, matrice di probabilità (%) che la nave si trovi in ogni casella. Il file che contiene questi dati si chiama "topten.dat " e contiene i dati di 10 giocatori (i migliori) la funzione Save si occupa appunto alla fine di ogni partita ad aggiornare i record affinché contengano sempre i migliori e con le matrici più precise.

Rimane per ultima da descrivere la classe che dopo Tcomputer è la più importante ,quella che si occupa delle operazioni sul vettore:


type

Tvettore=class

private

nav_max,nav_min: elemento;

vet :array[0..99] of elemento;

function controlla(uno : elemento):elemento;

function inserisci(punto: elemento; index :integer):elemento;

public

procedure carica_rand;

procedure carica_stat;

function control4(index: shortint;modo :shortint): shortint;

function control2(i: shortint;modo :shortint): shortint;

function vedi(index: shortint):elemento;

end;


Sono tre le proprietà di questa classe nav_max e nav_min contengono gli estremi di una nave che si ha solo parzialmente identificato al fine di verificare solo le zone utili alla ricerca di una nave. Ad esempio se nav_max (c;5) e nav_min (c;3) il computer sa che deve controllare solo (c;6) e (c;2) poiché (c;4) è già stata controllata e colpita. Vet contiene il vettore fondamentale delle coordinate di tutta la matrice nell' ordine con cui deve spararle. Per quanto riguarda i metodi invece quelli privati sono controlla e inserisci che hanno rispettivamente il compito di controllare se la coordinata è accettabile oppure no e di inserire un elemento nell' array alla posizione index. Entrambe in caso di errore (Elemento inaccettabile o già sparato rispettivamente) restituiscono un oggetto elemento vuoto (0,0);Per quanto riguarda invece i componenti pubblici le procedure carica_rand e carica_stat caricano in vet le coordinate secondo rispettivamente regole di generazione casuale e di generazione statistica. Le funzioni control4 e control2 sono le più complesse , controllano e inseriscono ,in caso che una nave venga colpita ,nell' array vet i successivi colpi da sparare al fine di individuare e affondare la nave.

control4 controlla e inserisce 4 coordinate cioè viene utilizzata quando la si ha individuato un solo elemento della nave, control2 viceversa si occupa di adempiere agli stessi compiti ma quando la nave individuata è già costituita di due unità. La funzione vedi consente alla funzioni esterne alla classe Tvettore di vedere gli elementi di vet.





2.4.2.0. Analisi dei compiti svolti da ogni funzione.


Funzioni di Tcomputer


constructor Tcomputer.create_brain(modo :shortint;player: string);

Input: Riceve il livello di difficoltà e il nome del giocatore.

funzionamento: Inizializza la classe ,il nome serve per stabilire se caricare una statistica generale o una personale riferita al giocatore.

output: Nessuno.

procedure Tcomputer.Save(play :dati);

Input: Riceve un record con i dati dell' ultimo giocatore.

funzionamento: Salva ,se opportuno ,i dati del giocatore su disco.

output: Nessuno.

function Tcomputer.mossa(esito: char ):elemento;

Input: Riceve l' esito della mossa precedente .

funzionamento: Fornisce la mossa successiva, attraverso l' array vet in Tvettore e se necessario control2 e control4.

output: Restituisce un oggetto elemento contenente la mossa successiva.

procedure Tcomputer.disponi_navi(var punt: array of integer);

Input: Riceve un array che descrive il numero di nave per ogni tipo di nave ammesso.

funzionamento: Dispone le navi utilizzando le matrice mat_prob e posizionando le navi dove la probabilità di essere colpiti è più bassa.

output: Nessuno.

procedure Tcomputer.carica_mat(player: string);

Input: Riceve il nome del giocatore.

funzionamento: Carica i valori nella matrice mat_prob, se il giocare sia un best10 con la sua statistica altrimenti con una originale.

Output :Nessuno


Funzioni di Tvettore


function Tvettore.controlla(uno : elemento):elemento;

Input: Riceve un elemento da controllare.

funzionamento: Controlla con semplici if se l' elemento è o meno interno a una matrice[10][10].

Output: Da un elemento nullo se uno è esterno alla matrice

function Tvettore.inserisci(punto: elemento; index :integer):elemento;

Input: Riceve un elemento da inserire (punto) e il punto ove va inserito(index).

funzionamento: Inserisce in vet alla posizione index l' elemento punto se non e precedente a index .

output: Restituisce un elemento nullo se punto è già stato sparato.

procedure Tvettore.carica_rand;

Input: Nessuno.

funzionamento: Carica il vettore con posizioni random.

output: Nessuno.

procedure Tvettore.carica_stat;

Input: Nessuno.

funzionamento: Carica il vettore con posizioni statistiche utilizzando mat_prob.

output: Nessuno.

function Tvettore.control4(index: shortint;modo :shortint): shortint;

Input: Riceve il livello di difficoltà e la posizione di vet della prossima mossa.

funzionamento: Inserisce in vet le successive 4 mosse sufficenti per identificare una nuova unità nelle 4 direzioni possibili.

output: Restituisce il numero di posizioni attive rimaste.

function Tvettore.control2(i: shortint;modo :shortint): shortint;

Input: Riceve il livello di difficoltà e la posizione di vet della prossima mossa.

funzionamento: Inserisce in vet le successive 4 mosse sufficienti per identificare una nuova unità nelle 2 direzioni possibili.

output: Restituisce il numero di posizioni attive rimaste.

function Tvettore.vedi(index: shortint):elemento;

Input: Indice di vet dove sta l' elemento che voglio vedere.

funzionamento: Rende visibili gli elementi di vet.

output: Un oggetto che contiene l 'elemento di vet richiesto.


Altre Funzioni


function FileExists(FileName: string): Boolean;

Input: Il nome del file da controllare.

funzionamento: Controlla se il file esiste.

output: true se il file esiste altrimenti false.





Privacy




Articolo informazione


Hits: 1328
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024