Domanda Briscola in 4

Stato
Discussione chiusa ad ulteriori risposte.

mouse100

Utente Silver
22 Maggio 2012
88
3
35
66
Ultima modifica:
Salve, come progetto d'esame devo creare un gioco di briscola in 4, ovviamente in java.
Bene, il gioco è praticamente finito, ho finito tutte le classi e tutti i metodi utili al caso.
L'unico problema, enorme problema, è un metodo "VincitoreMano" cioè, quel metodo che prenda in input le 4 carte sul tavolo, e mi restituisca la carta vincente in quella mano . Ovviamente non mi serve che restituisca la carta in se, ma solamente la posizione del giocatore vincente, in modo da potergli assegnare i punti e soprattutto indicarmi chi comincerà a giocare la mano successiva.
Devo consegnare il progetto entro 15 giorni da adesso, ma nonostante io mi stia svenando per trovare un metodo efficacie, esso continua a restituirmi un vincitore sbagliato :( .

Ringrazio in anticipo i possibili benefattori che degneranno almeno di uno sguardo il problema.

P.S: Il metodo prende come parametri il tavolo (cioè un array delle 4 carte sul tavolo) e l'array che contiene i 4 giocatori.Ovviamente Giocatore e Carta sono classi già create. Se servono altre informazioni, chiedete pure.
 
Servirebbero più informazioni riguardo alla struttura della classi che hai già fatto.

Comunque potresti fare qualcosa di questo tipo (abbozzato molto alla buona giusto per farti capire li concetto):
Codice:
public static Giocatore VincitoreMano( .... )
{
    Carta cartaDominante = tavolo[0]; // domina la prima carta giocata
    int posGiocatoreDominante = 0;    // domina il primo giocatore
    
    // verifico se qualche altra carta la batte:
    //  se non hanno lo stesso seme di sicuro continua a vincere la vecchia carta dominante
    //  se hanno seme uguale confronto il loro valore
    //  nota: il valore della carta asso e' 11 (giusto per farti capire di cosa parlo)
    for(int it=1; it<4; it++)
    {
        if(tavolo[it].seme == briscola) // le briscole le gestisco come casi separati
        {
            if(tavolo[it].seme == cartaDominante.seme && tavolo[it].valore>cartaDominante.valore)
            { 
                // in questo la vecchia carta dominante era una briscola e tavolo[it] l'ha battuta
                cartaDominante = tavolo[it];
                posGiocatoreDominante = it;
            }
            else
            {
                // in questo caso la vecchia carta dominante non era una briscola, quindi perde
                cartaDominante = tavolo[it];
                posGiocatoreDominante = it;
            }
        }
        else if(tavolo[it].seme == cartaDominante.seme && tavolo[it].valore>cartaDominante.valore)
        {
            // esattamente come sopra, ma in questo caso tavolo[it] non e' una briscola
            cartaDominante = tavolo[it];
            posGiocatoreDominante = it;
        }
    }

    return Giocatore[it];
}

BTW:
Non ho testato niente e l'ho scritto così a pazzo giusto per darti un possibile procedimento, non ti stupire se c'è qualche errore.
 
Questo è l'algoritmo migliore che mi è venuto in mente, ma purtroppo , anche se concettualmente corretto, non funge,

public int DecretaVincitore(carta[] Tavolo, Giocatore[] Players)
{
int semewin = Tavolo[0].seme;
int valorewin = Tavolo[0].GetValore();

for(int i=0;i<Tavolo.length;i++)
{
if(Tavolo.briscola == true)
semewin = Tavolo.seme;

if(Tavolo.seme == semewin)
{
if(Tavolo.GetValore() > valorewin)
{valorewin = Tavolo.GetValore(); turno = i;}
}
}return turno;
}
 
Codice:
public int DecretaVincitore(carta[] Tavolo, Giocatore[] Players)
{
    int semewin = Tavolo[0].seme;
    int valorewin = Tavolo[0].GetValore();
    int turno = 0; // non avevi dichiarato la variabile turno

    for(int i=0;i<Tavolo.length;i++)
    {
        if(Tavolo[i].briscola == true && Tavolo[turno].seme != briscola)
        {
            valorewin = Tavolo[i].seme;
            semewin = Tavolo[i].seme;
            turno = i;
        }
        else if(Tavolo[i].seme == semewin)
        {
            if(Tavolo[i].GetValore() > valorewin)
            {
                valorewin = Tavolo[i].GetValore(); 
                turno = i; 
            }
        }
    }

    return turno;
}

Prova ora, se non capisci qualcosa chiedi pure.

BTW: leggi questo.
 
Ultima modifica:
Colpa mia che non ho dato informazioni sulle altre classi.
Il "turno" è un attributo della classe (la stessa classe che possiede il metodo in questione).
Tale classe, ha anche un metodo next, che, essendo Players[4] l'array contenente i 4 giocatori, funziona in tal modo:
Codice:
if (turno == 3)            turno = 0;
        else
            turno++;
Il turno mi serve, per richiamarlo nel metodo :
Codice:
public static void DaiCarta(Giocatore[] Players, carta[] Mazzo)    {
        for(int i=0;i<Players.length;i++)
        {
            boolean pescato = false;
            int j = 12;
                while(!pescato)
            {
                if(Mazzo[j] != null)
                {
                    Players[turno].Pesca(Mazzo[j]);
                    Next(Players);
                    Mazzo[j] = null;
                    pescato = true;
                }
                else j++;
            }
        }System.out.println("Tocca a " + Players[turno].GetNome() + " .");

Comunque, facendo altre print di prova, mi sono reso conto che il problema molto probabilmente sta nella classe giocatore, esattamente nel metodo :
Codice:
    public void Getta(int x, carta[] Tavolo)    {  
        x = Integer.parseInt(JOptionPane.showInputDialog(nome + " Seleziona la carta da gettare" + "\n" + "0 - " + Deck[0] + "\n" + "1 - " + Deck[1] + "\n" + "2 - " + Deck[2]));
        for(int i=0; i<4; i++)
        {
            if(Tavolo[i] == null)
                {
                Tavolo[i] = Deck[x];
                        }
                
        }
        System.out.println(nome + " ha gettato la carta : " +Deck[x]);
        Deck [x] = null;
    }
    }
Di fatti, se provo a mettere una print di prova Tavolo nell'if, come risultato ho sempre la stessa carta stampata 4 volte, come se Tavolo[0,1,2,3] fossero uguali, e non capisco il motivo.
Se nel main scrivo qualcosa del genere
Codice:
  Players[Giudice.turno].Getta(x,Giudice.Tavolo); Giudice.Next(Players);           Players[Giudice.turno].Getta(x,Giudice.Tavolo); Giudice.Next(Players);
               Players[Giudice.turno].Getta(x,Giudice.Tavolo); Giudice.Next(Players);
               Players[Giudice.turno].Getta(x,Giudice.Tavolo); Giudice.DecretaVincitore(Giudice.Tavolo, Players);
Tavolo[] dovrebbe riempire la "i"esima posizione con la carta gettata dall' "i"esimo giocatore, o almeno questo è quello che vorrei succedesse. Quindi molto probabilmente l'errore sta proprio nel metodo Getta().

P.S. Cosa ho fatto contro il regolamento? :O
 
Ultima modifica:
Non capisco come mai passi Players al metodo Next e non capisco come mai Getta accetta un parametro x che viene sovrascritto appena si entra nel metodo. Per gestire il mazzo (ma in generale anche tutte le carte) io userei una struttura dati tipo Stack e Vector, però vabbè non è qui il problema e non è nemmeno detto che ti sia concesso usare le strutture dati che ti mette a disposizione Java.


Comunque, facendo altre print di prova, mi sono reso conto che il problema molto probabilmente sta nella classe giocatore, esattamente nel metodo :
Codice:
    public void Getta(int x, carta[] Tavolo)    {  
        x = Integer.parseInt(JOptionPane.showInputDialog(nome + " Seleziona la carta da gettare" + "\n" + "0 - " + Deck[0] + "\n" + "1 - " + Deck[1] + "\n" + "2 - " + Deck[2]));
        for(int i=0; i<4; i++)
        {
            if(Tavolo[i] == null)
             {
                Tavolo[i] = Deck[x];
             }
                
        }
        System.out.println(nome + " ha gettato la carta : " +Deck[x]);
        Deck [x] = null;
    }
    }
Di fatti, se provo a mettere una print di prova Tavolo nell'if, come risultato ho sempre la stessa carta stampata 4 volte, come se Tavolo[0,1,2,3] fossero uguali, e non capisco il motivo.

Tavolo è tutto a null (suppongo sia voluto), una volta che scorri il for entri sempre nell'if e assegni ad ogni elemento di Tavolo[] il valore Deck[x] senza cambiare giocatore. I giocatori successivi perdono la loro carta dal Deck[], ma non entrano nell'if perché Tavlo[] l'ha riempito il Players[0]. Vedendo solo parte del codice ho una visione ristretta di quello che stai cercando di fare, ma suppongo che una roba del genere sia più appropriata:
Codice:
public void Getta(int i, carta[] Tavolo) // nota che ho cambiato nome al primo parametro   
{
    int x = Integer.parseInt(JOptionPane.showInputDialog(nome + " Seleziona la carta da gettare" + "\n" + "0 - " + Deck[0] + "\n" + "1 - " + Deck[1] + "\n" + "2 - " + Deck[2]));

    if(Tavolo[i] == null)    // imho si può anche evitare di mettere, se Tavolo[i] è null c'è qualche errore nel codice, ma lo lascio per sicurezza
    {
        Tavolo[i] = Deck[x];
        Deck[x] = null;      // se metti l'if (quindi c'è il rischio che la carta non venga giocata) devi rimuovere la carta solo se necessario, non sempre
    }
    
    System.out.println(nome + " ha gettato la carta : " + Deck[x]);
}

