Springen naar inhoud

Java: Mastermind



  • Log in om te kunnen reageren

#1

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 18 januari 2013 - 16:58

Hallo iedereen,

ik worstel momenteel met deze vraag:

In het spelletje “Master Mind” is het de bedoeling een geheime code te raden. Deze geheime code bestaat uit N cijfers, waarbij dubbele elementen kunnen voorkomen. Een speler kan hierbij een aantal gokken wagen, waarbij hij als resultaat krijgt:
  • Het aantal correct gegokte cijfers dat ook op de correcte plaats staat (A).
  • Het aantal correct gegokte cijfers dat NIET op de correcte plaats staat (B). Hierbij worden de cijfers die
    op de correcte plaats staan, niet langer meegerekend. (De som van A en B bedraagt dus hoogstens N ).
    Je zal dus voor elk cijfer van het gegokte getal moeten nakijken of het bijdraagt tot categorie A, tot categorie B of tot geen van beide. Controle van een afzonderlijk cijfer uit het gegokte getal geeft steeds aanleiding tot precies e ́e ́n van onderstaande mogelijkheden:
    • het getal A neemt met 1 toe • het getal B neemt met 1 toe • noch A, noch B wijzigen
Ik doe het als volgt:
Je zet de strings op naar 2 rijen en we nemen ook 2 rijen van boolean's met dezelfde lengte als de andere 2. Gemakshalve gaan we er van uit dat dat de gebruiker een juist aantal cijfers ingeeft. De 2 rijen boolean's zetten we alletwee op false.

1) We kijken eerst naar A. We kijken dus of er cijfers zijn die gelijk zijn en op de zelfde plaats staan. Als dit zo is, dan vermeerderen we A met 1 en zetten we in beide boolean rijen de waarde op true van de desbetreffende elementen.

2) Nu moeten we kijken naar elementen die gelijk zijn en niet op dezelfde plaats staan. Dit doen we door te zeggen dat de waarden uiteraard gelijk moeten zijn en dat de beide waarden van de bijhorende boolean rij op false moet staan (anders is ze al gebruikt door A en dat willen we niet!). Hierdoor voorkomen we ook dat een element 2 keer gaat gebruikt worden.

Dit is mijn code:

public class Mastermind {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  int[] rij = mastermind("12989","91298");

  for(int i = 0; i<rij.length; i++){
   System.out.println(rij[i]+"  ");
  }
}
static public int[] mastermind (String gok, String echt){
  int A = 0;
  int B = 0;

  int[] rij1 = new int[gok.length()];
  int[] rij2 = new int[echt.length()];
  boolean[] rij11 = new boolean[gok.length()];
  boolean[] rij22 = new boolean[echt.length()];

  for (int i = 0; i<rij1.length; i++){
   rij1[i] = Integer.parseInt(""+gok.charAt(i));
   rij2[i] = Integer.parseInt(""+echt.charAt(i));
   rij11[i] = false;
   rij22[i] = false;
  }

  for (int i = 0; i<rij1.length; i++){
   if (rij1[i]==rij2[i]){
	A = A+1;
	rij22[i] = true;
	rij11[i] = true;
   }
  }

  for (int i = 0; i<rij1.length; i++){
   for (int j = 0; j<rij1.length; j++){
	if((rij1[i]==rij2[j])&&(rij11[i]==false)&&(rij22[j]==false)){
	 rij11[i] = true;
	 rij22[i] = true;
	 B = B+1;
	}
   }
  }
  int[] row = {A,B};
  return row;
}
}

Er moet ergens een piepkleine fout inzitten want als je 12989 invult als gok en 91298 als echt, dan zou hij A = 0 en B = 5 moeten geven, maar hij geeft B = 4.
Het Wetenschapsforum heeft ook een facebook pagina!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 18 januari 2013 - 19:34

Kijk eens goed naar de laatste "rij22[i] = true".

#3

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 18 januari 2013 - 20:04

oke, het moet rij22[j] = true. ik dacht al dat er een structurele fout zou inzitten omdat alles 'juist' was. Daar las ik dus altijd over. Ik had het nochtans gechecked op papier. In ieder geval, bedankt!
Het Wetenschapsforum heeft ook een facebook pagina!

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 18 januari 2013 - 21:31

Mijn variant:
static public int[] mastermind(String gok, String echt) {
   int A = 0;
   int[] rij1 = new int[gok.length()];
   int[] rij2 = new int[echt.length()];
   int[] nummers1 = new int[10];
   for (int i = 0; i<rij1.length; i++){
	  rij1[i] = Integer.parseInt(""+gok.charAt(i));
	  rij2[i] = Integer.parseInt(""+echt.charAt(i));
	  if (rij1[i]==rij2[i]){
		 A++;
	  }
	  nummers1[rij1[i]]++;
   }		
   int B = 0;
   for (int i = 0; i<rij2.length; i++){
	  if(nummers1[rij2[i]] > 0) {
		 B++;
		 nummers1[rij2[i]]--;
	  }
   }
   B -= A;  
   int[] row = {A,B};
   return row;
}

#5

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 18 januari 2013 - 23:24

Dat is wel merkelijk korter, kan je even zeggen wat je precies met die nummers1 rij doet?
Het Wetenschapsforum heeft ook een facebook pagina!

#6

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 19 januari 2013 - 10:57

In nummers1 houd ik bij hoevaak elk nummer voorkomt in rij1. Dus "12381" => {0,2,1,1,0,0,0,0,1,0}

#7

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 19 januari 2013 - 11:15

for (int i = 0; i<rij2.length; i++){
		  if(nummers1[rij2[i]] > 0) {
				 B++;
				 nummers1[rij2[i]]--;
		  }
   }

En waarom doe je wat je hier doet? Ik zie wel wat je doet, je rij nummers1 zal na uitvoering dan {0,0,0,1,0,0,0,0,0,0} zijn.

EDIT: Oke, ik heb het al gevonden. Ingenieus systeempje.

Veranderd door Kwintendr, 19 januari 2013 - 11:25

Het Wetenschapsforum heeft ook een facebook pagina!






Also tagged with one or more of these keywords: informatica

0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures