tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
3732
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jan 2004
    Beiträge
    524
    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
     

  2. #2
    Avatar von port29
    port29 port29 ist offline deus.Server
    Registriert seit
    Dec 2001
    Ort
    Karlsruhe, Germany, Germany
    Beiträge
    856
    Dann hat dein Code aber nur eine begrenzte anzahl an stellen, in deinem Fall genau 6
     

  3. #3
    Registriert seit
    Jan 2004
    Beiträge
    524
    Das Ding soll einmalig einen 4-stelligen Code generieren, den es dann zu brechen gilt

    gruss
     

  4. #4
    Avatar von port29
    port29 port29 ist offline deus.Server
    Registriert seit
    Dec 2001
    Ort
    Karlsruhe, Germany, Germany
    Beiträge
    856
    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?
     

  5. #5
    Registriert seit
    Jan 2004
    Beiträge
    524
    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
     

  6. #6
    Avatar von port29
    port29 port29 ist offline deus.Server
    Registriert seit
    Dec 2001
    Ort
    Karlsruhe, Germany, Germany
    Beiträge
    856
    Zitat Zitat von tittli Beitrag anzeigen
    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
    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.
     

  7. #7
    Registriert seit
    Jan 2004
    Beiträge
    524
    Ist es mit dem contains() auch möglich, Strings abzufragen?
    So im Stil von if(codeReturn.contains(randomColor))

    gruss
     

  8. #8
    Registriert seit
    Jan 2004
    Beiträge
    524
    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
     

  9. #9
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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.
     

  10. #10
    Registriert seit
    Jan 2004
    Beiträge
    524
    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
     

  11. #11
    Registriert seit
    Jan 2004
    Beiträge
    524
    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
     

  12. #12
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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

  1. Mastermind mit Zahlen
    Von Borsti1982 im Forum Java
    Antworten: 11
    Letzter Beitrag: 11.01.11, 09:06
  2. Game: MasterMind unter die Lupe nehmen / testen :-)
    Von Kryptaesthesie im Forum Java
    Antworten: 0
    Letzter Beitrag: 17.08.07, 14:31
  3. Mastermind Treffer abfrage (Ich bin am Verzweifeln)
    Von desperade im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 7
    Letzter Beitrag: 06.07.07, 13:17
  4. Antworten: 2
    Letzter Beitrag: 27.03.07, 15:14