// nel main
    Players[Giudice.turno].Getta(Giudice.turno,Giudice.Tavolo); Giudice.Next(Players);    // non avevo idea di cosa fosse quella x
Questo supponendo che Deck[] sia il mazzo del giocatore, Tavolo[] siano le carte sul tavolo e x sia il turno del giocatore: in questo modo ogni giocatore richiama il metodo Getta che toglie una carta dal Deck[] del giocatore attuale e lo piazza nella sua rispettiva posizione su Tavolo[].


P.S. Cosa ho fatto contro il regolamento? :O
Non è un vero e proprio regolamento, sono solo delle linee guida per tenere le sezioni di programmazione più pulite. Comunque era per il tag [ CODE], se non lo metti si perde l'indentazione.
A proposito di indentazione, ti consiglio di perdere un po' di tempo a indentare tutto correttamente, con il codice ben ordinato alcuni errori saltano all'occhio prima; ad esempio in un codice che hai postato c'è una parentesi graffa di troppo, ma do per scontato che sia un errore di copy/paste.


PS.
Se hai la possibilità di postare tutto il codice mi sa che si fa prima, se per qualche ragione non hai la possibilità di farlo posso cercare comunque di aiutarti ma faccio fatica a capire quello che sti realmente cercando di fare. Cerca di essere il più dettagliato possibile quando mi descrivi le classi e i metodi che pensi abbiano a che fare con il tuo errore.
 
Ultima modifica:
Edit:

FINITO!

Giochino semplice e basilare, ma funziona perfettamente. Speravo di creare un' IA migliore, ma con la mia poca esperienza non potevo aspettarmi grandi cose.
Se qualcuno si trova nella mia stessa situazione e vuole risparmiarsi il lavoro (sconsiglio) o semplicemente vuole togliersi la curiosità, mandatemi un MP, non mi faccio problemi a condividere ;).
Grazie ancora dell'interessamento, St3ve.

P.S. Io non amo programmare (e mi chiedo ancora perchè abbia scelto questa facoltà) ma devo dire che il primo programmino "sensato" da una soddisfazione enorme. Molto meglio del classico "Hello World" :asd: .
 
Stato
Discussione chiusa ad ulteriori risposte.