Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Scacchi
Forum - C/C++ - Scacchi - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
chessmaster (Normal User)
Newbie


Messaggi: 10
Iscritto: 25/06/2011

Segnala al moderatore
Postato alle 12:53
Domenica, 26/06/2011
Beh nel mio caso non ci sarebbero classi giocatore in quanto il gioco si svolgerebbe solo in locale "passandosi" la tastiera.
Ma secondo te di che tipo è la matrice della scacchiera quindi?

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 15:02
Domenica, 26/06/2011
Testo quotato

Postato originariamente da Il Totem:

Testo quotato

Postato originariamente da comina8:

Beh io ti ho elencato una serie di funzioni se vuoi mettile in una classe ma non vedo il bisogno di oggetti in questo caso...



Uno abituato alla programmazione puramente imperativa non può vedere il bisogno di oggetti. Io al contrario li userei anche per lavarmi i denti XD

Comunque ha ragione chessmaster. La classe scacchiera è molto utile, tanto più che ogni concetto deve essere astratto da una classe: non potete programmare i pezzi e i giocatori usando oggetti e il campo di gioco con una semplice matrice. Questa matrice esisterà, certo, ma sarà inglobata in una opportuna astrazione. Inoltre entrambi i giocatori hanno bisogno di sapere la situazione di gioco e per questo devono riferirsi alla scacchiera.



Il prossimo anno faremo il C++ e ho provato a guardare un po' cosa offriva in più e detto fra noi non ho capito il vantaggio delle classi (come in questo caso d'altronde), spero di mettere le idee a posto il prossimo anno :)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:04
Lunedì, 27/06/2011
Testo quotato

Postato originariamente da chessmaster:

Beh nel mio caso non ci sarebbero classi giocatore in quanto il gioco si svolgerebbe solo in locale "passandosi" la tastiera.
Ma secondo te di che tipo è la matrice della scacchiera quindi?



Potrebbe essere una matrice di Pezzo.

PM Quote
Avatar
chessmaster (Normal User)
Newbie


Messaggi: 10
Iscritto: 25/06/2011

Segnala al moderatore
Postato alle 14:15
Lunedì, 27/06/2011
Ok allora creo una matrice di Pezzo. Quando però applico il metodo muovi() a un Pezzo gli devo anche passare la matrice giusto? Ed è normale dover passare la matrice ad un metodo che applico ad un elemento della matrice stessa?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:46
Martedì, 28/06/2011
Eheh, è proprio qui che volevo arrivare. Sembra strano, eh? Ma è così che si affrontano i problemi di progettazione.
Pensandoci un attimo possiamo concludere che il pezzo è effettivamente un oggetto e il tipo di pezzo che rappresenta è effettivamente una classe, poiché espone funzionalità e non solo dati. In questo caso, vogliamo che la funzionalità esposta sia quella di movimento, che è comune ad ogni pezzo ma che cambia a seconda del suo tipo. Questo si risolve ovviamente creando classi derivate. Ora il problema sta nel capire se la posizione del pezzo sulla scacchiera e la possibilità di muoversi appartengano al pezzo, alla scacchiera o al giocatore. Evidentemente non possono essere del giocatore, dato che, ancorché in grado di far muovere un pezzo, ne può sapere la posizione solo tramite la scacchiera; restano solo la scacchiera e il pezzo. Se le funzionalità appartenessero alla scacchiera allora nulla apparterrebbe al pezzo, poiché direbbe semplicemente il tipo e sarebbe quindi equivalente - concettualmente - a un intero. Dobbiamo concludere che la stessa classe Pezzo (e le sue derivate) dovrà incapsulare l'informazione della posizione e la funzionalità di movimento, poiché reciprocamente dipendenti. Ma a questo punto la scacchiera perde di significato come matrice, poiché le posizioni sono contenute nei pezzi: diventa quindi necessario vederla come una lista di pezzi, ognuno con le sue posizioni.
In questo modello, quindi, puoi richiamare Pezzo.Move(casella) e il pezzo si occuperà di fare tutto (e di dire se il movimento è possibile o meno). Analogamente potrai richiedere le possibili destinazioni tramite un ipotetico metodo GetMoves().

Se hai l'occhio avanti potrai rintracciare un ulteriore conflitto anche in questo modello. Infatti i pezzi sembrano sapere autonomamente le dimensioni della scacchiera, quando esse sono solo proprietà della scacchiera stessa. Tuttavia questo è molto più normale di quanto sembri. Infatti il pezzo non sa veramente quali sono le caselle della scacchiera, ma si limita a calcolare la sua posizione prendendo come riferimento il suo tipo di movimento e la posizione iniziale, che gli verrà assegnata proprio dalla scacchiera. Starà quindi alla scacchiera intervenire quando un pezzo tenta di muoversi al di fuori dei limiti consentiti e questo lo puoi gestire con degli eventi.
Puoi elaborare anche una soluzione in cui le caselle sono oggetti prodotti dalla scacchiera: in questo modo puoi allo stesso tempo far dipendere le posizioni dalla scacchiera e passarle come dato ai pezzi, senza che questi sappiano altro.

PM Quote
Avatar
chessmaster (Normal User)
Newbie


Messaggi: 10
Iscritto: 25/06/2011

Segnala al moderatore
Postato alle 14:06
Martedì, 28/06/2011
Vediamo se ho capito...tu proponi di creare una lista del tipo:
Pedone Bianco C 2
Regina Nero D 4
Re Nero C 3
...
giusto?
Ma se per esempio dovessi far avanzare la regina di 3 caselle dovrei per ogni casella che "attraversa" controllare che questa non ci sia nella lista (cioè che non contenga pezzi)...il che diventerebbe computazionalmente pesante, no?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:36
Mercoledì, 29/06/2011
Computazionalmente pesante è qualcosa del tipo 10^7~10^9 controlli al secondo. Qui stiamo parlando di al più 8 controlli. Ammettiamo pure che per ogni pezzo da muovere controlli 8 caselle in tutte le direzioni: sarebbero nel caso pessimo 4*8*16*32=16384 semplici uguaglianze da verificare (8 caselle in 4 direzioni per ogni pezzo del tuo colore per 32 poiché devi scorrere tutta la lista per verificare la presenza di una casella). Inoltre il calcolo è semplificato prendendo in considerazione un algoritmo pessimo e ammettendo che la scacchiera sia infinita (o almeno formata da 256 caselle).

Ultima modifica effettuata da Il Totem il 29/06/2011 alle 13:41
PM Quote
Avatar
chessmaster (Normal User)
Newbie


Messaggi: 10
Iscritto: 25/06/2011

Segnala al moderatore
Postato alle 13:42
Mercoledì, 29/06/2011
Resta però il problema che nel metodo mossa del pezzo devo passare la lista dei pezzi presenti sulla scacchiera...quindi siamo al punto di partenza, no?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo