Briscola in 4

di il
9 risposte

Briscola in 4

Salve, come progetto d'esame universitario 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.

9 Risposte

  • Re: Briscola in 4

    Ciao,
    immagino che l'oggetto "Carta" abbia due campi tipo "Seme" (o comunque si dica) e "Valore".
    Bene: secondo me puoi prendere come Seme_di_riferimento il seme della prima carta giocata ed assegnare la mano al giocatore che gioca la carta di quel seme ed avente valore più alto. Tutto questo se nessuno gioca briscole. Altrimenti dai la priorità alle briscole e anche qui prendi quella con il valore più alto.
  • Re: Briscola in 4

    Si, la carta ha valore e seme. Il seme è anch'esso un int, per evitare complessità con il tipo String.
    Ho fatto vari tentativi, in uno di questi creavo un "valorewin" ed un "semewin" dandogli i valori della prima carta sul tavolo.
    Successivamente, in un if(briscola) facevo partire un ciclo, dove controllavo ogni altra carta sul tavolo, e se fosse stata briscola procedeva con il controllo del valore. Se il valore era maggiore, il turno sarebbe cambiato in "i" e valorewin sarebbe diventato il valore della carta "i"
    Se la prima carta non era briscola, facevo partire un ciclo dove controllavo innanzitutto se la carta fosse briscola, in tal caso semewin sarebbe diventato il seme della briscola, valorewin il valore di carta e il turno "i". Se la carta non era briscola, controllava se il seme fosse uguale a semewin, in tal caso procedeva ancora con il controllo del valore e le istruzioni successive.

    Bene, concettualmente sembra funzionare, ma in pratica no.

    Questo è uno dei codici che ho provato:
    public int DecretaVincitore(carta[] Tavolo, Giocatore[] Players)
    	{
    		if(Tavolo[0].briscola == false)
    		{
    			int semewin = Tavolo[0].seme;
    		        int valorewin = Tavolo[0].GetValore();
    			boolean briscolatmp = false;
    			
    		        if(Tavolo[1].briscola == true)
    		        {turno = 1; semewin = Tavolo[1].seme; valorewin = Tavolo[1].GetValore(); briscolatmp = true;}
    			else if(Tavolo[1].briscola == false && Tavolo[1].seme == semewin && Tavolo[1].GetValore() > valorewin)
    			{turno = 1; valorewin = Tavolo[1].GetValore();}
    			
    			
    			if(briscolatmp == false)
    			{
    			   if(Tavolo[2].briscola == false && Tavolo[2].seme == semewin && Tavolo[2].GetValore() > valorewin)
    			   {turno = 2; valorewin = Tavolo[2].GetValore();}
    			   else if(Tavolo[2].briscola == true)
    			   {briscolatmp = true; valorewin = Tavolo[2].GetValore(); semewin = Tavolo[2].seme; turno = 2;}
    			   
    		        }
    			else if(briscolatmp == true)
    			{
    				if(Tavolo[2].briscola == true && Tavolo[2].GetValore() > valorewin)
    				{turno = 2; valorewin = Tavolo[2].GetValore();}
    				
    			}
    		
    			
    			if(briscolatmp == false)
    			{
    				if(Tavolo[3].briscola == true)
    				{briscolatmp = true; valorewin = Tavolo[3].GetValore(); turno = 3; semewin = Tavolo[3].seme;}
    				else if(Tavolo[3].briscola == false && Tavolo[3].seme == semewin && Tavolo[3].GetValore() > valorewin)
    				{turno = 3; valorewin = Tavolo[3].GetValore();}
    			
    			}
    			else if(briscolatmp == true)
    			{
    				if(Tavolo[3].briscola == true && Tavolo[3].GetValore() > valorewin)
    				{turno = 3; valorewin = Tavolo[3].GetValore();}
    			
    			}
    			
    		}
    	        else if(Tavolo[0].briscola == true)
    		{
    			int valorewin = Tavolo[0].GetValore();
    			
    			if(Tavolo[1].briscola == true && Tavolo[1].GetValore() > valorewin)
    			{turno = 1; valorewin = Tavolo[1].GetValore();}
    	
    			
    			if(Tavolo[2].briscola == true && Tavolo[2].GetValore() > valorewin)
    			{turno = 2; valorewin = Tavolo[2].GetValore();}
    		
    			
    			if(Tavolo[3].briscola == true && Tavolo[3].GetValore() > valorewin)
    			{turno = 3; valorewin = Tavolo[3].GetValore();}
    		
    			
    		}Tavolo[0] = null; Tavolo[1] = null; Tavolo[2] = null; Tavolo[3] = null; return turno;
    	}
    Il GetValore() restituisce il "peso" effettivo di quella carta, quindi un asso restituirà 12, un 4 restituisce un 4, e così via.
    Ovviamente all'inizio l'avevo fatto con dei cicli, non di certo così. Ma visto che non funzionava, ho provato a descrivere il comportamente caso per caso, ma anche in questo caso non funziona.
  • Re: Briscola in 4

    Confesso di non aver letto tutto il codice ma secondo me si può fare una cosa più semplice. Aspetti che tutte le carte siano state giocate, poi le scorri tutte:
    * se è stata giocata almeno una briscola assegni la mano alla briscola più alta
    * se non è stata giocata nemmeno una briscola assegni la mano alla carta più alta con seme uguale a quello della prima carta giocata.

    Ovviamente non ho scritto codice ma mi sembra piuttosto "semplice" come implementazione.

    PS. Può tornare utile avere a disposizione un metodo del tipo "Carta_piu_alta_seme(tavolo/carta, int seme)" al quale passi il tavolo (cioè le quattro carte giocate) e il seme che vuoi in modo che ti restituisca la posizione della carta più alta con quel seme.
  • Re: Briscola in 4

    Continua a non funzionare.
    Anche questo metodo sembra concettualmente corretto, e forse il più semplice e sintetico possibile.
    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[i].briscola == true)
    				semewin = Tavolo[i].seme;
    			
    			if(Tavolo[i].seme == semewin)
    			{
    				if(Tavolo[i].GetValore() > valorewin)
    				{valorewin = Tavolo[i].GetValore(); turno = i;}
    			}
    		}return turno;
    	}
    A questo punto ho provato a mettere delle print di prova, per scoprire dove sta il problema. I risultati mi hanno lasciato perplesso.

    Se provo a mettere una print di "ciao" nell'ultimo if (Tavolo.GetValore() > valorewin) il programma non stampa MAI "ciao". Come se non si entrasse mai in quell'if.
    Se provo a mettere la print di prova nel penultimo if(Tavolo.seme == semewin) il programma stampa SEMPRE 4 "ciao" come se si entrasse sempre in quell'if.
    Qualsiasi metodo abbia scritto fin'ora, il programma come "turno" mi restituisce sempre il precedente.
    Cioè, se turno = 3, dopo la chiamata il metodo il turno diventa 2, se turno = 0 dopo la chiamata turno = 3, ecc.

    A questo punto non capisco se l'errore sta nell'algoritmo oppure sia un mio banalissimo errore di scrittua (visto che non programmavo da molto in java).
  • Re: Briscola in 4

    Purtroppo io non vedo alcun errore nel codice che hai postato (anche se può darsi benissimo che io mi sbagli). Questo, insieme alla storia del messaggio "ciao" che viene stampato sempre o mai, mi farebbe sospettare un errore in altre parti del progetto, però prima di metterti a rivedere tutto prova ad attendere qualche altra risposta.
  • Re: Briscola in 4

    L'errore dovrebbe quindi stare nella classe carta, cioè :
    public class carta
    {
    	public int valore;
    	public int seme;
    	public int n;
    	boolean briscola = false;
    	
    	public carta(int seme, int valore)
    	{
    		this.valore = valore;
    		this.seme = seme;
    		n = (int) (1000*Math.random());
    		briscola = false;
    	}
    probabilmente nel metodo GetValore:
    public int GetValore()
    	{
    		switch(valore)
    		{
    		        case 1:return 12;
      		        case 2:return 2;
    			case 3:return 11;
    			case 4:return 4;
    			case 5:return 5;
    			case 6:return 6;
    			case 7:return 7;
    			case 8:return 8;
    			case 9:return 9;
    			case 10:return 10;
    		}
    		return valore;
    	}
    mentre il Tavolo è semplicemente :
    public static carta[] Tavolo = new carta [4];
    che si forma con il metodo della classe giocatore :
    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;
    L'errore deve quasi sicuramente essere in uno di questi metodi, ma non riesco a trovarlo.
  • Re: Briscola in 4

    Ho fatto un altra prova, ecco il risultato:
    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(Tavolo[i]);
    		}
    		System.out.println(nome + " ha gettato la carta : " +Deck[x]);
    		Deck [x] = null;
    La print di prova, con mia sorpresa, stampa sempre la stessa carta.
    Si ha quindi la quasi certezza che l'errore stia nel metodo getta, o comunque nel fatto che Tavolo[] non si formi per bene. Soluzioni al riguardo?
  • Re: Briscola in 4

    Questo è il download della cartella completa, se fosse interessati
    Se modificherò il codice, modificherò anche questo messaggio.
  • Re: Briscola in 4

    Finito, Adesso funziona alla perfezione. Semplice e banale, ma funziona alla perfezione.
Devi accedere o registrarti per scrivere nel forum
9 risposte