"Unire" logica e grafica.

di il
8 risposte

"Unire" logica e grafica.

Ciao a tutti ragazzi, sono nuovo
Sto realizzando un progetto personale, per la precisione il gioco di carte Briscola. Mi sto focalizzando sul single player (umano vs computer), per poi aggiungere in futuro un comparto multiplayer.
Spero possiate aiutarmi perché sono decisamente bloccato. Ho programmato un po a "naso" e probabilmente mi sono complicato la vita (o forse no dai). Intanto vi accenno a com'è strutturato il programma.

Classi fondamentali:

1) Giocatore: Rappresenta l'utente umano con campi nome, le tre carte che possiede, metodi
get/set.

2) GiocatoreElettronico: Rappresenta il computer, carte che possiede, metodi get/set.

3) Carta: Rappresenta una generica carta da gioco, con campi Seme e Valore, metodi get/set tra cui specifico la presenza di metodi che dati il seme ed il valore mi ritornano l'immagine rappresentativa della carta.

4) Mazzo: Rappresenza un mazzo di carte tramite ArrayList. Metodi per estrarre una carta, mischiare il mazzo e altri metodi get/set di base.

5) Seme: Autoesplicativa.

6) Tavolo: Rappresenta il tavolo da gioco dove appunto vengono giocate le carte dai giocatori. Metodi get/set per permettere l'effettiva giocata delle carte. Questi sono i suoi campi:

private Carta pcTavolo; //Carta giocata dal pc
private Carta oldPcTavolo; //Carta precedente giocata dal pc
private Carta userTavolo; //Carta giocata dall'utente
private Carta briscolaTavolo; //Briscola
private Carta briscolaUltimaCarta; //Briscola scoperta sul tavolo che viene pescata alla fine
private Mazzo mazzo; //Nel tavolo è presente anche il mazzo di carte

7) GuiPartita: JFrame lanciato dalla finestra principale di avvio del gioco dove il gioco si svolge in maniera interattiva. Nel costruttore prende un riferimento alla classe Partita che ora vado ad introdurre.

Partita: Il cuore di tutto il gioco. Al costruttore passo un Giocatore, un GiocatoreElettronico
e un RecordClassifica). Non consideriamo il record classifica per adesso. Qui è presente tutta la logica del gioco. Mostro il metodo start():

private void start() {
		
		/* Controlla turno e stato del gioco dell'utente
         * e si ramifica in 4 possibili situazioni
         */

        /* turno PC */
        if(isTurnoPc()) {
        	System.out.println("E' il turno del pc.");
            /* user non ha giocato (inizio della mano) */
            if(!userHavePlayed) {
                giocoPcScarta();
            }
            
            /*user ha già risposto al gioco pc: calcolo punti e vincitore*/
            else {
                fineMano();
            }
        }
        
        /* turno user */
        else {
        	System.out.println("E' il turno del giocatore.");
            /* user non ha giocato (inizio della mano) */
            if(!userHavePlayed) {
                /* non accade nulla
                 * serve il gioco dell'utente
                 */        
            	System.out.println("Il computer sta attendendo la mossa del giocatore...");
            }
            
            /* user ha giocato e attende risposta pc */
            else {
            	System.out.println("Il giocatore ha giocato, il computer sta rispondendo...");
                giocoPcRisposta();   /* risposta pc */
                fineMano();          /* punti e vincitore */
            }            
        }
    }
Ora il mio problema è che non so come collegare la logica (che sembra funzionare) e la grafica. L'utente deve cliccare sulla carta che vuole giocare, essa deve quindi sparire e comparire nel tavolo ecc.. ecc. Girovagando in rete l'unica cosa che ho potuto intuire è che dovrei utilizzare
dei Thread all'interno di GuiPartita per far funzionare il tutto. Mi servono dei consigli più pratici, grazie

Ho verificato il funzionamento della logica implementando un semplice ascoltatore per le carte
del giocatore. La pressione di una carta (un JButton) avvia l'ascoltatore che comunica con
un metodo della classe Partita per fargli capire quale carta il Giocatore ha scelto di giocare.

