ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
3732
3732
EMPFEHLEN
-
Hallo
Ich soll in Java ein Mastermind erstellen. Hier die Methode, die automatisch einen Zufallscode erstellt:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
private void makeCode() { // To be implemented String randomColor = " "; String codeReturn = " "; for (int i = 1; i <= 4; i++) { int colorValue = (int)(Math.random() * 6) + 1; switch (colorValue) { case 1: randomColor = "y"; break; case 2: randomColor = "o"; break; case 3: randomColor = "r"; break; case 4: randomColor = "b"; break; case 5: randomColor = "g"; break; case 6: randomColor = "p"; break; } codeReturn = codeReturn + " " + randomColor; } System.out.println(codeReturn); }
Das ganze funktioniert so.
Nun würde ich das ganze aber gerne so erweitern, dass jede Farbe nur einmal im Code vorkommen kann. Ich stehe völlig auf dem Schlauch, hat irgend jemand eine Idee wie man das umsetzen könnte?
danke und gruss
-
26.10.08 20:14 #2
Dann hat dein Code aber nur eine begrenzte anzahl an stellen, in deinem Fall genau 6
-
Das Ding soll einmalig einen 4-stelligen Code generieren, den es dann zu brechen gilt

gruss
-
26.10.08 21:06 #4
Ups, habe die For Schleife übersehen.
Also möglichkeiten so etwas zu machen, gibt es viele, nur bin ich heute nicht kreativ genug, um "Die Lösung" zu präsentieren. Das hier ist jetzt nur eine Notlösung deines Problems. Den Code habe ich jetzt hier um Browserfenster geschrieben, daher keine Garantie auf Systax oder Tippfehler.
Deine Random Funktion habe ich mal extrahiert
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
private String getRandomColor(){ String randomColor; int colorValue = (int)(Math.random() * 6) + 1; switch (colorValue) { case 1: randomColor = "y"; break; case 2: randomColor = "o"; break; case 3: randomColor = "r"; break; case 4: randomColor = "b"; break; case 5: randomColor = "g"; break; case 6: randomColor = "p"; break; } }
Zunächst initialisierst du eine Liste von Strings und dein Code Return ding
Code :1 2
List<String> myCode = new List<String>(); String codeReturn = " ";
Und dann bastelst du dir eine While Schleife, die so lange läuft, bis der Code vollständig ist:
Code :1 2 3 4 5 6 7 8
while(myCode.size() <= 4){ String curColor = getRandomColor(); if(!myCode.contains(curColor)){ myCode.add(curColor); codeReturn += " " + curColor; } } System.out.println(codeReturn);
Ich bin der Meinung, dass es so t. Würde mich auf ein Feedback freuen, obs funktioniert.
PS: Ich habe jetzt nicht etwa deine Hausaufgabe gemacht, oder?
-
Danke schonmal für den Ansatz.
Also das mit der String-Liste habe ich nicht ganz verstanden, hab das noch nie gesehen. Ich bin blutiger Anfänger in Sachen Java
-
26.10.08 21:46 #6
Naja, es ist keine String Liste, sondern eine Liste (Dynamischer Datentyp), der Strings speichern kann. Eine Liste verfügt dabei um einige Funktionen. Du kannst z.B. abfragen, ob in der Liste bereits ein bestimmtes Objekt drinn ist. Du kannst auch die Anzahl aller Objekte in der Liste abfragen.
Die Idee hinter meinem Ansatz ist, dass das Programm so lange in der Schleife bleibt, bis 4 Objekte in der Liste sind = der Code besteht aus 4 Segmenten.
-
Ist es mit dem contains() auch möglich, Strings abzufragen?
So im Stil von if(codeReturn.contains(randomColor))
gruss
-
Verdammt, ich verzweifle gleich. Warum funktioniert folgender Code nicht? Das ganze endet in einer Endlos-Schleife...
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
public class test { public static void main(String[] args) { String randomColor = ""; String codeReturn = ""; String curCode = ""; int codeLength = 1; while (codeLength <= 3) { int colorValue = (int)(Math.random() * 6) + 1; switch (colorValue) { case 1: randomColor = "y"; break; case 2: randomColor = "o"; break; case 3: randomColor = "r"; break; case 4: randomColor = "b"; break; case 5: randomColor = "g"; break; case 6: randomColor = "p"; break; } curCode = curCode + randomColor; codeLength = codeReturn.length(); if(!curCode.contains(randomColor)) { codeReturn = codeReturn + randomColor; codeLength = codeReturn.length(); } } System.out.println(codeReturn); } }
danke und gruss
-
Hi benutze doch beim nächste mal statt 'code' 'java' dann wird dein Code auch formatiert.
Zu deiner Endlosschleife:
Code java:1 2
curCode = curCode + randomColor; if(!curCode.contains(randomColor))
contains gibt dir hier immer true, da du ja die Farbe schon vorher dranhängst. Daher geht er nie in den if-Block rein und deine Schleife bricht nie ab.
-
Hoppla, hab gar nicht gesehen dass es einen speziellen Formatierer gibt für Java...kommt nicht wieder vor.
Vielen Dank zeja und port29 für die Tipps, es funktioniert endlich so wie ich das wollte!!
jetzt gehts dann an die Auswertung...
gruss
-
So, langsam wirds peinlich....

Ich habe eine Methode, die mir einen 4-stelligen Zufallscode erstellt (und die auch funktioniert):
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
private void makeCode() { // To be implemented String randomColor = ""; int codeLength = 1; while (codeLength <= 3) { int colorValue = (int)(Math.random() * 6) + 1; switch (colorValue) { case 1: randomColor = "y"; break; case 2: randomColor = "o"; break; case 3: randomColor = "r"; break; case 4: randomColor = "b"; break; case 5: randomColor = "g"; break; case 6: randomColor = "p"; break; } codeLength = codemaker.length(); if(!codemaker.contains(randomColor)) { codemaker = codemaker + randomColor; codeLength = codemaker.length(); } } System.out.println(codemaker); }
So. Nun habe ich eine Methode, die eine Lösung des Spielers einliesst und diese auf Richtigkeit überprüft. Maximal sind 8 Vorschläge möglich. Auch die funktioniert:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
private void breakCode() { // To be implemented while(inc < 4 && guesses < MAX_GUESSES) { Scanner scn = new Scanner(System.in); String codebreaker = scn.nextLine(); char firstcolor = codebreaker.charAt(0); char secondcolor = codebreaker.charAt(2); char thirdcolor = codebreaker.charAt(4); char fourthcolor = codebreaker.charAt(6); if(codemaker.indexOf(firstcolor) != -1) { char first = codemaker.charAt(0); if (first == firstcolor) { System.out.println("Schwarz"); inc++; } else { System.out.println("Weiss"); } } if(codemaker.indexOf(secondcolor) != -1) { char second = codemaker.charAt(1); if (second == secondcolor) { System.out.println("Schwarz"); inc++; } else { System.out.println("Weiss"); } } if(codemaker.indexOf(thirdcolor) != -1) { char third = codemaker.charAt(2); if (third == thirdcolor) { System.out.println("Schwarz"); inc++; } else { System.out.println("Weiss"); } } if(codemaker.indexOf(fourthcolor) != -1) { char fourth = codemaker.charAt(3); if (fourth == fourthcolor) { System.out.println("Schwarz"); inc++; } else { System.out.println("Weiss"); } } guesses++; if (inc != 4) { inc = 0; } } }
So. Nun wurde uns eine Methode vorgegeben, die den Ablauf einer einzelnen Spielrunde festlegt. Diese Methode ruft die beiden obengenannten Methoden auf, zusätzlich noch die printRoundResult()-Methode, die am Ende das Ergebnis bekannt gibt (und die ich noch schreiben muss):
Code java:1 2 3 4 5 6
private void doRound() { makeCode(); breakCode(); printRoundResult(); }
So. Jetzt ist es meine Aufgabe, diese Methoden alle in einer play()-Methode zu vereinen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public void play() { System.out.println("Let's play Mastermind!"); System.out.println("For you guesses, write \"x x x x\" where x is a color code:"); System.out.println("y: Yellow \no: Orange \nr: Red\nb: Blue\ng: Green\np: Purple"); // TODO: Implement acutal loop Scanner scan = new Scanner (System.in); String cont = "y"; while (cont.equalsIgnoreCase("y")) { doRound(); System.out.println("Play another round? (y/n)"); cont = scan.nextLine(); } System.out.println(guesses); }
Man soll am Ende einer Spielrunde entscheiden, ob man eine weitere Runde spielen will oder nicht. Komisch ist jetzt aber: Ist eine Spielrunde abgeschlossen, wird kein neuer Code generiert, sondern der alte bleibt erhalten (ich lasse den Code auf die Konsole ausgeben, um das Testen zu vereinfachen).
Sieht jemand den Fehler?
Vielen Dank bereits im Voraus!
gruss
-
Du solltest dir mal angewöhnen mit Debug-Ausgaben zu arbeiten, um solche Fehler zu finden.
Ich denke es liegt daran, dass codemaker ein Feld ist und du dieses vor einer neuen Runde nicht zurücksetzt.
Ähnliche Themen
-
Mastermind mit Zahlen
Von Borsti1982 im Forum JavaAntworten: 11Letzter Beitrag: 11.01.11, 09:06 -
Game: MasterMind unter die Lupe nehmen / testen :-)
Von Kryptaesthesie im Forum JavaAntworten: 0Letzter Beitrag: 17.08.07, 14:31 -
Mastermind Treffer abfrage (Ich bin am Verzweifeln)
Von desperade im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 7Letzter Beitrag: 06.07.07, 13:17 -
[SUCHE] C++ Quellcode für Mastermind ohne Design Oberfläche
Von SViethy im Forum C/C++Antworten: 2Letzter Beitrag: 27.03.07, 15:14





Zitieren


Login





