C'ho pensato un po (in ufficio si discuteva di gavettoni ai commerciali)
la mia idea semisviluppata è questa:
Codice PHP:
abstact class Pezzo
{
private $coordinate;
private $scacchiera;
abstract canMove($newCoordinate,$array);
abstract canEat($newCoordinate,$array);
public __construct($coordinate,$fazione){
$this->coordinate = $coordinate;
$this->fazione = $fazione;
}
public getFazione(){
return $fazione;
}
public getCoordinate()
{
return $coordinate;
}
}
class Pedone extends Pezzo
{
public canMove($newCoordinate,$array){
//todo
}
public canEat($newCoordinate,$array){
//todo
}
}
//da fare torre,cavallo,alfiere, regina, re
class Scacchiera
{
private $PezziScacchiera;
private $PezziMangiati;
public function Nuova(){
$this->PezziScacchiera = Array(); ///TODO sarebbe meglio fare oggetto
///per agiungere i pezzi qualcosa tipo
$this->PezziScacchiera["A"][3] = new Pedone(array("A",3),"Bianchi");
$this->PezziScacchiera["B"][3] = new Cavallo(array("A",3),"Bianchi");
...etc...
$this->PezziMangiati = Array();
}
public function Carica($IDpartita){
//todo carica scacchiera da database o file
}
private function Salva(){
//todo salva scacchiera nel database o file
}
Public function MuoviPezzo($CooDa,$CooA){
//TODO controllare se il pezzo da controllare esiste nell'array
$pezzoDaMuovere = $this->PezziScacchiera[$CooDa[0]][$CooDa[1]];
if(!$pezzoDaMuovere->canMove($CooA, $this->PezziScacchiera)){
//non puoi fare la mossa, un altro pezzo ti blocca o è finita la scacchiera.
throw new exception("Sono bloccato da un altro pezzo")
}
if(exist($this->PezziScacchiera[$CooA[0]][$CooA[1]])){
//esiste un oggetto nella destinazione
if(!$pezzoDaMuovere->canEat($CooA, $this->PezziScacchiera)){
//Può esistere il caso in cui un pedone non può mangiarne un altro?
throw new exception("Non posso mangiare!")
}
$this->PezziMangiati->Add($this->PezziScacchiera[$CooA[0]][$CooA[1]]); /*todo aggiungere l'oggetto all'array (->add inventato )*/
}
//TODO rimuovi dall'array $this->PezziScacchiera[$CooDa[0]][$CooDa[1]]
$this->PezziScacchiera[$CooA[0]][$CooA[1]] = $pezzoDaMuovere;
Salva();
}
}
Manca la gestione delle mosse che può fare un pezzo (non semplice) e altre cazzatine.
(gestione dei turni, punteggio, controllo di scacco)
Al posto di un array che rappresenta tutta la scacchiera ho preferito un array con tutte le pedine e le loro posizioni, volendo sarebbe possibile non inizializzare l'array con le classi ma con i valori degli array(si guadagna un pò di spazio), ma mi semplificava la vita.
canMove e canEat si potrebbero gestire in modo differente gestendo le eccezioni, ma non ho ancora pensato ad un sistema per le mosse.
le classi si chiamerebbero in questo modo.
Codice PHP:
$scacc = new scacchiera()
$scacc->Carica($idPartita);
try{
$scacc->MuoviPezzo(Array("A",1),Array("A",2))
echo "Mossa effettuata";
}
catch(Exception $e)
{
echo $e->getMessage();
}