8 Risposte

  • Re: "Unire" logica e grafica.

    Ok posso capire che questa discussione può spaventare In realtà chiedo soltanto qualche linea guida, come qualche esempio pratico (anche pseudocodice) di una classe manager tra la grafica e la logica oppure una struttura base di multithreading all'interno del JFrame

    Allego il file Partita.java con tutta la logica (è gigaenorme ma di facile comprensione).
    Edit: Ma che cavolo non sono allegabili ne .txt ne .java? XD
    Edit_2: Ho capito che NON devo usare il multithreading in una JFrame,è totalmente errato, e forse
    non mi serve in generale per come ho organizzato la logica. L'unica cosa che mi viene in mente è quindi creare una classe intermedia tra grafica e logica.
    Esempio:

    Nella classe Partita è il turno del Computer, la classe Partita invoca un metodo della classe intermedia che a sua volta chiama un metodo della classe GuiPartita che va ad aggiornare le carte.
    Non potrei fare così se fosse il turno del Giocatore perché il tutto deve avvenire alla pressione della carta voluta.
  • Re: "Unire" logica e grafica.

    Se vuoi solo una dritta, studiati il pattern MVC
  • Re: "Unire" logica e grafica.

    Ok, è già qualcosa. Mi pare di capire che non otterrò altro.. grazie lo stesso
  • Re: "Unire" logica e grafica.

    GCollector ha scritto:


    Ok, è già qualcosa. Mi pare di capire che non otterrò altro.. grazie lo stesso
    scusa ma è un periodod i merla....se ho tempo nel weekend giurò che ti dò una mano
  • Re: "Unire" logica e grafica.

    Sto provando qualche magheggio ora. Posso anche riuscirci ma rimane il problema che puoi premere i tasti quando vuoi mandando a quel paese i turni e generando una bella eccezione.
  • Re: "Unire" logica e grafica.

    Ciao anche se a distanza di tempo rispetto al tuo post ti rispondo io, o meglio vorrei confrontarmi con te in quanto anche io sto cercando di fare quello che hai fatto tu?
    vorrei anche io scrivere un programma che permette all'utente di giocare a briscola, ma poi a qualsiasi altro gioco di carte, con il computer. ora prescindere dalle interfacce grafiche a me interessa sapere come si puo implementare, come si puo fare, a far giocare il computer, cioe se si tratta di far rispondere al computer ok, ma io trovo delle difficolta a far prendere l'iniziativa ad esso.
    come si crea una rete neurale, in cui il computer apprende cio?
    non so se mi sono spiegato, cmq se puoi aiutarmi o dirmi come hai fatto tu, ti ringrazierei tantissimo
    ciao
  • Re: "Unire" logica e grafica.

    Ciao ragazzi, mi unisco alla discussione in quanto qualche mese fa ho realizzato anch'io una applicazione per giocare a briscola contro il computer.

    Metto subito le mani avanti: non sono disposto a postare/passare il codice dell'applicazione o di un'intera classe, ma sarò disposto se necessario a condividere alcune parti o più generalmente a fornire consigli.
    Questo non solo perché il tutto mi ha occupato per diverso tempo, ma soprattutto perché sono un programmatore alle prime armi e molte delle cose fatte sono sbagliate, se non addirittura inguardabili

    Quindi proverò a fare del mio meglio, ma prendete con le pinze ciò che dico, tutti gli altri utenti potranno in caso correggere tutto ciò che scrivo

    Per quanto riguarda il problema che premendo i tasti puoi mandare a quel paese i turni, non penso che questo sia complicato da risolvere, quando tu premi sulla carta da lanciare potresti far partire un thread che fa una serie di cose:

    - mette a false una variabile boolean che permette la scelta di una carta.Quindi in soldoni l'ascoltatore dei JButton che rappresentano le tue carte avranno un controllo che fa ritornare subito il metodo se tale variabile è false.
    - visualizza la carta scelta dall'utente (ad esempio la "sposti" dal pannello contenente le tue carte al centro del tavolo)
    - richiama un metodo (o una serie di metodi)che fa scegliere al computer la mossa appropriata.
    - visualizza la mossa del computer
    - "blocca" il thread per permettere all'utente di vedere la mossa effettuata per un certo tempo
    - controlla le carte scelte, sceglie chi ha vinto la mano, aggiorna i punti, fa pescare le carte...
    - se è il turno del computer esegue una nuova mossa
    - rimette a true la variabile boolean che permette la scelta di una carta

    Sono molte cose e si può parlare moltissimo di come gestirle, anche a livello di thread, per ora ho buttato queste cose lì, vedi se può esserti utile.

    Per quanto riguarda la scelta della mossa del computer, su questa parte ho agito solo di buonsenso, facendo un caos terribile e quasi un migliaio di righe di codice
    Provo a dare comunque l'idea di base che ho usato:

    - Quando il computer deve eseguire una mossa guardo prima in che turno di gioco siamo, questo perché ho creato metodi più specifici per gli ultimi turni di gioco, in cui ad esempio la scelta della mossa può essere influenzata dal fatto di voler prendere la briscola finale, o dal fatto che mancando poche carte è più facile agire in base al numero di briscole/carichi rimanenti in mano all'avversario.
    - Se siamo in un turno "standard" in linea di massima valuto a una ad una le carte, attribuisco a ciascuna un punteggio che rappresenta quanto buona è la scelta di tale carta, infine cerco il punteggio massimo che corrisponde alla scelta migliore
    - Per attribuire i punteggi cerco di creare delle casistiche abbastanza generali, e poi man mano le specifico sempre di più.
    Ad esempio prima vedo se la carta che sto guardando è una briscola, un carico, dei punti o una "scartina".Poi se ad iniziare è stato il giocatore devo anche controllare che carta ha scelto il giocatore, e qui davvero si muore con tutti gli if possibili
    Se invece comincia il computer la scelta è un po' più facile, tendenzialmente partiresti con una carta di valore basso ma anche qui possono entrare in gioco varie dinamiche (ad esempio una carta di un certo seme può essere più rischiosa da usare perché i corrispondenti carichi non sono ancora scesi)

    Non è molto lo so, ma come detto non sono un esperto e ci ho messo soprattutto tanta passione
    Se vi interessa qualcosa più in specifico proverò ad essere più chiaro
  • Re: "Unire" logica e grafica.

    Ma non puoi creare ad esempio una variabile turno dove vai ad assegnare due valori primo e secondo giocatore e ogni volta che fai una mossa con una semplice istruzione condizionale controlli di chi era il turno e lo cambi?
    static final int PRIMO_GIOCATORE = 1;
    static final int SECONDO_GIOCATORE =2;

    turno = (turno == PRIMO_GIOCATORE)? SECONDO_GIOCATORE : PRIMO_GIOCATORE;

    per vedere chi inizia nella variabile turno puoi far generare a caso un numero tra 1 e 2.
Devi accedere o registrarti per scrivere nel forum
8 risposte