4 Gewinnt



  • Hallo Leute, brauche hilfe, kann mir einer von euch helfen??? Brauche 4 Gewinnt in der Sprache Ansi C

    Semesteraufgabe Aufgabe

    Entwickeln Sie ein Programm, das „Vier gewinnt“ spielen kann.
    1. Ein interaktives Spiel ermöglichen und dabei einen der beiden Spieler ersetzen.

    2. Immer nur regelkonforme Züge machen und annehmen (was nicht schwer ist, da es
    immer nur max. 7 mögliche Züge gibt).

    3. Das Spielfeld mit dem aktuellen Spielzustand darstellen können (einfache wiederholte Ausgabe des Feldes in Farbe ASCII-Grafik genügt!).

    4. Erkennen, wenn einer der Spieler verloren hat, d.h. vier Steine horizontal, vertikal oder diagonal in einer Reihe liegen.
    5. Eine Gewinnstrategie haben.

    Kommentieren und formatieren Sie das Programm und benennen Sie die Variablen und
    Funktionen



  • Und wo genau liegt dein Problem?
    Ich denke nicht, daß dir jemand die Semesterarbeit abnehmen wird...



  • Du kannst zum Beispiel alle 7 möglichen Züge simulieren und schauen, wie gut die Situation für die KI aussieht. Dann bewertest du die - wenn der Computer beispielsweise mehr Steine als vorher in einer Reihe hat, positiv, wenn sich die Spielsituation nicht verändert, neutral, und wenn sich die Situation für den Gegner verbessert, negativ.

    Durch Rekursion kannst du nun bei den relevanten Zügen wiederum eine Ebene tiefer gehen und unterscheiden, welche Zugmöglichkeit sich am besten eignet. So gibst du schlussendlich an den Aufrufer einen Wert auf einer Skala zurück, der Auskunft darüber gibt, wie vorteilhaft ein Zug ist. Den Zug mit der besten Bewertung führst du aus.

    Ein kniffliger Punkt besteht - neben der Entscheidung, welche Spielsituationen als gut angesehen werden - darin, ein gutes Verhältnis zwischen Rekursionstiefe ("Intelligenz") und Rechenaufwand zu finden.



  • Du kannst zum Beispiel alle 7 möglichen Züge simulieren und schauen, wie gut die Situation für die KI aussieht.

    Ich würde erstmal ein Programm-Gerüst aufbauen, daß funktioniert. Zum Testen
    reicht da eine KI, die Zufallszüge macht. Wenn das User-Interface dann nicht
    mehr zum Haare-Ausreißen ist, kann man die KI verbessern; mit weniger Ärger
    im Großen und Ganzen.



  • flamer schrieb:

    daß funktioniert

    🙄



  • gas ganze sollte sich ohne große probleme vollständig lösen lassen, oder?
    wenn ich nicht grad auf dem schlacuh stehe gibts doch nur (7*7 feld angenommen) 7*(7*7) mögliche züge.
    Abwechslend immer 7 Möglichkeiten und dass 49mal.
    Eher weniger, weil man zum, schluss ja keine 7 optionen mehr hat, wenn eine Kammer voll ist, oder ein vorzeitiger Sieg errungen wurde.

    das heist mach einfach einen Baum, der alle zugfolgen enthält und wähl dann immer den zweig, bei dem du die höhere Gewinnwahrscheinliochkeit hast.

    BTW: ist son feld nicht 8x8 groß?



  • vlad_tepesch schrieb:

    gas ganze sollte sich ohne große probleme vollständig lösen lassen, oder?

    Ich bezweifle, dass Bits überhaupt vernünftig (oder überhaupt!) programmieren kann. Er postet ja hier einfach die Aufgabenstellung und verlangt eine fertige Lösung. Das sind üblicherweise die Leute, die weder Spaß an der Sache noch entsprechende Fähigkeiten haben...



  • _matze schrieb:

    Er postet ja hier einfach die Aufgabenstellung und verlangt eine fertige Lösung.

    ...die er wahrscheinlich nicht kriegen wird. aber ein paar tips kann man ihm ja geben. ich glaub' das hier könnte passen: http://en.wikipedia.org/wiki/Minimax
    🙂



  • Hallo,

    hat den keiner ein C code, für 4 Gewinnt???? Beispiel Code???

    mfg

    Bits 😋



  • #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    #define WIDTH 6
    #define HEIGHT 6

    enum field {
    EMPTY = 0,
    PL1,
    PL2
    };

    enum result {
    INV,
    USED,
    WON,
    NE,
    FULL
    };

    const int field_char[3] = { ' ', 'O', '#' };
    const int frame_char[2] = { '+', '-' };
    const char *player_str[2] = { "computer", "human" };

    enum field xy[WIDTH][HEIGHT];
    int xy_count = 0;

    void print_field(void)
    {
    int ix, iy;

    putchar('\n');

    for (ix = 0; ix < WIDTH; ix++)
    printf(" %d", ix+1);
    putchar('\n');

    for (ix = 0; ix <= WIDTH * 2; ix++)
    putchar(frame_char[ix%2]);
    putchar('\n');

    for (iy = 0; iy < HEIGHT; iy++)
    {

    putchar('|');
    for (ix = 0; ix < WIDTH; ix++)
    {
    putchar( field_char[ xy[ix][HEIGHT-iy-1] ] );
    putchar('|');
    }
    putchar('\n');

    }

    for (ix = 0; ix <= WIDTH * 2; ix++)
    putchar(frame_char[ix%2]);
    putchar('\n');

    for (ix = 0; ix < WIDTH; ix++)
    printf(" %d", ix+1);
    putchar('\n');

    putchar('\n');
    }

    int next_empty_y(int ix)
    {
    int iy;

    for (iy = 0; iy < HEIGHT; iy++)
    if (xy[ix][iy] == EMPTY)
    return iy;

    return -1;
    }

    int xy_pl(int player, int ix, int iy)
    {
    return ix >= 0 && ix < WIDTH &&
    iy >= 0 && iy < HEIGHT &&
    xy[ix][iy] == player;
    }

    enum result place(int player, int ix)
    {
    int tlbr_cnt = 0;
    int tmbm_cnt = 0;
    int mlmr_cnt = 0;
    int trbl_cnt = 0;
    int i, iy;

    if ( ( player != PL1 && player != PL2 ) ||
    ix < 0 || ix >= WIDTH )
    return INV;

    if ((iy=next_empty_y(ix)) == -1)
    return USED;

    xy[ix][iy] = player;
    xy_count++;

    #define CHECK4(player, ix, iy, counter) \
    for (i = 1; i <= 3; i++) \
    if ( !xy_pl(player,ix,iy) ) \
    break; \
    counter += i - 1;

    CHECK4(player, ix-i, iy-i, tlbr_cnt);
    CHECK4(player, ix+i, iy+i, tlbr_cnt);
    CHECK4(player, ix, iy-i, tmbm_cnt);
    CHECK4(player, ix, iy+i, tmbm_cnt);
    CHECK4(player, ix-i, iy, mlmr_cnt);
    CHECK4(player, ix+i, iy, mlmr_cnt);
    CHECK4(player, ix+i, iy-i, trbl_cnt);
    CHECK4(player, ix-i, iy+i, trbl_cnt);

    if ( tlbr_cnt > 2 ||
    tmbm_cnt > 2 ||
    trbl_cnt > 2 ||
    mlmr_cnt > 2 )
    return WON;

    return NE;
    }

    enum result human_new_pos(int player)
    {
    int new_x, c;

    printf( "player #%d (%c), new pos (1-%d): ",
    player, field_char[player], WIDTH );
    new_x = (c = getchar()) - '1';
    while (c != '\n')
    c = getchar();

    if ( new_x < 0 || new_x >= WIDTH )
    return INV;

    return place(player, new_x);
    }

    enum result computer_new_pos(int player)
    {
    static int randomize = 1;

    if (randomize)
    {

    srand(time(NULL));
    randomize = 0;
    }

    return place(player, (double)rand() / RAND_MAX * WIDTH);
    }

    enum result play_new_pos(int player, int human)

    {

    if (xy_count == WIDTH*HEIGHT)
    return FULL;

    return human ?
    human_new_pos(player) :
    computer_new_pos(player);
    }

    void init_field(void)
    {
    int ix, iy;
    for (ix = 0; ix < WIDTH; ix++)
    for (iy = 0; iy < HEIGHT; iy++)
    xy[ix][iy] = EMPTY;

    xy_count = 0;
    }

    void select_modus(int human[2])
    {
    int chosen, c;

    while (1) {

    printf("\n\n"
    "____Spiel___Modus________:\n"
    " 1 - Mensch gegen Mensch\n"
    " 2 - computer gegen Mensch\n"
    " 3 - Mensch gegen computer\n"
    " 4 - computer gegen computer\n"
    "Wähle (1-4): " );

    chosen = (c = getchar()) - '0';

    while (c != '\n')
    c = getchar();

    if (chosen >= 1 && chosen <= 4)
    break;
    else
    printf("invalid modus! select again...\n");
    }

    human[0] = chosen == 1 || chosen == 3;
    human[1] = chosen == 1 || chosen == 2;

    printf( "player #1: %s\n", player_str[human[0]] );
    printf( "player #2: %s\n", player_str[human[1]] );
    }

    void play(void)
    {
    enum result result;
    int human[2];

    select_modus(human);

    init_field();

    while (1)
    {
    print_field();

    do
    result = play_new_pos(PL1, human[0]);
    while ( result == INV || result == USED );

    if (result == WON)
    {
    print_field();
    printf( "player 1 (%s) won!\n\n", player_str[human[0]] );
    break;
    }
    else if (result == FULL)
    break;

    print_field();

    do
    result = play_new_pos(PL2, human[1]);
    while ( result == INV || result == USED );

    if (result == WON)
    {
    print_field();
    printf( "player 2 (%s) won!\n\n", player_str[human[1]] );
    break;
    }
    else if (result == FULL)
    break;
    }

    if (result == FULL)
    {
    print_field();
    printf("draw! no one won..");
    }
    }

    int main(int argc, char *argv[])
    {
    while (1)
    {
    play();
    printf("press <enter> to continue\n"
    "press <ctrl> + <c> to quit");
    while (getchar() != '\n')
    ;
    }

    exit(0);
    }



  • Kann mir keiner helfen, den code zu vereinfachen und ihn farbig darzustellen???



  • Bits schrieb:

    Kann mir keiner helfen, den code zu vereinfachen und ihn farbig darzustellen???

    farbig machste ihn, indem du [cpp] davorschreibst und [/cpp] dahinterschreibst.



  • Kann man mein code nicht vereinfachen????



  • Denke schon, aber ich wollte warten, bis du den Beitrag editierst, und die Code-Tags hinzufügst. Dann kann ich mir man: indent sparen.



  • Bits schrieb:

    Kann man mein code nicht vereinfachen????

    Doch, man kann ihn vereinfachen!!!!

    also nochmal zum mitschreiben:

    - du willst, daß man hier deine semesterarbeit für dich macht.

    - du läßt erkennen, daß du keinen schimmer vom programmieren hast und gerechterweise prächtig durchfallen solltest.

    - keiner mag dir die arbeit ganz abnehmen.

    - du baust code, und hättest deinen code gerne erklärt bekommen.

    - was? nee.

    - du klaust den code von http://www.easy-coding.de/4-gewinnt-t922.html und gibst ihn als deinen eigenen aus, damit jemand von uns darauf aufbaut und ihn anders macht.

    - jetzt wird die sicher keiner mehr helfen.



  • - du klaust den code von http://www.easy-coding.de/4-gewinnt-t922.html und gibst ihn als deinen eigenen aus, damit jemand von uns darauf aufbaut und ihn anders macht.

    😮
    Hättest du auch einfach sagen können, daß das nicht von dir ist.
    Wäre ja egal -- aber so ist das schon eine Frechheit.
    Zum Glück benutzt wenigstens Volkard noch sein Gehirn.

    - du willst, daß man hier deine semesterarbeit für dich macht.

    Mein alter ego hat zwar neulich einen vielleicht zu großen Teil der Arbeit für jemanden
    hier im Forum gemacht, aber nun kommt auch von mir:

    - jetzt wird die sicher keiner mehr helfen.



  • sag ma leute, sind eure troll-o-meter explodiert?



  • lustigerweise scheint er seine Frage in verschiedenen (noch mindestens eine) Diskussions-communities zu stellen. Dort wurde der Thread recht schnell geschlossen und ich hoffe, dass das hier auch passieren wird, bevor noch ein gutherziger Mensch seine Zeit damit verschwendet, dir tatsächlich zu helfen.

    PS: kommst du evtl. aus dem Wirtschaftssektor? dann könnte dir http://www.rentacoder.com gefallen.



  • Ok, ok. :p
    Also OP, wenn du konkrete Fragen hast, mach bitte ein neues Thema auf, in dem du diese behandelst.
    "Kann man mein code nicht vereinfachen????" oder "Kann mir keiner helfen, den code zu vereinfachen und ihn farbig darzustellen???" sind keine konkreten Fragen.
    Dazu bitte woanders einen Sammy suchen (z.B. chats).


Anmelden zum Antworten