Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [java] Aiuto per creare Mastermind - (cerco solo un aiuto, il lavoro lo faccio io)

    Ciao a tutti, sto provando a creare il gioco Mastermind in java, ma ho qualche problema nel scrivere il codice.
    Premetto che non chiedo a nessuno di voi di svolgere il lavoro al mio posto:P, ma soltanto di colmare le mie lacune.

    Per chi non lo conoscesse in Mastermind si ha un giocatore che deve indovinare un "codice segreto" composto dal suo avversario "software". Il codice segreto è di 7 cifre e per crearlo si hanno a disposizione le dieci cifre del sistema decimale standard (0,1,2,3,4,5,6,7,8,9). Una volta che il "software" ha composto il codice, il giocatore fa
    il suo primo tentativo, cercando di indovinarlo. Dopo ogni tentativo, il giocatore riceverà degli aiuti:

    -Il numero di cifre giuste al posto giusto; cioè le cifre del tentativo che sono effettivamente presenti nel codice al posto tentato.

    -Il numero di cifre giuste al posto sbagliato; cioè le cifre del tentativo che sono effettivamente presenti nel codice, ma non al posto tentato.

    Non si comunicherà quali cifre sono giuste o sbagliate, ma solo quante.
    Se il giocatore riesce ad indovinare il codice entro il numero di tentativi predeterminati (per es 9) allora quest'ultimo vince la partita, altrimenti vince il "computer"



    Vi riporto il codice:
    codice:
    import java.util.*;
    import java.io.*;
    
    
    class Mastermind {
    	public static void main (String argv[]) {
    	
    		System.out.print ("\n          __  __           _                    "+
                "\n         |  \\/  | __ _ ___| |_ ___ _ __        "+
                "\n         | |\\/| |/ _` / __| __/ _ \\ '__|      "+
                "\n         | |  | | (_| \\__ \\ ||  __/ |         "+
                "\n         |_|  |_|\\__,_|___/\\__\\___|_|        "+
                "\n\n              __  __ _           _     "+
                "\n             |  \\/  (_)_ __   __| |     "+
                "\n             | |\\/| | | '_ \\ / _` |    "+
                "\n             | |  | | | | | | (_| |      "+
                "\n             |_|  |_|_|_| |_|\\__,_|     ");
    	
    		  int a[]  = new int[7];
    		  Random generator = new Random();
    		  // per ogni elemento presente nella lista
    		  for (int i = 0; i < a.length; i++) {
    		  
    		      // creo un numero random e lo inserisco nella 
    		      // corrente posizione della lista
    		      a[i] = generator.nextInt(10);
    		  }
    
    
            
    	/* Per stampare la sluzione	  
    		for (int i=0; i<a.length; i++){	
    		System.out.print (a[i]);
    	} */	
    
    public String leggiStringaOpzionale() {
    	try{
    		String s = in.readLine();
    		return s.trim();
    	}
        catch (IOException e) {
        	System.out.println(e);
        	return "";
        }
    }
    	 
    		  
    public String leggiStringa() {
    	while(true){
    		String s = leggiStringaOpzionale();
    		if(!s.equals(""))
    			return s;
    	}
    }
    		  
    		  
    public int leggiNum() {
    	while(true) {
    		try{
    			String s = leggiStringa();
    			s = s.trim();
    			int num = Integer.parseInt(s);
    			return num;
    		}
    	    catch(NumberFormatException e) {
    	    	System.out.println("\n"+"Il valore inserito non rappresenta un numero intero.");
    	    	System.out.print("Ripetere l'inserimento:");
    	    }
    	}
    }
    	
    
    
    public int postoErrato(int[]a,int[]b){
    	int errato = 0;
    
    	for(int i=0; i<a.length; i++){
    		for(int j=0; j<b.length; j++){
    			if (a[i]==b[j]){
    				errato++;}
    		 }
            }
        return errato;
       }
    
    
    
    public int postoEsatto(int[]a, int[]b) {
    	int esatto=0;
    	
    	for (int i=0; i<a.length; i++){
    		if (a[i]==b[i]){
    		esatto++;}
    	 }
        }
    
    	
    				
     }
    }
    Per ora ho implementato solo la parte iniziale in cui viene generato l'array da scoprire e 4 metodi.
    Per quanto riguarda i metodi postoEsatto e postoErrato son sicuro di averli scritti nel modo corretto, ma non so per quale motivo eclipse mi da 3 errori di sintassi riguardanti le parentesi tonde e la virgola degli attributi del metodo (li trovate in grassetto nel codice).

    Invece i restanti metodi leggiNum, leggistringa e leggistringaOpzionale li ho copiati da un precedente progetto, ma nonostante ciò ho degli errori:
    Multiple markers at this line:
    - Syntax error, insert "Enum Identifier" to complete EnumHeaderName
    - Syntax error, insert "EnumBody" to complete the BlockStatement
    - Syntax error, on token "String"
    -LeggistringaOpzionale cannot be resolved to a type

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Per la gestione dei dati e dell'input ti suggerisco di trattarli come char, non int. Una volta che hai letto la riga in input ti basta verificare che non ci siano caratteri estranei (è sufficiente anche una banale espressione regolare) e poi ottenere l'array dei char.

    postoEsatto() concettualmente è ok. postoErrato() no, è sbagliata perché può trovare un numero uguale nella stessa posizione. Innanzitutto devi escludere i casi in cui i == j ma non basta!!! Devi fare la cosa in maniera molto più attenta e accurata. Prendiamo due numeri:

    1303
    2335

    Anche ammesso di escludere quando i=1/j=1 (i 3 nella seconda posizione), i tuoi cicli annidati farebbero trovare 3 cifre in posto sbagliato invece di 1 sola!!!!!
    Troveresti un match con i=1/j=2, con i=3/j=1 e con i=3/j=2. Solo l'ultimo match dovrebbe contare.

    Per il resto ... beh, ovviamente devi scrivere ancora un po' di codice. Ti consiglio magari di "incapsulare" la gestione/controllo del codice segreto in una classe a sé stante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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

    Moderazione

    Il codice va postato all'interno dei tag [code] e [/code] altrimenti risulta praticamente illeggibile.

    Modifico io il tuo post sostituendo ai tag QUOTE che hai usato, i tag CODE.

    Correggo anche il titolo: non servono troppe specificazioni.


    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

  4. #4
    Grazie per avermi risposto, seguirò il tuo consiglio riguardo la gestione dei dati e dell'input; ma in che modo limito il campo dei char ai soli numeri? Devo "giocare" con il codice ASCII?

    Cavolo non mi ero minimamente accorto dell'errore di postoErrato! Nel weekend cercherò di correggerlo.
    Ma perché mi da errore di sintassi nelle parentesi e virgola dell'argomento del metodo?


    Ti consiglio magari di "incapsulare" la gestione/controllo del codice segreto in una classe a sé stante.
    Avevo intenzione di farlo, ma dato che in futuro dovrò "trasferire il codice" su Android non vorrei complicarmi la vita :P
    http://www.redomino.com/it/labs/prog...e/cose-android

  5. #5
    In questi giorni mi son messo a lavoro cercando di correggere gli errori del metodo PostoErrato, per far questo mi sono avvalso di un terzo array ( c ) che mi tiene conto dell'indice in cui le posizioni dei numeri sono corrette, ossia quando a[i]==b[j]

    Vi riporto il corpo dei metodi:

    codice:
     int esatto=0;
    
            	
    
            	for (int i=0; i<a.length; i++){
    
            		if (a[i]==b[i]){
    
            			c[i]=1;
    
            			esatto++;}
    
            	 }
    
                
    
    
    
    
    
    
    
    
                
    
    			int errato = 0;
    
    
    
    			for(int i=0; i<a.length; i++){
    
    				if (c[i]==1) { continue;}
    
    				for(int j=0; j<b.length; j++){
    
    					if (c[j]==1){continue;} {
    
    					if (a[i]==b[j]) 
    
    						errato++;
    
    					    }
    
    				}
    
    	           }
    In questo modo riesco a risolvere problemi del tipo:
    a={1,3,0,3,2}
    b={2,3,3,1,2}

    Di fatti ho come output:
    Posizioni corrette:2
    Posizioni errate:2

    Il problema si crea quando ho array del tipo:
    a={1,3,0,3,2}
    b={2,0,3,1,2}
    O viceversa; in questo caso come output ho 4 posizioni errate invece che 3, poiché l'oggetto presente in b[2] me lo conta due volte.

    Come posso risolvere questo problema? Mi potreste dare qualche consiglio?

    Ringrazio anticipatamente tutto coloro che mi risponderanno

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.