chessmaster (Normal User)
Newbie
Messaggi: 10
Iscritto: 25/06/2011
|
Vorrei implementare il gioco degli scacchi in C++.
Ho pensato di creare una classe astratta Pezzo e le varie classi Pedone, Torre, Cavallo, Alfiere, Re, Regina che la estendono.
Non so però come gestire la scacchiera...quali altre classi mi conviene utilizzare?
|
|
a_butta (Member)
Expert
Messaggi: 578
Iscritto: 16/03/2010
|
Potresti vedere la scacchiera come una semplice matrice di tipo int bidimensionale che contiene in ogni casella l'ID del pezzo presente (o 0 se libera)... Secondo me una classe per la scacchiera è superflua... che ne dici?
|
|
chessmaster (Normal User)
Newbie
Messaggi: 10
Iscritto: 25/06/2011
|
Beh ad esempio il metodo che verifica se un giocatore è sotto scacco dove lo metto se non nella classe scacchiera? Il turno (bianco o nero) idem.
Più che altro ero dubbioso sul fatto di che tipo scegliere per la matrice bidimensionale...la soluzione che proponi tu da quanto ho capito non sfrutta molto gli oggetti...
|
|
a_butta (Member)
Expert
Messaggi: 578
Iscritto: 16/03/2010
|
Beh... Io il metodo che verifica lo scacco lo porrei nell'oggetto giocatore come restituente un valore di tipo bool... Per quanto riguarda invece il turno, si è vero potresti metterlo in una classe scacchiera... Mah secondo me risulta superfluo sfruttare molto gli oggetti sulla scacchiera... Oltre il parametro di turno e di matrice cos'altro potrà avere... Per la matrice non va bene il tipo int dell'ID del pezzo?
|
|
chessmaster (Normal User)
Newbie
Messaggi: 10
Iscritto: 25/06/2011
|
Se faccio la matrice di int come hai proposto, poi non posso fare ad esempio matrice[2][6].muovi(...) perchè non è un oggetto ma un intero...tu nel dettaglio come implementeresti le mosse utilizzando la matrice di int?
|
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
Avevo implementato un gioco di scacchi in C quindi penso di poter dare una mano.
Utilizzi una matrice m[8][8] che contiene in caratteri i vari pezzi:
char m[8][8]={'T','C',...
Un'altra matrice che contiene le caselle e indica se sono vuote o piene:
char m2[8][8]={-1,-1,...0,0,...,1,1,...}
Dove -1 sta per una casella occupata da un pezzo nero, 0 una casella vuota, 1 da un pezzo bianco.
Ogni volta che il giocatore inserisce delle coordinate iniziali e finali (gestite direttamente con le matrici) si controlla se a quella coordinata c'è un pezzo tuo e non è vuota, dopo di ciò bisogna controllare per ogni pezzo (e qui è un po' noioso) se effettivamente può andare alle coordinate finali:
if(m[y][x]=='P')
return controllo_pedone(cordinate...);
else ...
Se la funzione restituiva false vuol dire che può muoversi e allora disegni viceversa l'utente non può fare quella mossa e ripeti il ciclo.
Un'ulteriore accorgimento sarebbe quello di creare una variabile turno che viene inizializzata a -1 e ad ogni ciclo (turno appunto) viene moltiplicata per -1 quindi a questo rimando la seconda matrice.
Una volta finito i controlli per lo scacco non resta che scorrere tutta la matrice ed eseguire la funzione controllo_mossa() per ogni pezzo inserendo le coordinate iniziali del pezzo e le coordinate del re, se si può fare allora il re è sotto scacco perché esiste almeno un pezzo che può arrivare alle sue coordinate.
Spero di essermi spiegato decentemente dopo al massimo parliamo dello scacco matto che quello è un po' più complicato
|
|
chessmaster (Normal User)
Newbie
Messaggi: 10
Iscritto: 25/06/2011
|
Grazie delle indicazioni ma io volevo farlo in C++ per poter programmare ad oggetti...la tua proposta è completamente senza l'uso degli oggetti
|
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
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...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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. |
|