Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 54

Discussione: Progettazione scacchi

  1. #1
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito Progettazione scacchi

    Vorrei gestire una partita di scacchi in PHP.
    Inizialmente avevo pensato ad una classe astratta Pezzo che veniva estesa dai vari pezzi degli scacchi.
    Creando un array di pezzi ottenevo la simulazione della partita.
    Poi però mi sono accorto che il metodo mossa() applicato all'oggetto pezzo non può spostare il pezzo all'interno dell'array.
    Avete qualche suggerimento su come impostare il mio progetto?

  2. #2
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    Come ho già detto in un altro in altro thread: il metodo mossa deve esser definito nella classe che incapsula l'array/matrice

    Quindi va definito nella classe Matrice/Scacchiera, questo è l'unico modo per permettere una visione globale di ogni posizione
    I pezzi possono esser visti come semplici oggetti passivi che si limitano a accettare o rifiutare di esser spostati in una determinata posizione

  3. #3
    Guest

    Predefinito

    Non per smontarti la foga eh, ma come pensi di gestire 'l'intelligenza' del pc? Se conosci le reti neurali allora ok, altrimenti penso che le mosse verranno scelte a caso.

  4. #4
    L'avatar di matt93
    matt93 non è connesso Utente
    Data registrazione
    01-09-2008
    Messaggi
    241

    Smile

    potresti usare un'array multidimensionale con un numero di elementi array pari al numero di righe, e questi elementi hanno come valore un'array contenente tanti zeri pari al numero di colonne. se la scacchiera è 2x2 diventa:

    Codice PHP:
    $scacchiera=array(
    array(
    0,0),
    array(
    0,0)
    );
    dopodichè inserisci per ogni cella dove va un pezzo l'ID del pezzo.
    per muoverlo setti il valore dell'array della posizione precedente a 0, e nella posizione nuova metti l'ID del pezzo, se la mossa è possibile.

    per gestire le mosse possibili, puoi usare un'array contenete le mosse possibili in x e y di ogni pezzo:

    Codice PHP:
    $pedina=array(array(0,1),array(0,-1));
    $alfiere=array(array(1,1),array(1,-1),array(-1,-1),array(-1,1));
    per il resto non so cosa ti convenga fare ^^

  5. #5
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    La prima cosa che mi viene in mente è un oggetto Scacchiera.
    L'oggeto scacchiera gestisce un array che definisce la scacchiera e una funzione muovipezzo(cooordinate)

    L'"attore" chiamerà l'oggetto scacchiera dicendo muovipezzo($da,$a)
    Muovipezzo creerà un oggetto del tipo contenuto dicendogli in che posizione è nell'array
    $_cavallo = new $cavallo($array,$da)
    e qualcosa tipo
    $_Cavallo->isMossaValida($a)
    per verificare se il pezzo può muovere dove vuole(occupato o bloccato)

    A questo punto aggiorni l'array e salvi nel DB (se vuoi)

    Non c'ho ragionato molto, ma astraendo molto il problema farei così.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  6. #6
    Guest

    Predefinito

    Mmm io farei invece una classe Scacchiera che non è altro che una matrice della grandezza della scacchiera. Poi farei una classe Pezzo, che interagisce con la scacchiera. Ora mi ci metto, vediamo che ne viene fuori ;).
    EDIT:
    Ecco ho creato la scacchiera per ora, adesso mi manca l'implementazione del gioco:
    Codice PHP:
    <?php
    class Scacchiera {
    public
    $sc = array();
    public function
    __construct() {
    for(
    $i=0;$i<8;$i++)
    for(
    $j=0;$j<8;$j++)
    $this->sc[$i][$j] = null;
    $arr = array(1,2,3,4,5,3,2,1);
    for(
    $i=0;$i<8;$i++) {
    $this->sc[0][$i] = new Pezzo($arr[$i]);
    $this->sc[1][$i] = new Pezzo(6);
    }
    for(
    $i=0;$i<8;$i++) {
    $this->sc[7][$i] = new Pezzo($arr[$i]);
    $this->sc[6][$i] = new Pezzo(6);
    }
    }
    }
    class
    Pezzo {
    public
    $tipo = null;
    public function
    __construct($id) {
    if(
    $id > 6)
    return
    false;
    else
    $this->tipo = $id;
    }
    }
    ?>
    Ultima modifica di gabryhacker : 14-08-2009 alle ore 10.18.49

  7. #7
    Guest

    Predefinito

    Codice:
     for($i=0;$i<8;$i++)
                for($j=0;$j<7;$j++)
    Hai le scacchiere rettangolari a casa :D ?

  8. #8
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Post

    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();
    }
    Ultima modifica di binarysun : 14-08-2009 alle ore 09.02.09
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  9. #9
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Proposta pericolosa: e se usassi una variabile globale per gestire la scacchiera?

  10. #10
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    A che pro?
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  11. #11
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    per renderla visibile ai vari metodi mossa()

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da stoner Visualizza messaggio
    Codice:
     for($i=0;$i<8;$i++)
                for($j=0;$j<7;$j++)
    Hai le scacchiere rettangolari a casa :D ?
    Piccola svista :D correggo subito xD

  13. #13
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Ma nella mia soluzione o in quella che stai facendo tu?

    Le variabili global nella programmazione ad oggetti vanno sempre limitate al'osso, solo se stretamente necessarie e difficilmente oggetti.
    Il pericolo delle global è che non sai chi le ha usate ed in che stato sono.

    Passare l'array scaccheira ogni volta non è un grosso problema, ricordati che viene passato un "puntatore" all'indirizzo dell'array, non fisicamente l'array.
    Oppure potresti passare il riferimento(ref) dell'arrray nella creazione dell'oggetto.

    Le vie degli oggetti sono infinite(out of bound exception!).
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  14. #14
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Si ma se l'array fosse una variabile globale non dovrei passare nemmeno il riferimento no?

  15. #15
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Si, puoi farlo, ma non è consigliabile.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  16. #16
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Dove posso trovare l'elenco dei vantaggi e degli svantaggi delle variabili gloabli?

  17. #17
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Io ho sempre ragione, questo ti deve bastare.

    Oppure principi dell'ingegneria del software.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  18. #18
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    - Come creo una variabile globale?
    - Altrimenti, come passo l'array alla funzione mossa?

  19. #19
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    fuori da ogni classe scrivi
    $variabilescacchi = "quelo che vuoi";

    PEr richiamarla basta fare
    $GLOBALS['variabilescacchi']

    Per passare una variabile ad una funzione basta fare
    public function Mossa($var){
    //al'interno della funzione hai a disposizione la variabile $var
    }
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  20. #20
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Se la mia variabile globale è un oggetto ci sono problemi?

  21. #21
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Citazione Originalmente inviato da tryhere Visualizza messaggio
    Se la mia variabile globale è un oggetto ci sono problemi?
    Nessuno.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  22. #22
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    Citazione Originalmente inviato da tryhere Visualizza messaggio
    Se la mia variabile globale è un oggetto ci sono problemi?
    no, ma nel caso di PHP (che normalmente è utilizzato all'interno di pagine web) gli oggetti che devono continuare ad esistere tra una pagina e l'altra devono esser serializzati

  23. #23
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    cosa significa serializzati?

  24. #24
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Citazione Originalmente inviato da tryhere Visualizza messaggio
    cosa significa serializzati?
    Diciamo che la serializzazione di un oggetto (un istanza di una classe) è la trasformazione di una oggetto in formato testo(o xml)
    Lo scopo è avere qualcosa di salvabile per poter poi ricaricare l'oggetto nello stesso stato in un secondo momento.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  25. #25
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Ah sisi l'ho già gestito con XML.
    Ma in un array() posso inserire oggetti di classi diverse?

  26. #26
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Certo, nel mio esempio usavo appunto un array di oggetti.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  27. #27
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    quindi il codice che dovrò inserire nel costruttore sarà del tipo:
    Codice:
    $scacchiera=array();
    array[0][0]=new Torre();
    array[0][1]=new Alfiere();
    giusto?

  28. #28
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    non
    array[0][0]=new Torre();
    ma
    $scacchiera[0][0]=new Torre();

  29. #29
    tryhere non è connesso AlterVistiano
    Data registrazione
    19-09-2007
    Messaggi
    757

    Predefinito

    Il metodo mossa() è implementato in modo diverso nelle varie classi Torre, Cavallo ecc... nella classe astratta Pezzo devo comunque citarlo?
    Se si, come?

  30. #30
    L'avatar di AlexKidd
    AlexKidd non è connesso Altervistiano Junior
    Data registrazione
    09-02-2007
    Messaggi
    516

    Predefinito

    Nel PHP non essendoci una forte tipizzazione non è necessario ma una buona programmazione ad oggetti lo impone per motivi di chiarezza

    la dichiari cosi:
    abstract public function mossa();
    Ultima modifica di AlexKidd : 15-08-2009 alle ore 20.35.52

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •