Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [Java] Separare la logica dalle gui

    Salve ragazzi

    Avrei bisogno di qualche consiglio per continuare un progetto personale che sto facendo. Sto creando il gioco briscola, in cui si può giocare sia contro il computer e sia contro un'altro giocatore (online). Per ora ho creato l'interfaccia principale, l'interfaccia per visualizzare
    le regole del gioco e l'interfaccia per visualizzare la classifica. Più una classe Classifica, una classe RecordClassifica, una classe ComparatoreRecordClassifica, una classe Carta, ed una classe Mazzo. Prima di progettare la parte multiplayer vorrei concentrarmi sulla parte singleplayer ma ho bisogno di consigli su come muovermi. Ho pensato a questo:

    1 - classe Giocatore

    Rappresenta l'utente che sta giocando. Campi: nome e le tre carte che possiede,
    RecordClassifica.

    2 - classe Avversario

    Rappresenta l'avversario. Campo nome: Computer (final), le tre carte che possiede.
    Dovrei gestire qui la sua intelligenza?

    3 - classe Partita

    Qui vorrei gestire l'esecuzione della partita.

    4 - classe GuiPartita

    Visualizza il tavolo da gioco e permette l'interazione con l'utente. Chiama i metodi presenti
    nella classe Partita.

    Dite che come impostazione è buona o devo modificare qualcosa?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Però la classe che contiene il main deve avere un' istanza di gui partita, cos' può interagire sia con la gui che con la parte logica (così c'è una netta separazione).
    Poi ti sarà inevitabile fare una classe carta, una classe mazzo di carte e forse anche una classe che calcola i punteggi.

  3. #3
    Si bhe infatti le ho fatte, l'ho scritto XD.

    Il main mi avvia soltanto la finestra principale. Dalla finestra principale cliccando su "Single Player" avvio la partita..

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Bene, vediamo come si sviluppano le cose.
    Posta qua di tanto intanto se c'è qualche problema.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Se, magari, riusciamo anche a centrare la sezione corretta...

    Sposto.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Si hai ragione, me ne sono accorto un attimo in ritardo

  7. #7
    Posto le classi di Giocatore ed Avversario, per eventuali consigli e/o correzioni.

    Giocatore

    codice:
    package singleplayer;
    
    import java.util.HashSet;
    import carta.Carta;
    import classifica.RecordClassifica;
    
    public class Giocatore
    {
    	private String nome;
    	private RecordClassifica dati;  //per la classifica
    	private HashSet<Carta> carte;   //le carte in mano al giocatore
    	
    	public Giocatore(String nome) {
    		this.nome = nome;
    		dati = new RecordClassifica(nome);
    		carte =  new HashSet<Carta>();
    	}
    	
    	public int quanteCarte() {
    		return carte.size();
    	}
    	
    	public void setCarta(Carta c) {
    		carte.add(c);
    	}
    	
    	public void rimuoviCarta(Carta c) {
    		carte.remove(c);
    	}
    	
    	public String toString() {
    		return "Giocatore: " + this.nome;
    	}
    	
    	/*Ho pensato ad una gestione degli eventi tramite stati.
    	 * All'inizio i giocatori sono entrambi nello stato ATTENDI.
    	 * A turno vanno nello stato GIOCA.
    	 */
    	
    	public static enum Stato {
    		ATTENDI, GIOCA
    	}
    	
    	Stato statocorrente = Stato.ATTENDI;
    	
    	public Stato getStato() {
    		return statocorrente;
    	}
    }
    Avversario

    codice:
    package singleplayer;
    
    import java.util.HashSet;
    import carta.Carta;
    
    public class Avversario {
    
    	private final String nome = "Computer";
    	private HashSet<Carta> carte;
    	
    	public Avversario() {
    		carte = new HashSet<Carta>();
    	}
    	
    	public int quanteCarte() {
    		return carte.size();
    	}
    	
    	public void setCarta(Carta c) {
    		carte.add(c);
    	}
    	
    	public void rimuoviCarta(Carta c) {
    		carte.remove(c);
    	}
    	
    	public static enum Stato {
    		ATTENDI, GIOCA
    	}
    	
    	Stato statocorrente = Stato.ATTENDI;
    	
    	public Stato getStato() {
    		return statocorrente;
    	}
    	
    	/*Qui gestisco l'intelligenza del computer?
    	 * A seconda della carta passata come argomento (la carta presente sul tavolo)
    	 * fa la sua mossa.
    	 */
    	
    	public Carta mossa(Carta c) {
    		return null;
    	}
    }
    Ps: per rappresentare la Briscola è meglio estendere la classe Carta o inserire un flag nella classe carta?

    Aggiornamento: credo che sia meglio un flag. La carta Briscola non avrebbe dei campi in più rispetto ad una carta normale.

  8. #8
    Io la classe avversario l'avrei estesa da Giocatore in quanto condividono quasi le tutte le proprietà tranne che ovviamente la logica.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    tieni conto che Avversario e Giocatore sono due istanze di Giocatore, ricorda che con Giocatore aspetti l'input esterno, con computer lo piloti tu. A livello di logica (come hai scritto) non cambia, ergo è a monte la differenza, non nella rappresentazione del dato.

    Discorso Briscola: interessa saperlo nei punteggi, ma i semi (che è una proprietà di Carta) puoi rappresentarli con una ENUM e ti tieni, nella classe partita, l'indice del seme briscola. A questo punto penso che sai come fare per sapere se una carta è briscola oppure no.

    discorso separazione: cerca di scrivere le tue funzioni in modo che abbiano sempre input e diano l'output necessario, ci sarà un altro ente ad occuparsi di come generi questo input e questo output. In particolare, la tua funzione riceve una carta e decide cosa fare, non importa come tu crei la carta (a questo ci pensi dopo).

    In un secondo momento decidi che la carta la dai come grafica, o da console...ma come vedi la tua logica di gestione non cambia
    RTFM Read That F*** Manual!!!

  10. #10
    Originariamente inviato da valia
    tieni conto che Avversario e Giocatore sono due istanze di Giocatore, ricorda che con Giocatore aspetti l'input esterno, con computer lo piloti tu. A livello di logica (come hai scritto) non cambia, ergo è a monte la differenza, non nella rappresentazione del dato.
    Non credo di aver capito questa parte

    Comunque non l'ho specificato ma ho anche una classe (enum) Seme. Per la briscola me la sbrigo dai.

    Per la separazione tra grafica e logica continuo a confondermi. Non so se nella classe
    Partita(Giocatore g, Avversario a) devo fare solo le singole funzioni utili allo svolgimento della partita (1) o fare una funzione che si occupa proprio dello svolgimento della partita (2).

    Nel caso (1) allora la partita viene effettivamente eseguita nella classe GuiPartita (richiamando i metodi di Partita(..) tramite i listener associati all'interfaccia) che si occupa anche della grafica mandando a quel paese la separazione tra logica e gui. Anche se come soluzione mi sembra più semplice.

    Il caso (2) mi sembra un bel casino. Non saprei come farlo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.