4 Gewinnt Gewinnerkennung....



  • Hallo zusammen,

    ich muss für die Schule ein Programm schreiben also 4-Gewinnt als Spiel.

    Ich habe mit dem Borland builder eigentlich soweit alles schon fertig bis auf die Gewinnerkennung und da komm ich grade überhaupt nicht weiter.....

    Weiss nichtmal wie ich da anfangen soll hoffe ihr habt paar gute tipps oder ideen 🙂

    Hier mal der Quellcode:

    void begruessung (void)
    /* Die Funktion l�scht den Bildschirm und begr�sst die Spieler, anschliessend
    wartet sie, dass eine Taste gedr�ckt wird.
    */
    {
    int Taste;

    clrscr();
    gotoxy(22,10);
    printf(" ---------------------------------\n");
    gotoxy(22,11);
    printf("| Willkommen im Spiel VierGewinnt |\n");
    gotoxy(22,12);
    printf(" ---------------------------------");

    gotoxy(1,22);
    printf("\n\nBitte best\x84tigen Sie eine Taste um fortzufahren ");
    scanf("%i", &Taste);

    getchar();
    }
    //----------------------------------------------------------------
    void tschuess(void)
    /* Die Funktion l�scht den Bildschirm, verabschiedet die Spieler, anschliessend
    wartet sie, dass eine Taste gedr�ckt wird.
    */
    {
    clrscr();
    printf("Danke f\x81r Ihr Spiel! Um dieses Spiel zu beenden bet\x84tigen Sie bitte die Enter Taste ");
    }
    //----------------------------------------------------------------
    void zug(int *spieler)
    /* Die Funktion wird mit der aktuellen Spielernummer (1 oder 2) aufgerufen.
    Sie fordert den Spieler auf, einen Zug einzugeben (1..7) entsprechend
    Spalten. Sie prüft, ob die Eingaben g�ltig sind und ob die entsprechende
    Spalte frei ist. Falls nein, meldet sie das dem Spieler und fordert ihn auf,
    den Zug zu wiederholen.

    Ist schliesslich ein g�ltiger Zug eingegeben, dann setzt sie den entsprechenden
    Platz in der Variable feld (das nach unten Fallen der Steine muss berücksichtigt
    werden!)auf die Nummer des Spielers und kehrt zum aufrufenden Programm zurück.
    Gewinnfeststellung und Bildschirmaufdatierung sind nicht Bestandteil der
    Funktion, sondern werden separat danach ausgeführt.
    */
    {
    int spalte;

    clrscr();
    zeigeSpielfeld ();

    if (*spieler==1)
    {
    gotoxy(1,18);
    printf("Spielernr. 2 ist am Zug. Spalte: ");
    }
    else if (*spieler==0)
    {
    gotoxy(1,18);
    printf("Spielernr. 1 ist am Zug. Spalte: ");
    }

    scanf("%i", &spalte);

    if (spalte >= 1 && spalte <= 7)
    {
    int x=0, a=6;

    while (x == 0)
    {
    a--;
    if (feld [spalte-1][a] == 0)
    {
    x++;
    if (*spieler==0)
    {
    feld [spalte-1][a]=1;
    }
    else if (*spieler==1)
    {
    feld [spalte-1][a]=2;
    }
    }
    }
    }
    else if (spalte != 1 && spalte != 7)
    {
    printf("Bitte geben Sie erneut eine Zahl ein von 1 - 7 ");
    scanf("%i", &spalte);
    }

    }
    void spielerwechseln(int *spieler)
    {
    if (*spieler==0)
    {
    *spieler=1;
    }
    else if (*spieler==1)
    {
    *spieler=0;
    }
    }

    //------------------------------------------------------------------------------
    int gewinnerFeststellen(void);
    /*
    Die Funktion �berpr�ft alle das Spielfeld auf Gewinnsituationen
    ( 4 Steine horizontal, vertikal oder diagonal) anhand der globalen
    Variablen feld[][]. Sie kann als Ergebnis folgende Werte liefern:

    0: Spiel noch nicht zu Ende
    1: Spieler 1 gewinnt, Spiel zu Ende
    2: Spieler 2 gewinnt, Spiel zu Ende
    -1: unentschieden, alle Pl�tze besetzt, Spiel zu Ende
    */

    Tabelle hab ich mal weggeleassen 🙂

    Thx schonmal im vorraus


  • Mod

    Es gibt zwar ein paar sehr clevere Algorithmen (leicht bei Google zu finden), aber an deiner Stelle würde ich das einfach ganz naiv durch Prüfen aller Kombinationen aller Felder machen. Performance ist angesichts der geringen Felderzahl irrelevant.

    Falls du Schwierigkeiten hast, dies zu implementieren: Schreibe eine Funktion, die zu einem gegebenen Feld prüft, ob es Anfang einer Viererreihe ist. Diese Funktion rufst du einmal für alle Felder auf. Die Funktion geht einmal in jede der möglichen Richtungen durch die Felder und zählt, ob es genügend viele Felder in der passenden Farbe gibt.



  • SeppJ schrieb:

    Es gibt zwar ein paar sehr clevere Algorithmen (leicht bei Google zu finden), aber an deiner Stelle würde ich das einfach ganz naiv durch Prüfen aller Kombinationen aller Felder machen. Performance ist angesichts der geringen Felderzahl irrelevant.

    Was sind denn die sehr cleveren Algorithmen, die unter gegebenen Randbedingungen einsetzbar wären?


  • Mod

    klevery schrieb:

    Was sind denn die sehr cleveren Algorithmen, die unter gegebenen Randbedingungen einsetzbar wären?

    Die muss man schon selber finden können, sonst weiß man sie nicht zu schätzen.



  • klevery schrieb:

    SeppJ schrieb:

    Es gibt zwar ein paar sehr clevere Algorithmen (leicht bei Google zu finden), aber an deiner Stelle würde ich das einfach ganz naiv durch Prüfen aller Kombinationen aller Felder machen. Performance ist angesichts der geringen Felderzahl irrelevant.

    Was sind denn die sehr cleveren Algorithmen, die unter gegebenen Randbedingungen einsetzbar wären?

    Zunächst alles von http://www.c-plusplus.net/forum/317279?highlight=schiffe
    Das bringt schonmal fürchterlich viel Speed.

    Wobei "fürcherlich viel" sehr relativ ist, eine Versiebenfachung der Performance bringt nur einen Halbzug mehr Denktiefe. Man fährt als Programmierer da mit voll Karacho gegen eine Betonwand. Der Bot ist blöd und bleibt blöd. Sogar wenn man einen Intel I7 benutzt. Habe das damals mit einem 80286 programiergespielt. Mensch sieht 12 Halbzüge in manchen Stellungen locker, Recher ist blind wie ein Fisch.

    Danch aber bitte erst *danach* kannste Bitboards nehmen, die dürfen bei 4g noch einen kleinen Schub geben.

    Mit naivem Alpha-Beta-Pruning aber noch nicht stark genug gegen gute Menschen.

    Dann schau nach "Zobrist", "nagamx", "iterative deepening", evtl "cockoo hashing", "killer heuristic", "don knuth", und "chess programming".

    edit: Und steig nach dafür C++ auf. Für so Sachen haste dabei Null Performanceverlust, aber viel weniger und viel einfacheren Code mit der selben Wirkung.



  • volkard schrieb:

    klevery schrieb:

    SeppJ schrieb:

    Es gibt zwar ein paar sehr clevere Algorithmen (leicht bei Google zu finden), aber an deiner Stelle würde ich das einfach ganz naiv durch Prüfen aller Kombinationen aller Felder machen. Performance ist angesichts der geringen Felderzahl irrelevant.

    Was sind denn die sehr cleveren Algorithmen, die unter gegebenen Randbedingungen einsetzbar wären?

    Der Bot ist blöd und bleibt blöd.

    Ich dachte, es ginge darum aus einem gegebenen Feld festzustellen, wie der Spielstatus ist, nicht einen Bot zu bauen.

    Aber dein Beitrag (volkard) enthält trotzdem tolle Stichwörter, die werde ich mal genauer anschauen.



  • klevery schrieb:

    Ich dachte, es ginge darum aus einem gegebenen Feld festzustellen, wie der Spielstatus ist, nicht einen Bot zu bauen.

    Ich versuche, stets hilfreich zu sein. Im vorliegenden Fall habe ich mir den Kotzcode nicht näher angeschaut (aus Faulheit). Ich gehe vom Besten aus und helfe von da aus weiter. Wenns zu hoch war, kann ja eine Nachfrage folgen. Aber eigentlich nicht. Der Schiffe-Versenken-Thread passt doch gut, oder?

    klevery schrieb:

    Aber dein Beitrag (volkard) enthält trotzdem tolle Stichwörter, die werde ich mal genauer anschauen.

    "Buch macht kluch." Falls Du der Threadersteller bist, sollstest Du Dir vorher noch zwei Bücher reinzwiebeln, den Breymann und den Meyers. Sag dem Papa, daß ICH verlange, daß er Dir die beiden Bücher kauft. Das spart Dir drei bis vier Jahre und kostet fast nix. (Und beide sind spaßig genug, daß Du sie verschlingen wirst.)



  • SeppJ schrieb:

    Schreibe eine Funktion, die zu einem gegebenen Feld prüft, ob es Anfang einer Viererreihe ist. Diese Funktion rufst du einmal für alle Felder auf.

    Es reicht, die Funktion einmal mit dem letzten Spielzug aufzurufen. Gewonnen haben kann nur der, der zuletzt gezogen hat, und sein letzter Stein muss ggf. Teil der Reihe sein.


  • Mod

    klevery schrieb:

    volkard schrieb:

    klevery schrieb:

    SeppJ schrieb:

    Es gibt zwar ein paar sehr clevere Algorithmen (leicht bei Google zu finden), aber an deiner Stelle würde ich das einfach ganz naiv durch Prüfen aller Kombinationen aller Felder machen. Performance ist angesichts der geringen Felderzahl irrelevant.

    Was sind denn die sehr cleveren Algorithmen, die unter gegebenen Randbedingungen einsetzbar wären?

    Der Bot ist blöd und bleibt blöd.

    Ich dachte, es ginge darum aus einem gegebenen Feld festzustellen, wie der Spielstatus ist, nicht einen Bot zu bauen.

    Aber dein Beitrag (volkard) enthält trotzdem tolle Stichwörter, die werde ich mal genauer anschauen.

    Einige der Stichwörter führen auch zu den cleveren Boardprüfungen. Aber wie ich schon im ersten Beitrag schrieb:

    SeppJ schrieb:

    (leicht bei Google zu finden)

    Da du dazu wohl nicht in der Lage bist:
    http://stackoverflow.com/questions/7044670/how-to-determine-game-end-in-tic-tac-toe/7046415#7046415

    seldon schrieb:

    SeppJ schrieb:

    Schreibe eine Funktion, die zu einem gegebenen Feld prüft, ob es Anfang einer Viererreihe ist. Diese Funktion rufst du einmal für alle Felder auf.

    Es reicht, die Funktion einmal mit dem letzten Spielzug aufzurufen. Gewonnen haben kann nur der, der zuletzt gezogen hat, und sein letzter Stein muss ggf. Teil der Reihe sein.

    Die von mir vorgeschlagene Funktion reicht dafür nicht. Die kommt nämlich nicht mit Steinen in der Mitte klar. Dafür ist sie nochmals einen Tacken einfacher.



  • SeppJ schrieb:

    Die von mir vorgeschlagene Funktion reicht dafür nicht. Die kommt nämlich nicht mit Steinen in der Mitte klar. Dafür ist sie nochmals einen Tacken einfacher.

    Eigentlich nicht. Man prüft die 8 Richtungen vom letzen Stein aus und wenn zwei Gegenrichtungen zusammen vier haben, hat man den Sieg.

    Vollsuche braucht zwar nur vier Richtungen, aber verschachtelte Schleifen mit nichttrivialen Laufbedingungen.


Anmelden zum Antworten