(*Nome modulo: mura*)
(*Versione: 0.7-beta*)
(*Licenza: GNU GPL*)
(*Rilascio: 08/07/2010*)
(*Autore: Francesco Marrone (alias Giarados)*)
(*Descrizione: in questo modulo viene descritta la classe campo e alcune costanti
il cui utilizzo è strettamente legato alla classe campo*)
unit mura;
interface
{Il tipo matrice null'altro è che un array bidimensionale dinamico}
type matrice=array of array of byte;
type
registrazione=record
id:shortint;
x_iniziale:byte;
y_iniziale:byte;
end;
{La costante dimensione_cella è il valore in pixel del'altezza e
della larghezza di ogni singola cella del campo da gioco ogni
valore può esservi sostituito...automaticamente verrà disattivata
la "modalità grafica" e al posto delle immagini di pacman e dei
fantasmi verrà visualizzato un cursore colorato di larghezza
dimensione_cella x dimensione_cella.}
const dimensione_cella=15;
{Qui vengono dichiarati i valori dei vari tipi di celle, ergo
tutti i valori che possono incontrati nella matrice che rappresenta
il terreno da gioco.
Al momento ghost non è usata. Ma ben presto verrà utilizzata per
risolvere il problema del settaggio automatico delle posizioni iniziali
dei fantasmi.}
const cella_vuota=0; {Una cella vuota}
const cella_muro=1; {Un pezzo di muro}
const cella_cibo=2; {Una pallina luminosa piccola}
const cella_super_cibo=3; {Una pallina luminosa grande che fa fuggire e rende vulnerabili i fantasmi}
const unwalkable_ghosts=4; {Cella contenente un muro rosso attraversabile dai pacmen ma non dai fantasmi}
const unwalkable_pacmen=5; {Cella contenente un muro rosso attraversabile dai fantasmi ma non dai pacmen}
const ghost=6; {Leggere sopra per capire il senso di questo tipo}
const pacman=7;
{Nonostante questi due valori (a mio parere) andrebbero messi
nel private della classe campo e resi disponibili/modificabili
tramite gli adeguati metodi esse vengono lasciate come due variabili globali.
Ciò limita la possibilità di gestire 2 o più campi contemporaneamente.
Verrano presto eliminate.
NOTA ESSENZIALE: non rappresentano il numero di riga/colonne del campo!
numero_colonne=dimensione_x_campo+1
numero_riga=dimensione_y_campo+1}
var dimensione_x_campo:byte;
var dimensione_y_campo:byte;
{Il numero massimo di entità che si possono registrare nel campo
sarà uguale a numero_max_entita. A questa costante faranno riferimento
dei metodi nelle classi pacmen e ghosts}
const numero_max_entita=4;
{Questa funzione restituisce true se il file filestr esiste
altrimenti false se è inesistente.}
function thisfileexists(filestr:string):boolean;
{Definizione della classe campo.}
type
campo=object
private
{Questa matrice rappresenta il campo. Facendo parte del membro
private non è accessibile dall'esterno e in seguito verranno definite
alcuni metodi per interagirvi}
campo_array:matrice;
{Questa variabile contiene il valore attuale di entità registrate.
E' anche possibile che: numero_max_entita <> numero_entita.}
numero_entita:byte;
{Questo array gestisce i dati di ogni entità registrata nel campo.
Inoltre interagisce con gli stati delle entità. Quando pacman deve mangiare
un fantasma modifica il suo status in questo array e di conseguenza il fantasma
cambia status. Per accedervi le entità utilizzano il metodo set_xy_entita che
restituisce un id tramite il quale si può riaccedere alla propria colonna in
xy_entita. Le registrazioni non devono per forza essere pari a numero_max_entita.
Il numero corrente viene registrato da numero_entita. Quindi non ci si pone il problema
di non sapere quante entità siano attualmente in campo
Esempio:
| 1 | 2 | ... | numero_max_entita | --Ogni colonna fa riferimento all'id che vi si è registrato--
0 |x_e_1 |x_e_2 |x_e_...|x_e_nme | --La cella nella riga 0 contiene l'ascissa dell'entità a cui appartie la colonna stessa
1 |y_e_1 |y_e_2 |y_e_...|y_e_nme | --La cella nella riga 1 contiene l'ordinata dell'entità a cui appartie la colonna stessa
2 |status1|status2|status.|status_nme | --La cella nella riga 2 contiene lo status dell'entità a cui appartie la colonna stessa
}
xy_entita:array[1..numero_max_entita,0..2] of byte;
{Nella rappresentazione grafica del campo questo può essere traslato.
La posizone dell'angolo in alto a SX viene regolata tramite le due variabili
sottostanti}
posizionex:byte;
posizioney:byte;
{Il nome suona strano del metodo sottostante, e in effetti lo è. Andrebbe letto
set_dimensione_matrice, ma era troppo lungo e ho preferito accorciare :D.
Questo metodo serve per settare la dimensione del campo e inizializzare tutte le
cella a cella_vuota. Viene utilizzato nel costruttore per inizializzare il tutto
e nel metodo publico svuota_campo}
procedure settadimatrice(altezza,larghezza:byte; init:boolean);
{Tutti i seguenti metodi più o meno corrispondono ai tipi di celle esistenti.
Essi non fanno altro che rappresentare graficamente le celle. Non vengono chiamati
direttamente ma tramite l'utilizzo del metodo pubblico disegna_mappa}
procedure rappresenta_cibo(ascissa,ordinata:byte);
procedure rappresenta_vuoto(ascissa,ordinata:byte);
procedure rappresenta_muro(ascissa,ordinata:byte);
procedure rappresenta_super_cibo(ascissa,ordinata:byte);
procedure rappresenta_unwalkable_pacmen(ascissa,ordinata:byte);
procedure rappresenta_unwalkable_ghosts(ascissa,ordinata:byte);
procedure rappresenta_cella_ghost(ascissa,ordinata:byte);
procedure rappresenta_cella_pacman(ascissa,ordinata:byte);
public
{Costruttore della classe}
constructor crea(ascissa,ordinata:byte; input:string);
{Restituisce il tipo di cella(ascissa,ordinata)}
function get_stato_cella(ascissa,ordinata:smallint; editormode:boolean):byte;
{Queste due funzioni restituiscono rispettivamente posizionex e posizioney}
function get_posizionex():byte;
function get_posizioney():byte;
{Restituisce il numero di entità ATTUALMENTE in gioco}
function get_numero_entita():byte;
{Queste due funzioni servono per ottene le coordinate dell'entità
di id "indice"}
function get_x_entita(indice:byte):byte;
function get_y_entita(indice:byte):byte;
{Restituisce lo status attuale dell'entità in questione.
Il valore restituito non ha alcun senso qui e viene interpretato
solo dalle classi ghost e pacmen}
function get_status_entita(indice:byte):byte;
{Funzione che si occupa di registrare l'entità che la chiama restituendo
a questa un id tramite il quale è possibile fare riferimento ai propri dati.
Tramite questa ci si propone di risolvere il problema della "inizializzazione automatica"
delle posizioni dei fantasmi. Quindi ben preso potrebbe restituire come risultato una struct
contenente i valori utili per inizializzare la posizione iniziale dell'elemento che si registra.
Oppure un valore d'errore se non vi è più posto per ulteriori entità nel campo in uso}
function set_xy_entita(status:byte; needanid:boolean):registrazione;
{Si utilizzi per ridimensionare il campo.}
procedure scala_campo(ascissa,ordinata:shortint);
{Ogni entità registrata fa ad essa riferimento per aggiorare la propria posizione
nel campo}
procedure mod_xy_entita(indice,nuova_ascissa,nuova_ordinata:byte);
{Ogni entità registrata fa ad essa riferimento per aggiorare il proprio status}
procedure mod_xy_status(indice,nuovo_status:byte);
{Svuota campo viene utilizzato unicamente (almeno per ora) nell'editor e serve
a rendere completamente vuoto il campo da gioco}
procedure svuota_campo;
function goodmap():boolean;
{Modifica il contenuto di una determinata cella. "Stato" viene inteso per contenuto.
Non c'entra nulla con le entità registrate. Questo metodo viene utilizzato principalmente
da pacmen (per svuotare le celle dopo avervi mangiato) e nell'editor per appunto editare
la mappa}
procedure mod_stato_cella(ascissa,ordinata,nuovo_valore:byte);
{Viene utilizzato solo nell'editor. Questo metodo esposporta la mappa nel file
output. Overwrite se settato a true consente la sovrascrittura automatica altrimenti
se settato a false non permette la sovrascrittura di file esistenti}
procedure esporta_mappa(output:string; overwrite:boolean);
{Il metodo disegna_mappa si occupa della rappresentazione grafica della mappa o di sole
parti di essa.}
procedure disegna_mappa(ascissa_A,ordinata_A,ascissa_B,ordinata_B:byte; editormode:boolean);
end;
implementation
uses wingraph,wincrt,sysutils;
{Il nome suona strano del metodo sottostante, e in effetti lo è. Andrebbe letto
set_dimensione_matrice, ma era troppo lungo e ho preferito accorciare :D.
Questo metodo serve per settare la dimensione del campo e inizializzare tutte le
cella a cella_vuota. Viene utilizzato nel costruttore per inizializzare il tutto
e nel metodo publico svuota_campo}
procedure campo.settadimatrice(altezza,larghezza:byte; init:boolean);
var
a,b:byte;
begin
setlength(campo_array,altezza); {Vengono settate inizialmente le colonne dell'array a altezza}
a:=0;
for a:=0 to altezza-1 do
setlength(campo_array[a],larghezza); {In seguto, ad una ad una, viene settata la larghezza di ogni colonna}
{Utilizzare setlength sarebbe una scelta più sbrigativa. Non so perchè però
tengo queste 2 riga di codice in più}
{Durante lo sviluppo ho incontrato parecchi problemi con questa procedura,
il problema sta qui sotto nel ciclo for. Per eventuali modifiche
tienilo a mente.}
if init then {se init è vero allora il campo viene svuotato--è questo il caso di crea e svuota_campo. Ma non di scala}
begin
a:=0; b:=0;
for a:=0 to altezza-1 do
for b:=0 to larghezza-1 do
campo_array[a,b]:=cella_vuota;
end;
end;
{Questa funzione restituisce true se il file filestr esiste
altrimenti false se è inesistente.}
function thisfileexists(filestr:string):boolean;
var
result:boolean;
f:textfile;
begin
result:=false;
{$I-} Assign(f,filestr);
Reset(f); {$I+}
if (IOResult=0) then
begin
close(f);
result:=true;
end;
thisfileexists:=result;
end;
function campo.goodmap():boolean;
var
a,b:byte;
howmanyghosts,howmanypacmen:integer;
begin
howmanyghosts:=0;
howmanypacmen:=0;
a:=0;
b:=0;
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
begin
if campo_array[a,b]=pacman then howmanypacmen+=1;
if campo_array[a,b]=ghost then howmanyghosts+=1;
end;
if ((howmanypacmen=1) and (howmanyghosts>0)) then goodmap:=true
else goodmap:=false;
end;
{Costruttore della classe campo.
Ess inizialla la dimensione e la traslazione del campo, importando anche la esistente da input.}
constructor campo.crea(ascissa,ordinata:byte; input:string);
var
a:integer;
{b:integer;}
f:textfile;
altezza,larghezza:byte;
buffer:longint;
begin
{Se l'input è vacante, oppure il file input non esiste la dimensione del campo
viene settata a 28X28 (modello standard in questo gioco sino alla fine della v.0.6.*).
Viene ricreata la mappa standard}
if ((input='') or (thisfileexists(input)=false)) then
begin
writeln('E'' stata scelta la strada del file che non esiste!');
dimensione_x_campo:=28;
dimensione_y_campo:=28;
settadimatrice(dimensione_x_campo+1,dimensione_y_campo+1,true);
if 0=0 then {un modo per levarmi dai piedi un bel pò di riga :D}
begin
campo_array[0,1]:=cella_muro;
campo_array[0,2]:=cella_muro;
campo_array[0,3]:=cella_muro;
campo_array[0,4]:=cella_muro;
campo_array[0,5]:=cella_muro;
campo_array[0,6]:=cella_muro;
campo_array[0,7]:=cella_muro;
campo_array[0,8]:=cella_muro;
campo_array[0,12]:=cella_muro;
campo_array[0,14]:=cella_muro;
campo_array[0,18]:=cella_muro;
campo_array[0,19]:=cella_muro;
campo_array[0,20]:=cella_muro;
campo_array[0,21]:=cella_muro;
campo_array[0,22]:=cella_muro;
campo_array[0,23]:=cella_muro;
campo_array[0,24]:=cella_muro;
campo_array[0,25]:=cella_muro;
campo_array[0,26]:=cella_muro;
campo_array[0,27]:=cella_muro;
campo_array[0,28]:=cella_muro;
campo_array[1,0]:=cella_muro;
campo_array[1,1]:=cella_cibo;
campo_array[1,2]:=cella_cibo;
campo_array[1,3]:=cella_super_cibo;
campo_array[1,4]:=cella_cibo;
campo_array[1,5]:=cella_cibo;
campo_array[1,6]:=cella_cibo;
campo_array[1,7]:=cella_cibo;
campo_array[1,8]:=cella_muro;
campo_array[1,12]:=cella_muro;
campo_array[1,14]:=cella_muro;
campo_array[1,18]:=cella_muro;
campo_array[1,19]:=cella_cibo;
campo_array[1,20]:=cella_cibo;
campo_array[1,21]:=cella_cibo;
campo_array[1,22]:=cella_cibo;
campo_array[1,23]:=cella_super_cibo;
campo_array[1,24]:=cella_muro;
campo_array[1,25]:=cella_cibo;
campo_array[1,26]:=cella_cibo;
campo_array[1,27]:=cella_cibo;
campo_array[1,28]:=cella_muro;
campo_array[2,0]:=cella_muro;
campo_array[2,1]:=cella_cibo;
campo_array[2,2]:=cella_muro;
campo_array[2,3]:=cella_muro;
campo_array[2,4]:=cella_muro;
campo_array[2,5]:=cella_cibo;
campo_array[2,6]:=cella_muro;
campo_array[2,7]:=cella_cibo;
campo_array[2,8]:=cella_muro;
campo_array[2,12]:=cella_muro;
campo_array[2,14]:=cella_muro;
campo_array[2,18]:=cella_muro;
campo_array[2,19]:=cella_cibo;
campo_array[2,20]:=cella_muro;
campo_array[2,21]:=cella_muro;
campo_array[2,22]:=cella_muro;
campo_array[2,23]:=cella_cibo;
campo_array[2,24]:=cella_muro;
campo_array[2,25]:=cella_cibo;
campo_array[2,26]:=cella_muro;
campo_array[2,27]:=cella_cibo;
campo_array[2,28]:=cella_muro;
campo_array[3,0]:=cella_muro;
campo_array[3,1]:=cella_cibo;
campo_array[3,2]:=cella_muro;
campo_array[3,4]:=cella_muro;
campo_array[3,5]:=cella_cibo;
campo_array[3,6]:=cella_muro;
campo_array[3,7]:=cella_cibo;
campo_array[3,8]:=cella_muro;
campo_array[3,12]:=cella_muro;
campo_array[3,14]:=cella_muro;
campo_array[3,18]:=cella_muro;
campo_array[3,19]:=cella_cibo;
campo_array[3,20]:=cella_muro;
campo_array[3,22]:=cella_muro;
campo_array[3,23]:=cella_cibo;
campo_array[3,24]:=cella_cibo;
campo_array[3,25]:=cella_cibo;
campo_array[3,26]:=cella_muro;
campo_array[3,27]:=cella_cibo;
campo_array[3,28]:=cella_muro;
campo_array[4,0]:=cella_muro;
campo_array[4,1]:=cella_cibo;
campo_array[4,2]:=cella_muro;
campo_array[4,4]:=cella_muro;
campo_array[4,5]:=cella_cibo;
campo_array[4,6]:=cella_muro;
campo_array[4,7]:=cella_cibo;
campo_array[4,8]:=cella_muro;
campo_array[4,12]:=cella_muro;
campo_array[4,14]:=cella_muro;
campo_array[4,18]:=cella_muro;
campo_array[4,19]:=cella_cibo;
campo_array[4,20]:=cella_muro;
campo_array[4,22]:=cella_muro;
campo_array[4,23]:=cella_muro;
campo_array[4,24]:=cella_muro;
campo_array[4,25]:=cella_cibo;
campo_array[4,26]:=cella_muro;
campo_array[4,27]:=cella_cibo;
campo_array[4,28]:=cella_muro;
campo_array[5,0]:=cella_muro;
campo_array[5,1]:=cella_cibo;
campo_array[5,2]:=cella_muro;
campo_array[5,3]:=cella_muro;
campo_array[5,4]:=cella_muro;
campo_array[5,5]:=cella_cibo;
campo_array[5,6]:=cella_muro;
campo_array[5,7]:=cella_cibo;
campo_array[5,8]:=cella_muro;
campo_array[5,9]:=cella_muro;
campo_array[5,10]:=cella_muro;
campo_array[5,11]:=cella_muro;
campo_array[5,12]:=cella_muro;
campo_array[5,14]:=cella_muro;
campo_array[5,15]:=cella_muro;
campo_array[5,16]:=cella_muro;
campo_array[5,17]:=cella_muro;
campo_array[5,18]:=cella_muro;
campo_array[5,19]:=cella_cibo;
campo_array[5,20]:=cella_muro;
campo_array[5,21]:=cella_muro;
campo_array[5,22]:=cella_muro;
campo_array[5,23]:=cella_muro;
campo_array[5,24]:=cella_muro;
campo_array[5,25]:=cella_cibo;
campo_array[5,26]:=cella_muro;
campo_array[5,27]:=cella_cibo;
campo_array[5,28]:=cella_muro;
campo_array[6,0]:=cella_muro;
campo_array[6,1]:=cella_cibo;
campo_array[6,2]:=cella_cibo;
campo_array[6,3]:=cella_cibo;
campo_array[6,4]:=cella_cibo;
campo_array[6,5]:=cella_cibo;
campo_array[6,6]:=cella_cibo;
campo_array[6,7]:=cella_cibo;
campo_array[6,8]:=cella_cibo;
campo_array[6,9]:=cella_cibo;
campo_array[6,10]:=cella_cibo;
campo_array[6,11]:=cella_cibo;
campo_array[6,12]:=cella_cibo;
campo_array[6,13]:=cella_cibo;
campo_array[6,14]:=cella_cibo;
campo_array[6,15]:=cella_cibo;
campo_array[6,16]:=cella_cibo;
campo_array[6,17]:=cella_cibo;
campo_array[6,18]:=cella_cibo;
campo_array[6,19]:=cella_cibo;
campo_array[6,20]:=cella_cibo;
campo_array[6,21]:=cella_cibo;
campo_array[6,22]:=cella_cibo;
campo_array[6,23]:=cella_cibo;
campo_array[6,24]:=cella_cibo;
campo_array[6,25]:=cella_cibo;
campo_array[6,26]:=cella_muro;
campo_array[6,27]:=cella_cibo;
campo_array[6,28]:=cella_muro;
campo_array[7,0]:=cella_muro;
campo_array[7,1]:=cella_cibo;
campo_array[7,2]:=cella_muro;
campo_array[7,3]:=cella_muro;
campo_array[7,4]:=cella_muro;
campo_array[7,5]:=cella_cibo;
campo_array[7,6]:=cella_muro;
campo_array[7,7]:=cella_muro;
campo_array[7,8]:=cella_muro;
campo_array[7,9]:=cella_muro;
campo_array[7,10]:=cella_muro;
campo_array[7,11]:=cella_muro;
campo_array[7,12]:=cella_muro;
campo_array[7,14]:=cella_muro;
campo_array[7,15]:=cella_muro;
campo_array[7,16]:=cella_muro;
campo_array[7,17]:=cella_muro;
campo_array[7,18]:=cella_muro;
campo_array[7,19]:=cella_cibo;
campo_array[7,20]:=cella_muro;
campo_array[7,21]:=cella_muro;
campo_array[7,22]:=cella_muro;
campo_array[7,23]:=cella_cibo;
campo_array[7,24]:=cella_muro;
campo_array[7,25]:=cella_muro;
campo_array[7,26]:=cella_muro;
campo_array[7,27]:=cella_cibo;
campo_array[7,28]:=cella_muro;
campo_array[8,0]:=cella_muro;
campo_array[8,1]:=cella_cibo;
campo_array[8,2]:=cella_muro;
campo_array[8,4]:=cella_muro;
campo_array[8,5]:=cella_cibo;
campo_array[8,8]:=cella_muro;
campo_array[8,19]:=cella_cibo;
campo_array[8,20]:=cella_muro;
campo_array[8,22]:=cella_muro;
campo_array[8,23]:=cella_cibo;
campo_array[8,24]:=cella_muro;
campo_array[8,26]:=cella_muro;
campo_array[8,27]:=cella_cibo;
campo_array[8,28]:=cella_muro;
campo_array[9,0]:=cella_muro;
campo_array[9,1]:=cella_cibo;
campo_array[9,2]:=cella_muro;
campo_array[9,4]:=cella_muro;
campo_array[9,5]:=cella_cibo;
campo_array[9,6]:=cella_muro;
campo_array[9,8]:=cella_muro;
campo_array[9,10]:=cella_muro;
campo_array[9,11]:=cella_muro;
campo_array[9,12]:=cella_muro;
campo_array[9,13]:=cella_muro;
campo_array[9,14]:=cella_muro;
campo_array[9,15]:=cella_muro;
campo_array[9,16]:=cella_muro;
campo_array[9,18]:=cella_muro;
campo_array[9,19]:=cella_cibo;
campo_array[9,20]:=cella_muro;
campo_array[9,22]:=cella_muro;
campo_array[9,23]:=cella_cibo;
campo_array[9,24]:=cella_muro;
campo_array[9,25]:=cella_muro;
campo_array[9,26]:=cella_muro;
campo_array[9,27]:=cella_cibo;
campo_array[9,28]:=cella_muro;
campo_array[10,0]:=cella_muro;
campo_array[10,1]:=cella_cibo;
campo_array[10,2]:=cella_muro;
campo_array[10,4]:=cella_muro;
campo_array[10,5]:=cella_cibo;
campo_array[10,6]:=cella_muro;
campo_array[10,8]:=cella_muro;
campo_array[10,10]:=cella_muro;
campo_array[10,11]:=unwalkable_ghosts;
campo_array[10,12]:=unwalkable_ghosts;
campo_array[10,13]:=unwalkable_ghosts;
campo_array[10,14]:=unwalkable_ghosts;
campo_array[10,15]:=unwalkable_ghosts;
campo_array[10,16]:=cella_muro;
campo_array[10,18]:=cella_muro;
campo_array[10,19]:=cella_cibo;
campo_array[10,20]:=cella_muro;
campo_array[10,22]:=cella_muro;
campo_array[10,23]:=cella_cibo;
campo_array[10,24]:=cella_cibo;
campo_array[10,25]:=cella_cibo;
campo_array[10,26]:=cella_muro;
campo_array[10,27]:=cella_cibo;
campo_array[10,28]:=cella_muro;
campo_array[11,0]:=cella_muro;
campo_array[11,1]:=cella_cibo;
campo_array[11,2]:=cella_muro;
campo_array[11,4]:=cella_muro;
campo_array[11,5]:=cella_cibo;
campo_array[11,6]:=cella_muro;
campo_array[11,8]:=cella_muro;
campo_array[11,10]:=cella_muro;
campo_array[11,11]:=unwalkable_ghosts;
campo_array[11,12]:=unwalkable_ghosts;
campo_array[11,13]:=unwalkable_ghosts;
campo_array[11,14]:=unwalkable_ghosts;
campo_array[11,15]:=unwalkable_ghosts;
campo_array[11,16]:=cella_muro;
campo_array[11,18]:=cella_muro;
campo_array[11,19]:=cella_cibo;
campo_array[11,20]:=cella_muro;
campo_array[11,22]:=cella_muro;
campo_array[11,23]:=cella_cibo;
campo_array[11,24]:=cella_muro;
campo_array[11,25]:=cella_cibo;
campo_array[11,26]:=cella_muro;
campo_array[11,27]:=cella_cibo;
campo_array[11,28]:=cella_muro;
campo_array[12,0]:=cella_muro;
campo_array[12,1]:=cella_cibo;
campo_array[12,2]:=cella_muro;
campo_array[12,3]:=cella_muro;
campo_array[12,4]:=cella_muro;
campo_array[12,5]:=cella_cibo;
campo_array[12,6]:=cella_muro;
campo_array[12,8]:=cella_muro;
campo_array[12,10]:=cella_muro;
campo_array[12,11]:=unwalkable_ghosts;
campo_array[12,12]:=unwalkable_ghosts;
campo_array[12,13]:=unwalkable_ghosts;
campo_array[12,14]:=ghost;
campo_array[12,15]:=unwalkable_ghosts;
campo_array[12,16]:=cella_muro;
campo_array[12,18]:=cella_muro;
campo_array[12,19]:=cella_cibo;
campo_array[12,20]:=cella_muro;
campo_array[12,21]:=cella_muro;
campo_array[12,22]:=cella_muro;
campo_array[12,23]:=cella_cibo;
campo_array[12,24]:=cella_muro;
campo_array[12,25]:=cella_cibo;
campo_array[12,26]:=cella_muro;
campo_array[12,27]:=cella_cibo;
campo_array[12,28]:=cella_muro;
campo_array[13,0]:=cella_muro;
campo_array[13,1]:=cella_cibo;
campo_array[13,2]:=cella_cibo;
campo_array[13,3]:=cella_cibo;
campo_array[13,4]:=cella_cibo;
campo_array[13,5]:=cella_cibo;
campo_array[13,6]:=cella_muro;
campo_array[13,10]:=unwalkable_pacmen;
campo_array[13,11]:=unwalkable_ghosts;
campo_array[13,12]:=unwalkable_ghosts;
campo_array[13,13]:=unwalkable_ghosts;
campo_array[13,14]:=ghost;
campo_array[13,15]:=unwalkable_ghosts;
campo_array[13,16]:=cella_muro;
campo_array[13,18]:=cella_muro;
campo_array[13,19]:=cella_cibo;
campo_array[13,20]:=cella_cibo;
campo_array[13,21]:=cella_cibo;
campo_array[13,22]:=cella_cibo;
campo_array[13,23]:=cella_cibo;
campo_array[13,24]:=cella_muro;
campo_array[13,25]:=cella_cibo;
campo_array[13,26]:=cella_cibo;
campo_array[13,27]:=cella_cibo;
campo_array[13,28]:=cella_muro;
campo_array[14,0]:=cella_muro;
campo_array[14,1]:=cella_muro;
campo_array[14,2]:=cella_muro;
campo_array[14,3]:=cella_muro;
campo_array[14,4]:=cella_muro;
campo_array[14,5]:=cella_cibo;
campo_array[14,6]:=cella_muro;
campo_array[14,7]:=cella_muro;
campo_array[14,8]:=cella_muro;
campo_array[14,10]:=unwalkable_pacmen;
campo_array[14,15]:=unwalkable_ghosts;
campo_array[14,16]:=cella_muro;
campo_array[14,17]:=pacman;
campo_array[14,18]:=cella_muro;
campo_array[14,19]:=cella_muro;
campo_array[14,20]:=cella_muro;
campo_array[14,21]:=cella_muro;
campo_array[14,22]:=cella_muro;
campo_array[14,23]:=cella_cibo;
campo_array[14,24]:=cella_muro;
campo_array[14,25]:=cella_muro;
campo_array[14,26]:=cella_muro;
campo_array[14,27]:=cella_cibo;
campo_array[14,28]:=cella_muro;
campo_array[15,0]:=cella_muro;
campo_array[15,1]:=cella_cibo;
campo_array[15,2]:=cella_cibo;
campo_array[15,3]:=cella_cibo;
campo_array[15,4]:=cella_cibo;
campo_array[15,5]:=cella_cibo;
campo_array[15,6]:=cella_muro;
campo_array[15,10]:=unwalkable_pacmen;
campo_array[15,11]:=unwalkable_ghosts;
campo_array[15,12]:=unwalkable_ghosts;
campo_array[15,13]:=unwalkable_ghosts;
campo_array[15,14]:=ghost;
campo_array[15,15]:=unwalkable_ghosts;
campo_array[15,16]:=cella_muro;
campo_array[15,18]:=cella_muro;
campo_array[15,19]:=cella_cibo;
campo_array[15,20]:=cella_cibo;
campo_array[15,21]:=cella_cibo;
campo_array[15,22]:=cella_cibo;
campo_array[15,23]:=cella_cibo;
campo_array[15,24]:=cella_muro;
campo_array[15,25]:=cella_cibo;
campo_array[15,26]:=cella_cibo;
campo_array[15,27]:=cella_cibo;
campo_array[15,28]:=cella_muro;
campo_array[16,0]:=cella_muro;
campo_array[16,1]:=cella_cibo;
campo_array[16,2]:=cella_muro;
campo_array[16,3]:=cella_muro;
campo_array[16,4]:=cella_muro;
campo_array[16,5]:=cella_cibo;
campo_array[16,6]:=cella_muro;
campo_array[16,8]:=cella_muro;
campo_array[16,10]:=cella_muro;
campo_array[16,11]:=unwalkable_ghosts;
campo_array[16,12]:=unwalkable_ghosts;
campo_array[16,13]:=unwalkable_ghosts;
campo_array[16,14]:=ghost;
campo_array[16,15]:=unwalkable_ghosts;
campo_array[16,16]:=cella_muro;
campo_array[16,18]:=cella_muro;
campo_array[16,19]:=cella_cibo;
campo_array[16,20]:=cella_muro;
campo_array[16,21]:=cella_muro;
campo_array[16,22]:=cella_muro;
campo_array[16,23]:=cella_cibo;
campo_array[16,24]:=cella_muro;
campo_array[16,25]:=cella_cibo;
campo_array[16,26]:=cella_muro;
campo_array[16,27]:=cella_cibo;
campo_array[16,28]:=cella_muro;
campo_array[17,0]:=cella_muro;
campo_array[17,1]:=cella_cibo;
campo_array[17,2]:=cella_muro;
campo_array[17,4]:=cella_muro;
campo_array[17,5]:=cella_cibo;
campo_array[17,6]:=cella_muro;
campo_array[17,8]:=cella_muro;
campo_array[17,10]:=cella_muro;
campo_array[17,11]:=unwalkable_ghosts;
campo_array[17,12]:=unwalkable_ghosts;
campo_array[17,13]:=unwalkable_ghosts;
campo_array[17,14]:=unwalkable_ghosts;
campo_array[17,15]:=unwalkable_ghosts;
campo_array[17,16]:=cella_muro;
campo_array[17,18]:=cella_muro;
campo_array[17,19]:=cella_cibo;
campo_array[17,20]:=cella_muro;
campo_array[17,22]:=cella_muro;
campo_array[17,23]:=cella_cibo;
campo_array[17,24]:=cella_muro;
campo_array[17,25]:=cella_cibo;
campo_array[17,26]:=cella_muro;
campo_array[17,27]:=cella_cibo;
campo_array[17,28]:=cella_muro;
campo_array[18,0]:=cella_muro;
campo_array[18,1]:=cella_cibo;
campo_array[18,2]:=cella_muro;
campo_array[18,4]:=cella_muro;
campo_array[18,5]:=cella_cibo;
campo_array[18,6]:=cella_muro;
campo_array[18,8]:=cella_muro;
campo_array[18,10]:=cella_muro;
campo_array[18,11]:=unwalkable_ghosts;
campo_array[18,12]:=unwalkable_ghosts;
campo_array[18,13]:=unwalkable_ghosts;
campo_array[18,14]:=unwalkable_ghosts;
campo_array[18,15]:=unwalkable_ghosts;
campo_array[18,16]:=cella_muro;
campo_array[18,18]:=cella_muro;
campo_array[18,19]:=cella_cibo;
campo_array[18,20]:=cella_muro;
campo_array[18,22]:=cella_muro;
campo_array[18,23]:=cella_cibo;
campo_array[18,24]:=cella_cibo;
campo_array[18,25]:=cella_cibo;
campo_array[18,26]:=cella_muro;
campo_array[18,27]:=cella_cibo;
campo_array[18,28]:=cella_muro;
campo_array[19,0]:=cella_muro;
campo_array[19,1]:=cella_cibo;
campo_array[19,2]:=cella_muro;
campo_array[19,4]:=cella_muro;
campo_array[19,5]:=cella_cibo;
campo_array[19,6]:=cella_muro;
campo_array[19,8]:=cella_muro;
campo_array[19,10]:=cella_muro;
campo_array[19,11]:=cella_muro;
campo_array[19,12]:=cella_muro;
campo_array[19,13]:=cella_muro;
campo_array[19,14]:=cella_muro;
campo_array[19,15]:=cella_muro;
campo_array[19,16]:=cella_muro;
campo_array[19,18]:=cella_muro;
campo_array[19,19]:=cella_cibo;
campo_array[19,20]:=cella_muro;
campo_array[19,22]:=cella_muro;
campo_array[19,23]:=cella_cibo;
campo_array[19,24]:=cella_muro;
campo_array[19,25]:=cella_muro;
campo_array[19,26]:=cella_muro;
campo_array[19,27]:=cella_cibo;
campo_array[19,28]:=cella_muro;
campo_array[20,0]:=cella_muro;
campo_array[20,1]:=cella_cibo;
campo_array[20,2]:=cella_muro;
campo_array[20,4]:=cella_muro;
campo_array[20,5]:=cella_cibo;
campo_array[20,8]:=cella_muro;
campo_array[20,19]:=cella_cibo;
campo_array[20,20]:=cella_muro;
campo_array[20,22]:=cella_muro;
campo_array[20,23]:=cella_cibo;
campo_array[20,24]:=cella_muro;
campo_array[20,26]:=cella_muro;
campo_array[20,27]:=cella_cibo;
campo_array[20,28]:=cella_muro;
campo_array[21,0]:=cella_muro;
campo_array[21,1]:=cella_cibo;
campo_array[21,2]:=cella_muro;
campo_array[21,3]:=cella_muro;
campo_array[21,4]:=cella_muro;
campo_array[21,5]:=cella_cibo;
campo_array[21,6]:=cella_muro;
campo_array[21,7]:=cella_muro;
campo_array[21,8]:=cella_muro;
campo_array[21,9]:=cella_muro;
campo_array[21,10]:=cella_muro;
campo_array[21,11]:=cella_muro;
campo_array[21,12]:=cella_muro;
campo_array[21,14]:=cella_muro;
campo_array[21,15]:=cella_muro;
campo_array[21,16]:=cella_muro;
campo_array[21,17]:=cella_muro;
campo_array[21,18]:=cella_muro;
campo_array[21,19]:=cella_cibo;
campo_array[21,20]:=cella_muro;
campo_array[21,21]:=cella_muro;
campo_array[21,22]:=cella_muro;
campo_array[21,23]:=cella_cibo;
campo_array[21,24]:=cella_muro;
campo_array[21,25]:=cella_muro;
campo_array[21,26]:=cella_muro;
campo_array[21,27]:=cella_cibo;
campo_array[21,28]:=cella_muro;
campo_array[22,0]:=cella_muro;
campo_array[22,1]:=cella_cibo;
campo_array[22,2]:=cella_cibo;
campo_array[22,3]:=cella_cibo;
campo_array[22,4]:=cella_cibo;
campo_array[22,5]:=cella_cibo;
campo_array[22,6]:=cella_cibo;
campo_array[22,7]:=cella_cibo;
campo_array[22,8]:=cella_cibo;
campo_array[22,9]:=cella_cibo;
campo_array[22,10]:=cella_cibo;
campo_array[22,11]:=cella_cibo;
campo_array[22,12]:=cella_cibo;
campo_array[22,13]:=cella_cibo;
campo_array[22,14]:=cella_cibo;
campo_array[22,15]:=cella_cibo;
campo_array[22,16]:=cella_cibo;
campo_array[22,17]:=cella_cibo;
campo_array[22,18]:=cella_cibo;
campo_array[22,19]:=cella_cibo;
campo_array[22,20]:=cella_cibo;
campo_array[22,21]:=cella_cibo;
campo_array[22,22]:=cella_cibo;
campo_array[22,23]:=cella_cibo;
campo_array[22,24]:=cella_cibo;
campo_array[22,25]:=cella_cibo;
campo_array[22,26]:=cella_muro;
campo_array[22,27]:=cella_cibo;
campo_array[22,28]:=cella_muro;
campo_array[23,0]:=cella_muro;
campo_array[23,1]:=cella_cibo;
campo_array[23,2]:=cella_muro;
campo_array[23,3]:=cella_muro;
campo_array[23,4]:=cella_muro;
campo_array[23,5]:=cella_cibo;
campo_array[23,6]:=cella_muro;
campo_array[23,7]:=cella_cibo;
campo_array[23,8]:=cella_muro;
campo_array[23,9]:=cella_muro;
campo_array[23,10]:=cella_muro;
campo_array[23,11]:=cella_muro;
campo_array[23,12]:=cella_muro;
campo_array[23,14]:=cella_muro;
campo_array[23,15]:=cella_muro;
campo_array[23,16]:=cella_muro;
campo_array[23,17]:=cella_muro;
campo_array[23,18]:=cella_muro;
campo_array[23,19]:=cella_cibo;
campo_array[23,20]:=cella_muro;
campo_array[23,21]:=cella_muro;
campo_array[23,22]:=cella_muro;
campo_array[23,23]:=cella_muro;
campo_array[23,24]:=cella_muro;
campo_array[23,25]:=cella_cibo;
campo_array[23,26]:=cella_muro;
campo_array[23,27]:=cella_cibo;
campo_array[23,28]:=cella_muro;
campo_array[24,0]:=cella_muro;
campo_array[24,1]:=cella_cibo;
campo_array[24,2]:=cella_muro;
campo_array[24,4]:=cella_muro;
campo_array[24,5]:=cella_cibo;
campo_array[24,6]:=cella_muro;
campo_array[24,7]:=cella_cibo;
campo_array[24,8]:=cella_muro;
campo_array[24,12]:=cella_muro;
campo_array[24,14]:=cella_muro;
campo_array[24,18]:=cella_muro;
campo_array[24,19]:=cella_cibo;
campo_array[24,20]:=cella_muro;
campo_array[24,22]:=cella_muro;
campo_array[24,23]:=cella_muro;
campo_array[24,24]:=cella_muro;
campo_array[24,25]:=cella_cibo;
campo_array[24,26]:=cella_muro;
campo_array[24,27]:=cella_cibo;
campo_array[24,28]:=cella_muro;
campo_array[25,0]:=cella_muro;
campo_array[25,1]:=cella_cibo;
campo_array[25,2]:=cella_muro;
campo_array[25,4]:=cella_muro;
campo_array[25,5]:=cella_cibo;
campo_array[25,6]:=cella_muro;
campo_array[25,7]:=cella_cibo;
campo_array[25,8]:=cella_muro;
campo_array[25,12]:=cella_muro;
campo_array[25,14]:=cella_muro;
campo_array[25,18]:=cella_muro;
campo_array[25,19]:=cella_cibo;
campo_array[25,20]:=cella_muro;
campo_array[25,22]:=cella_muro;
campo_array[25,23]:=cella_cibo;
campo_array[25,24]:=cella_cibo;
campo_array[25,25]:=cella_cibo;
campo_array[25,26]:=cella_muro;
campo_array[25,28]:=cella_muro;
campo_array[26,0]:=cella_muro;
campo_array[26,1]:=cella_cibo;
campo_array[26,2]:=cella_muro;
campo_array[26,3]:=cella_muro;
campo_array[26,4]:=cella_muro;
campo_array[26,5]:=cella_cibo;
campo_array[26,6]:=cella_muro;
campo_array[26,7]:=cella_cibo;
campo_array[26,8]:=cella_muro;
campo_array[26,12]:=cella_muro;
campo_array[26,14]:=cella_muro;
campo_array[26,18]:=cella_muro;
campo_array[26,19]:=cella_cibo;
campo_array[26,20]:=cella_muro;
campo_array[26,21]:=cella_muro;
campo_array[26,22]:=cella_muro;
campo_array[26,23]:=cella_cibo;
campo_array[26,24]:=cella_muro;
campo_array[26,25]:=cella_cibo;
campo_array[26,26]:=cella_muro;
campo_array[26,28]:=cella_muro;
campo_array[27,0]:=cella_muro;
campo_array[27,1]:=cella_cibo;
campo_array[27,2]:=cella_cibo;
campo_array[27,3]:=cella_super_cibo;
campo_array[27,4]:=cella_cibo;
campo_array[27,5]:=cella_cibo;
campo_array[27,6]:=cella_cibo;
campo_array[27,7]:=cella_cibo;
campo_array[27,8]:=cella_muro;
campo_array[27,12]:=cella_muro;
campo_array[27,14]:=cella_muro;
campo_array[27,18]:=cella_muro;
campo_array[27,19]:=cella_cibo;
campo_array[27,20]:=cella_cibo;
campo_array[27,21]:=cella_cibo;
campo_array[27,22]:=cella_cibo;
campo_array[27,23]:=cella_super_cibo;
campo_array[27,24]:=cella_muro;
campo_array[27,25]:=cella_cibo;
campo_array[27,26]:=cella_cibo;
campo_array[27,28]:=cella_muro;
campo_array[28,0]:=cella_muro;
campo_array[28,1]:=cella_muro;
campo_array[28,2]:=cella_muro;
campo_array[28,3]:=cella_muro;
campo_array[28,4]:=cella_muro;
campo_array[28,5]:=cella_muro;
campo_array[28,6]:=cella_muro;
campo_array[28,7]:=cella_muro;
campo_array[28,8]:=cella_muro;
campo_array[28,12]:=cella_muro;
campo_array[28,14]:=cella_muro;
campo_array[28,18]:=cella_muro;
campo_array[28,19]:=cella_muro;
campo_array[28,20]:=cella_muro;
campo_array[28,21]:=cella_muro;
campo_array[28,22]:=cella_muro;
campo_array[28,23]:=cella_muro;
campo_array[28,24]:=cella_muro;
campo_array[28,25]:=cella_muro;
campo_array[28,26]:=cella_muro;
campo_array[28,27]:=cella_muro;
campo_array[28,28]:=cella_muro;
end
end
{Altrimenti se il file input esiste esso viene importato}
else begin
Assign(f,input);
reset(f);
a:=0; {si terrà traccia della posizione del valore che viene letto grazie ad a
che ad ogni iterazione verra incrementato di 1}
while not eof(f) do
begin
case a of
0: begin
{lettura della larghezza del campo. Essa è il primo valore in un file mappa}
read(f,larghezza);
{dimensione_x_campo ovviamente viene settato a larghezza-1.
dimensione_x_campo viene dunque visto come l'indice più alto della mappa}
dimensione_x_campo:=larghezza-1;
end;
1: begin
{lettura dell'altezza del campo. Essa è il secondo valore in un file mappa}
read(f,altezza);
{settaggio della dimensione del campo tramite l'apposito metodo}
settadimatrice(larghezza,altezza,true);
{stesso disorso di dimensione_x_campo}
dimensione_y_campo:=altezza-1;
end;
else begin
{dopo la seconda lettura vengono importati i dati riguardanti le signole celle
- esse vengono memorizzate su file nel seguente formato:
cella_salvata=(valore_contenuto*10000)+(x*100)+y
se per caso i valori salvati dovessero erroneamente essere fuori range semplicemente
non vengono considerati dato che se venissero utilizzati ne verrebbe fuori una violazione
d'accesso}
read(f,buffer);
if ((trunc((buffer mod 10000)/100)<=dimensione_x_campo) and ((buffer mod 100)<=dimensione_y_campo)) then
campo_array[trunc((buffer mod 10000)/100),(buffer mod 100)]:=trunc(buffer div 10000);
end;
end;
a:=a+1; {a++..tiene traccia dell'iterazione in corso}
end;
close(f);
{ assign(f,'debug.txt');
rewrite(f);
a:=0; b:=0;
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
begin
case campo_array[a,b] of
cella_muro: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=cella_muro;');
cella_cibo: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=cella_cibo;');
cella_super_cibo: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=cella_super_cibo;');
unwalkable_ghosts: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=unwalkable_ghosts;');
unwalkable_pacmen: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=unwalkable_pacmen;');
ghost: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=ghost;');
pacman: writeln(f,' campo_array['+inttostr(a)+','+inttostr(b)+']:=pacman;');
end;
end;
close(f);}
end;
{naturalmente quando il campo viene creato ancora nessuna entità è
registrata quindi numero_entita viene settato a 0}
numero_entita:=0;
{la traslazione del campo viene settata tramite questi due parametri
che sono stati passati al costruttore}
posizionex:=ascissa;
posizioney:=ordinata;
end;
{Restituisce il tipo di cella(ascissa,ordinata)}
function campo.get_stato_cella(ascissa,ordinata:smallint; editormode:boolean):byte;
var result:byte;
begin
{se la cella a cui si fa riferimento esiste viene restituito il suo valore.
Altrimenti viene viene restituita cella_vuota se il valore è proprio fuori range, se
questa cella esce dal range di poco (+1 o -1) allora viene restituito il contenuto
della cella presente dall'altro capo della mappa.}
if (((ascissa<=dimensione_x_campo) and (ordinata<=dimensione_y_campo)) and ((ascissa>=0) and (ordinata>=0))) then
result:=campo_array[ascissa,ordinata]
else
begin
if ascissa=dimensione_x_campo+1 then result:=campo_array[0,ordinata]
else if ascissa=-1 then result:=campo_array[dimensione_x_campo,ordinata]
else if ordinata=dimensione_y_campo+1 then result:=campo_array[ascissa,0]
else if ordinata=-1 then result:=campo_array[ascissa,dimensione_y_campo]
else result:=cella_vuota;
end;
if not editormode then
case result of
pacman: result:=cella_vuota;
ghost: result:=cella_vuota;
end;
get_stato_cella:=result;
end;
{restituisce il numero delle entità attualmente registrate nel campo}
function campo.get_numero_entita():byte;
begin
get_numero_entita:=numero_entita;
end;
{restituisce l'ascissa dell'entità il cui ID è indice}
function campo.get_x_entita(indice:byte):byte;
begin
get_x_entita:=xy_entita[indice,0];
end;
{restituisce l'ordinata dell'entità il cui ID è indice}
function campo.get_y_entita(indice:byte):byte;
begin
get_y_entita:=xy_entita[indice,1];
end;
{funzione che registra le entità nel campo. Ben documentata nella dichiarazione
della classe. E' al momento la principale candidata a risolvere il problema
delle posizioni iniziali dei fantasmi}
function campo.set_xy_entita(status:byte; needanid:boolean):registrazione;
var
a,b:byte;
found:boolean;
tmp:registrazione;
begin
a:=0;
b:=0;
found:=false;
tmp.id:=0;
tmp.x_iniziale:=0;
tmp.y_iniziale:=0;
if needanid then
begin
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
begin
if campo_array[a,b]=ghost then
begin
found:=true;
tmp.x_iniziale:=a;
tmp.y_iniziale:=b;
end;
end;
case found of
true: begin
{Il numero delle entità attualmente in gioco viene incrementato di 1}
numero_entita:=numero_entita+1;
{E il numero attuale viene restituito come id.
Di conseguenza chi prima si registra avrà un id più
basso chi si registra per ultimo avrà il più alto}
tmp.id:=numero_entita;
xy_entita[numero_entita,0]:=tmp.x_iniziale;
xy_entita[numero_entita,1]:=tmp.y_iniziale;
xy_entita[numero_entita,2]:=status;
campo_array[tmp.x_iniziale,tmp.y_iniziale]:=cella_vuota;
end;
false: begin
tmp.id:=-1;
tmp.x_iniziale:=0;
tmp.y_iniziale:=0;
end;
end;
end
else begin
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
begin
if campo_array[a,b]=pacman then
begin
found:=true;
tmp.x_iniziale:=a;
tmp.y_iniziale:=b;
end;
end;
case found of
true: begin
tmp.id:=1;
campo_array[tmp.x_iniziale,tmp.y_iniziale]:=cella_vuota;
end;
false: begin
repeat
tmp.id:=0;
randomize;
tmp.x_iniziale:=trunc(random()*dimensione_x_campo+1);
randomize;
tmp.y_iniziale:=trunc(random()*dimensione_y_campo+1);
until campo_array[tmp.x_iniziale,tmp.y_iniziale]<>cella_muro;
end;
end;
end;
{Vengono settati i dati iniziali passati dall'entita
che si sta registrando}
set_xy_entita:=tmp;
end;
{restituisce lo status dell'entità registrata con ID=indice
nessun controllo viene eseguito sul valore restituito
l'interpretazione viene lasciata al chiamante}
function campo.get_status_entita(indice:byte):byte;
begin
get_status_entita:=xy_entita[indice,2];
end;
{Le due funzioni seguenti restituiscono le coordinate
cartesiane dell'angolo in alto a SX del campo rispetto alla finestra
grafica in cui esso viene disegnato}
function campo.get_posizionex():byte;
begin
get_posizionex:=posizionex;
end;
function campo.get_posizioney():byte;
begin
get_posizioney:=posizioney;
end;
{Modifica il contenuto della cella(ascissa,ordinata) sostituendo ciò
che vi era prima con nuovo_valore. Viene eseguito un controllo sull'input
solo valori consentiti vengono settati}
procedure campo.mod_stato_cella(ascissa,ordinata,nuovo_valore:byte);
begin
if (((ascissa<=dimensione_x_campo) and (ascissa>=0)) and ((ordinata<=dimensione_y_campo) and (ordinata>=0))) then
begin
case nuovo_valore of
cella_vuota: campo_array[ascissa,ordinata]:=nuovo_valore;
cella_muro: campo_array[ascissa,ordinata]:=nuovo_valore;
cella_cibo: campo_array[ascissa,ordinata]:=nuovo_valore;
cella_super_cibo: campo_array[ascissa,ordinata]:=nuovo_valore;
unwalkable_ghosts: campo_array[ascissa,ordinata]:=nuovo_valore;
unwalkable_pacmen: campo_array[ascissa,ordinata]:=nuovo_valore;
pacman: campo_array[ascissa,ordinata]:=nuovo_valore;
ghost: campo_array[ascissa,ordinata]:=nuovo_valore;
else writeln('Valore non consentito!');
end;
end;
end;
{Ogni entità registrata fa ad essa riferimento per aggiorare la propria posizione
nel campo}
procedure campo.mod_xy_entita(indice,nuova_ascissa,nuova_ordinata:byte);
begin
xy_entita[indice,0]:=nuova_ascissa ;
xy_entita[indice,1]:=nuova_ordinata ;
end;
{Ogni entità registrata fa ad essa riferimento per aggiorare il proprio status}
procedure campo.mod_xy_status(indice,nuovo_status:byte);
begin
xy_entita[indice,2]:=nuovo_status;
end;
{Viene utilizzato solo nell'editor. Questo metodo esposporta la mappa nel file
output. Overwrite se settato a true consente la sovrascrittura automatica altrimenti
se settato a false non permette la sovrascrittura di file esistenti}
procedure campo.esporta_mappa(output:string; overwrite:boolean);
var
f:textfile;
a,b:byte;
scrittura_in_corso:boolean;
begin
{la stringa 0 viene riconosciuta come input non valido e
non viene esportata alcuna mappa. Ciò è finalizzato alla
gestione di alcune eccezzioni nell'editor}
if output<>'0' then
begin
scrittura_in_corso:=false; {scrittura_in_corso determina se alla fine la mappa vada esportata o no
viene inizialmente settata a false}
{$I-} Assign(f,output);
append(f); {$I+}
if IOResult=0 then
begin
if overwrite then {se il file esiste e overwrite è true allora viene sovrascritto
altrimenti non accade nulla e scrittura_in_corso viene lasciato false}
begin
rewrite(f);
scrittura_in_corso:=true;
end
end
else begin
{se il file non esiste allora viene creato}
rewrite(f);
scrittura_in_corso:=true;
end;
if not scrittura_in_corso then close(f) {se non si deve sovrascrivere il file f allora esso viene chiuso}
else begin
{altrimenti si passa alla scrittura}
write(f,dimensione_x_campo+1);
write(f,' ');
writeln(f,dimensione_y_campo+1);
{ricordo che cella_salvata=(valore_contenuto*10000)+(x*100)+y}
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
writeln(f,(campo_array[a,b]*10000)+(a*100)+b);
close(f);
end;
end;
end;
{Rappresenta un vuoto. Viene utilizzato nella rappresentazione
degli altri tipi di cella per pulire ciò che era contenuto
precedentemente nella cella}
procedure campo.rappresenta_vuoto(ascissa,ordinata:byte);
begin
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setviewport((ascissa*dimensione_cella)+1,(ordinata*dimensione_cella)+1,(ascissa*dimensione_cella)+dimensione_cella-1,(ordinata*dimensione_cella)+dimensione_cella-1,true);
clearviewport;
setviewport(0,0,getmaxx,getmaxy,false);
end;
{una cirsconferenza di colore giallo e di raggio 1 con un
puntino al centro rappresenta il cibo ordinario}
procedure campo.rappresenta_cibo(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(yellow);
circle((ascissa*dimensione_cella)+trunc(dimensione_cella/2)+1,(ordinata*dimensione_cella)+trunc(dimensione_cella/2)+1,1);
putpixel((ascissa*dimensione_cella)+trunc(dimensione_cella/2)+1,(ordinata*dimensione_cella)+trunc(dimensione_cella/2)+1,yellow);
setcolor(black);
end;
{un rettangolo rosso rientrato inattraversabile dai pacmen}
procedure campo.rappresenta_unwalkable_pacmen(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(red);
rectangle(((ascissa*dimensione_cella)+1),((ordinata*dimensione_cella)+4),((ascissa*dimensione_cella)+dimensione_cella-1),((ordinata*dimensione_cella)+8));
end;
{muro inattraversabile ne dai fantasmi ne dai pacmen}
procedure campo.rappresenta_muro(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(blue);
rectangle((ascissa*dimensione_cella)+1,(ordinata*dimensione_cella)+1,(ascissa*dimensione_cella)+dimensione_cella-1,(ordinata*dimensione_cella)+dimensione_cella-1);
setcolor(black);
end;
{delle palline di dimensione che varia a seconda di dimensione_cella
rappresentano il super cibo che mette i fantasmi in fuga e li indebolisce}
procedure campo.rappresenta_super_cibo(ascissa,ordinata:byte);
var a:byte;
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(yellow);
a:=0;
for a:=trunc(dimensione_cella/2)-4 downto 1 do
circle((ascissa*dimensione_cella)+trunc(dimensione_cella/2)+1,(ordinata*dimensione_cella)+trunc(dimensione_cella/2)+1,a);
putpixel((ascissa*dimensione_cella)+trunc(dimensione_cella/2)+1,(ordinata*dimensione_cella)+trunc(dimensione_cella/2)+1,yellow);
setcolor(black);
end;
procedure campo.rappresenta_unwalkable_ghosts(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(red);
line(ascissa*dimensione_cella+1,ordinata*dimensione_cella+1,ascissa*dimensione_cella-1+dimensione_cella,ordinata*dimensione_cella-1+dimensione_cella);
line(ascissa*dimensione_cella-1+dimensione_cella,ordinata*dimensione_cella+1,ascissa*dimensione_cella+1,ordinata*dimensione_cella-1+dimensione_cella);
setcolor(black);
end;
procedure campo.rappresenta_cella_ghost(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(green);
if dimensione_cella>=15 then SetTextStyle(CourierNewFont,HorizDir,2)
else SetTextStyle(CourierNewFont,HorizDir,1);
outtextxy(ascissa*dimensione_cella+2,ordinata*dimensione_cella,'F');
SetTextStyle(CourierNewFont,HorizDir,2);
end;
procedure campo.rappresenta_cella_pacman(ascissa,ordinata:byte);
begin
rappresenta_vuoto(ascissa,ordinata);
ascissa:=ascissa+posizionex;
ordinata:=ordinata+posizioney;
setcolor(orange);
if dimensione_cella>=15 then SetTextStyle(CourierNewFont,HorizDir,2)
else SetTextStyle(CourierNewFont,HorizDir,1);
outtextxy(ascissa*dimensione_cella+2,ordinata*dimensione_cella,'P');
SetTextStyle(CourierNewFont,HorizDir,2);
end;
{disegna il rettangolo di mappa di vertici (ascissa_A,ordinata_A,ascissa_B,ordinata_B)
se è in editor mode allora sarà possibile visualizzare anche i campi che normalmente il
gioco verrebbero omessio}
procedure campo.disegna_mappa(ascissa_A,ordinata_A,ascissa_B,ordinata_B:byte; editormode:boolean);
var a,b:byte;
begin
a:=0; b:=0;
for a:=ascissa_A to ascissa_B do
for b:=ordinata_A to ordinata_B do
case campo_array[a,b] of
cella_vuota: rappresenta_vuoto(a,b);
cella_muro: rappresenta_muro(a,b);
cella_cibo: rappresenta_cibo(a,b);
cella_super_cibo: rappresenta_super_cibo(a,b);
unwalkable_ghosts: begin
if not editormode then
rappresenta_vuoto(a,b)
else rappresenta_unwalkable_ghosts(a,b);
end;
unwalkable_pacmen: rappresenta_unwalkable_pacmen(a,b);
ghost: begin
if editormode then
rappresenta_cella_ghost(a,b)
else rappresenta_vuoto(a,b);
end;
pacman: begin
if not editormode then
rappresenta_vuoto(a,b)
else rappresenta_cella_pacman(a,b);
end;
end;
setcolor(white);
rectangle(posizionex*dimensione_cella,posizioney*dimensione_cella,(1+dimensione_x_campo+posizionex)*dimensione_cella+1,(1+dimensione_y_campo+posizioney)*dimensione_cella+1);
setcolor(black);
end;
{Viene utilizzato per ridimensionare il campo (solo nell'editor).
Se il campo non è ridoto ad una sola colonna o ad una sola riga
allora è possibile continuare a ridimensionarlo}
procedure campo.scala_campo(ascissa,ordinata:shortint);
begin
if (((ascissa>=-1) and (ascissa<=1)) and ((ordinata>=-1) and (ordinata<=1))) then
begin
if not ((length(campo_array)=1) or (length(campo_array[0])=1)) then
begin
setlength(campo_array,length(campo_array)+ascissa,length(campo_array[0])+ordinata);
dimensione_x_campo:=dimensione_x_campo+ascissa;
dimensione_y_campo:=dimensione_y_campo+ordinata;
end
else if ((length(campo_array)=1) or (length(campo_array[0])=1)) then
begin
if ((ascissa=1) or (ordinata=1)) then
begin
setlength(campo_array,length(campo_array)+ascissa,length(campo_array[0])+ordinata);
dimensione_x_campo:=dimensione_x_campo+ascissa;
dimensione_y_campo:=dimensione_y_campo+ordinata;
end;
end;
end;
end;
{svuota campo pulisce tutto il campo svuotando
dal loro contenuto tutte le celle}
procedure campo.svuota_campo;
var a,b:byte;
begin
a:=0; b:=0;
for a:=0 to dimensione_x_campo do
for b:=0 to dimensione_y_campo do
campo_array[a,b]:=cella_vuota;
end;
end.