Announcement

Collapse
No announcement yet.

NimmSpiel Strategie gesucht!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • NimmSpiel Strategie gesucht!

    Hallo, ist mein erster Beitrag hier erstmal zu meiner Person: Mein Name ist Kenan, bin 16 Jahre alt komme aus Österreich und gehe in eine HTL in den EDV zweig als Programierer!

    Nun zu meiner Frage:

    Ich suche eine Perfekte Strategie für mein NimmSpiel im Modus Spieler gegen Computer!
    Also wer das Nimm Spiel nicht kennt es geht darum das es 10 Hölzer gibt und wer das letzte gezogen hat hat verloren!

    Nun ich habe schon etwas Programiert aber meine Strategie ist leicht zu schlagen!
    aber ich muss noch einen Beitrag machen da mein Programm zu lange ist!


    mfg

    KENAN

  • #2
    [highlight=c#]

    static int ein;
    static int Hoelzer;
    static int compein;

    static void Main(string[] args){

    string[] Spieler = new string[3];
    string Gewinner;
    char again;
    char frag;
    int i;
    int z;
    Spieler[2] = "Computer";

    Console.Write("Gegen Computer<C> oder gegen einen anderen Spieler<S>: ");
    frag = Convert.ToChar(Console.ReadLine());
    while (frag != 'C' && frag != 'c' && frag != 'S' && frag != 's')
    {
    Console.WriteLine();
    Console.WriteLine("Fehler, man kann nur 'C' oder 'S' eingeben!");
    Console.Write("Gegen Computer<C> oder gegen einen anderen Spieler<S>: ");
    frag = Convert.ToChar(Console.ReadLine());
    Console.WriteLine();
    }//überprüfen ob richtiger Buchstabe eingegeben!


    if (frag == 'C' || frag == 'c')
    {
    do
    {
    i = 1;
    while (i < 2)
    {
    Console.Write("Spieler: ");
    Spieler[i] = Console.ReadLine();
    while (Spieler[i] == "Computer" || Spieler[i] == "computer")
    {
    Console.WriteLine("Bitte einen anderen Namen wählen, Sie heißen bestimmt nicht 'Computer'!");
    Console.Write("Spieler: ");
    Spieler[i] = Console.ReadLine();
    }
    Console.WriteLine();
    i++;
    }//Spieler namen einlesen!
    Gewinner = "";//Initialisieren
    Hoelzer = 10;
    ein = 0;
    while (Hoelzer != 0)
    {
    i = 1;
    while (i < 3 && Hoelzer != 0)
    {

    if (i == 1)
    {
    Console.WriteLine(Spieler[1] + ":");
    Console.WriteLine();
    Console.Write("Wie viele Stäbchen?<1,2,3>: ");
    ein = Convert.ToInt32(Console.ReadLine());
    BigSmall();
    max2();
    max1();
    Hoelzer = Hoelzer - ein;
    Console.WriteLine();
    Console.WriteLine("Genommen: " + ein);
    Console.WriteLine("Hölzer übrig: " + Hoelzer);
    }//wenn spieler 1 an der reihe
    compein = 0;
    if (i == 2)
    {
    Console.WriteLine(Spieler[2] + ":");
    Console.WriteLine();
    if (ein == 3)
    {
    compein = 1;
    }
    if (ein == 2)
    {
    compein = 2;
    }
    if (ein == 1)
    {
    compein = 3;
    }
    if (Hoelzer == 2)
    {
    compein = 1;
    }
    if (Hoelzer == 1)
    {
    compein = 1;
    }

    Hoelzer = Hoelzer - compein;//Die eingabe von den Hölzern abziehen

    Console.WriteLine("Genommen: " + compein);//Wieviel genommen?
    Console.WriteLine("Hölzer übrig: " + Hoelzer);//Wieviel Hözer übrig
    }//wenn Computer an der Reihe

    if (Hoelzer == 0)
    {


    Gewinner = Spieler[i - 1];
    if (Gewinner == null)
    {
    i++;
    Gewinner = Spieler[i];
    }
    }//Wenn letztes Holz gezogen Gewinner ausgeben!
    Console.WriteLine();

    i++;//Zähler erhöhen!
    }//solange zähler kleiner 3 und Hölzer nicht gleih 0
    }//solange Hölzer nicht gleich 0
    Console.WriteLine();
    Console.WriteLine("Gewinner: " + Gewinner);//Gewinner ausgeben!
    Console.WriteLine();
    Console.Write("Nochmal?<J,N>: ");//Fragen ob noch einmal
    again = Convert.ToChar(Console.ReadLine());
    if (again == 'j' || again == 'J')
    {
    Console.Clear();//Console löschen wenn neues spiel
    }
    Console.WriteLine();

    } while (again == 'J' || again == 'j');
    }//Wenn Modus Computer ausgewählt wird

    if (frag == 'S' || frag == 's')
    {
    do
    {
    for (i = 1; i < 3; i++)
    {
    Console.Write("Spieler" + i + ": ");
    Spieler[i] = Console.ReadLine();
    Console.WriteLine();
    }//Spieler 1 und 2 namen eingeben!

    i = 1;
    Gewinner = "";//Initialisieren
    Hoelzer = 10;
    while (Hoelzer != 0)
    {
    i = 1;
    while (i < 3 && Hoelzer != 0)
    {
    Console.WriteLine(Spieler[i] + ":");
    Console.WriteLine();
    Console.Write("Wie viele Stäbchen?<1,2,3>: ");
    ein = Convert.ToInt32(Console.ReadLine());
    BigSmall();//Zahl gtößer oder kleiner
    max2();//wenn nur 2 Hölzer da sind
    max1();//wenn nur 1 Holz
    Hoelzer = Hoelzer - ein;//Eingabe von Hölzern abziehen

    if (Hoelzer == 0)
    {
    Gewinner = Spieler[i - 1];//Gewinner ist wer nicht das letzte zieht
    if (Gewinner == null)
    {
    i++;
    Gewinner = Spieler[i];
    }//if Gewinner string leer Zähler wird erhöht
    }//if Hölzer = 0
    Console.WriteLine();
    Console.WriteLine("Genommen: " + ein);
    Console.WriteLine("Hölzer übrig: " + Hoelzer);
    Console.WriteLine();
    Console.WriteLine();
    i++;
    }//while Zähler kleiner 3 und Hölzer nicht gleich 0
    }//while Hölzer != 0
    Console.WriteLine();
    Console.WriteLine("Gewinner: " + Gewinner);
    Console.WriteLine();
    Console.Write("Nochmal?<J,N>: ");
    again = Convert.ToChar(Console.ReadLine());
    if (again == 'j' || again == 'J')
    {
    Console.Clear();
    }
    } while (again == 'J' || again == 'j');
    }//wenn Modus gegen einen anderen Spieler
    }//Main

    public static void BigSmall()
    {
    while (ein <= 0 || ein > 3)
    {
    Console.WriteLine();
    Console.WriteLine("Fehler, es könen nur 1, 2 oder 3 Stäbchen genommen werden!");
    Console.Write("Wie viele Stäbchen?<1,2,3>: ");
    ein = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine();
    }
    }//BigSmall

    public static void max2()
    {
    while (Hoelzer == 2 && ein > 2)
    {
    Console.WriteLine();
    Console.WriteLine("Fehler, es sind nur noch 2 Stäbe, also können max. 2 weggenommen werden!");
    Console.Write("Wie viele Stäbchen?<1,2,3>: ");
    ein = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine();
    BigSmall();
    }
    }//max2

    public static void max1()
    {
    if (Hoelzer == 1 && ein > 1)
    {
    Console.WriteLine();
    Console.WriteLine("Fehler, es sind nur noch 1 Stab, also kann max. 1 weggenommen werden!");
    Console.Write("Wie viele Stäbchen?<1,2,3>: ");
    ein = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine();
    BigSmall();
    }
    }//max1


    }
    }[/highlight]
    Zuletzt editiert von Kenan; 23.03.2009, 18:54.

    Comment


    • #3
      Crossposting ist nicht besonders beliebt. Wenn du also schon Leute in mehreren Foren beschäftigst dann bitte erwähnen dies in den jeweiligen Foren. Es ist nichts ärgerlicher als jemandem zu helfen und arbeit zu investieren um dann festzustellen das ihm woanders schon längst geholfen wurde.

      Du solltest die Erwähnung das du auch hier gepostet hast selbst im c-sharp-forum noch nachholen.

      Comment


      • #4
        Meine Idee wäre eine vollständige Statistik zu erstellen. Bei nur 3 Zugmöglichkeiten und max. 9 Zügen ist die Gesamtmenge aller möglichen Züge ja durchaus überschaubar. Also alle Spielfolgen durchgenerieren für jeden Zwischenstand kannst du dann berechnen mit welcher Wahrscheinlichkeit welcher der 3 möglichen züge zum Sieg führt. (Du mußt natürlich berücksichtigten das der Gegner dann jeweils auch denn für ihn günstigsten Gegenzug durchführt u.s.w).

        Dann jeweils einfach den Zug mit höchster Siegwahrscheinlichkeit ausführen.

        Comment


        • #5
          Das Spiel ist ein wenig langweilig, da bei deinem Spielfeld (1 Hölzchen auf der ersten Ebene, 2 auf der 2. Ebene, ... , 4 auf der letzten Ebene) auf jedenfall (vorrausgesetzt man kennt die Taktik) Spieler 1 gewinnt. Da du ja die perfekte Taktik suchst würde, wenn der Computer anfängt, immer er gewinnen. Wenn ein Spieler anfängt und einen Fehler macht, verliert er ebenfalls automatisch.

          Ich fände es bei diesem Punkt wesentlich interessanter die KI "lernfähig" zu machen, indem man beispielweise alle Entscheidungen des Computers, die zu einer Niederlage geführt haben, mitspeichert (aktuelles Bild, Zug des Computers) und dann, falls das Bild erneut auftaucht (sollte ja bei einem kleinen Spielfeld schnell passieren) diese Informationen wieder auswertet und den Computer einen alternativen Zug ziehen lässt. Beachten sollte man dabei, dass, wenn man immer den optimalen Zug (als beginnender Spieler) wählt, der Computer immer verliert und nie den "richtigen" Weg finden wird.

          Comment


          • #6
            erstmal danke für die schnelle antwort!

            hmm.. ich weiß ja schon das mit den zügen und das wenn der Computer anfängt gewinnen müsste aber ich weiß nicht wie ich es programieren soll!

            Ich habe mir vorgestellt das per Zufall entweder der Computer oder der Spieler anfängt!

            Das das Spiel langweilig ist finde ich auch aber das ist angabe! So wurde es uns in der Schule vorgegeben!

            könnte mir nicht jemand vielleicht einen kleinen Code zusammenstellen wie ich das umsetzen kann? Ich kann es mir irgendwie nicht vorstellen!

            mfg

            Kenan

            Comment


            • #7
              Sinnvoll waere es natuerlich vielleicht dort mit zahlen zu arbeiten....

              Ich hoffe ich kann dir das richtig erklaeren...jedenfalls hab ich das bei 4 gewinnt so gemacht und verlier grundsaetzlich gegen pc

              Also du musst dir dynamisch Faktoren setzen. wo ueberhaupt hingesetzt werden kann und welche mehr sinn machen als andere.

              Z.B.
              Absoluter sieg = faktor 999
              Absolute Niederlate = Faktor -1
              Moegliche nehmen/setzen =faktor 1
              und wenns geht musst du das mit 10 - 15 verschiedenen Faktoren machen fuer die Gewinnstrategie. Je nach dem wieviele zuege du vorher sehen willst. =)

              Ich hoffe du hast jetzt nicht zuviel davon > <

              Comment

              Working...
              X