[informatica] Java: Mastermind

Moderators: ArcherBarry, Fuzzwood

Reageer
Gebruikersavatar
Berichten: 768

Java: Mastermind

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:

Code: Selecteer alles


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!

Berichten: 7.068

Re: Java: Mastermind

Kijk eens goed naar de laatste "rij22 = true".

Gebruikersavatar
Berichten: 768

Re: Java: Mastermind

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!

Berichten: 7.068

Re: Java: Mastermind

Mijn variant:

Code: Selecteer alles

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;

}

Gebruikersavatar
Berichten: 768

Re: Java: Mastermind

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

Berichten: 7.068

Re: Java: Mastermind

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

Gebruikersavatar
Berichten: 768

Re: Java: Mastermind

Code: Selecteer alles


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 [font=helvetica, arial, sans-serif]{0,0,0,1,0,0,0,0,0,0} zijn. [/font]

EDIT: Oke, ik heb het al gevonden. Ingenieus systeempje.
Het Wetenschapsforum heeft ook een facebook pagina!

Reageer