Vier Steine in einer Reihe - Vier Gewinnt



  • Hi
    Wir haben die Aufgabe das Spiel Vier-gewinnt zu programmieren...
    Das Spielfeld und das Setzen der Steine habe ich, doch wie mache ich das, dass er den Sieg feststellt, falls vier Steine in einer Reihe bzw. Diagonal gelegt worden sind ?

    Hier der bisherige Code :

    //---------------------------------------------------------------------------
    #include <stdlib.h>
    #include <conio.h>
    #include <iostream.h>
    #define rot  44
    #define blau 3
    #define gelb 30
    //---------------------------------------------------------------------------
    // Globale Variable und Konstanten
    //---------------------------------------------------------------------------
    
    // Spielfeld hat  8 Spalten(x) und 7 Zeilen (y)
    int feld[8][7];
    
    bool gewonnen=false, voll=false, abgebrochen=false;
    
    //---------------------------------------------------------------------------
    // Funktionsdeklarationen
    //---------------------------------------------------------------------------
    void erklaerung();
    void spielen();
    bool nochmal();
    void neufeld();
    void setzen(int s);
    void pruefen();
    void siegerehrung(int s);
    
    //---------------------------------------------------------------------------
    // Hauptprogramm
    //---------------------------------------------------------------------------
    void main()
    {
      // Erklärung für Benutzer
      erklaerung();
    
      do spielen(); while ( nochmal() );
    
    }
    //---------------------------------------------------------------------------
    // Funktionsdefinitionen
    //---------------------------------------------------------------------------
    void erklaerung()
     { cout<<""<<endl; getch();
     }
    //---------------------------------------------------------------------------
    
    void spielen()
     {  clrscr();
    
        // Spielfeld zeichnen und Variable initialisieren
        neufeld();
    
        int spieler=2;
    
        do
          {
            // Spielerwechsel
            if (spieler==1) spieler=2; else spieler=1;
    
            // Stein setzen
            setzen(spieler);
            gewonnen=false;
    
            // Prüfen
            if (!abgebrochen) pruefen();
    
            // Wenn gewonnen dann Siegerehrung, sonst weiter mit nächstem Spieler
            if (gewonnen ) siegerehrung(spieler);
          }
         while( !gewonnen && !voll && !abgebrochen);
    
     }
    //---------------------------------------------------------------------------
    
    bool nochmal()
     {  cout<<"Nochmal? j/n"<<endl;
        char t=getch();
        if(t=='j') return true;
        else return false;
    
     }
    //---------------------------------------------------------------------------
    
    void neufeld()
    {  cout<<"Ich zeichne ein neues Feld"<<endl; getch();
       for(int x=0; x<8; x++)
         for (int y=0; y<7; y++)
            feld[x][y]=0;
    
       for (int z=0;z<7;z++)
       { textcolor(blau);
       gotoxy(16,3*z+4);cprintf("||   ||   ||   ||   ||   ||   ||   ||   ||");
       gotoxy(16,3*z+5);cprintf("||   ||   ||   ||   ||   ||   ||   ||   ||");
       gotoxy(16,3*z+6);cprintf("||___||___||___||___||___||___||___||___||");
       }
      gotoxy(16,22);cprintf("||   ||   ||   ||   ||   ||   ||   ||   ||");
      gotoxy(16,23);cprintf("||   ||   ||   ||   ||   ||   ||   ||   ||");
      gotoxy(16,24);cprintf("||===||===||===||===||===||===||===||===||");
      gotoxy(16,25);cout<<"   1    2    3    4    5    6    7    8"<<endl;
    }
    //---------------------------------------------------------------------------
    void setzen(int s)
    {
       gotoxy(20,27); cout<<"Abbruch mit ESC   Spieler "<<s<<" setzt in Spalte ";
       char t;
       int spalte;
       bool spaltevoll=false;
    
       do
         { do
            t=getch();
          while ( ! (t=='1' || t=='2' || t=='3'|| t=='4' || t=='5' || t=='6' ||
                  t=='7' || t=='8' || t==27));
    
          if (t==27) { abgebrochen=true; return; }
    
          spalte=t-49; // spalte geht von 0 bis 7
          if (feld[spalte][0] !=0 )spaltevoll=true;
    
         }
        while ( spaltevoll);
    
        // Stein fallen lassen in erste freie Stelle
        int y=0;
        while(feld[spalte][y]==0 && y<7) y++; // erste besetzte Zeile gefunden
    
        feld[spalte][y-1]=s; // Stein setzen
    
        // einzeichnen
        if (s==1)
          { gotoxy(spalte*5+18,y*3+1); textcolor(rot);cprintf("°°°");
            gotoxy(spalte*5+18,y*3+2); textcolor(rot);cprintf("°°°");
          }
        else { gotoxy(spalte*5+18,y*3+1); textcolor(gelb);cprintf("///");
               gotoxy(spalte*5+18,y*3+2); textcolor(gelb);cprintf("///");
             }
    
    }
    //---------------------------------------------------------------------------
    
    void pruefen()
    {  cout<<""<<endl; getch();
    }
    //---------------------------------------------------------------------------
    
    void siegerehrung(int s)
    {  cout<<"Ich ehre den Sieger "<<s<<endl; getch();
    }
    //---------------------------------------------------------------------------
    

    Ich benutze Borland 1...

    danke

    cu



  • Als Lösungsansatz:
    Du musst nie das gesamte Spielfeld umgraben, um zu finden, ob das Spiel gewonnen wurde. Laufe einfach von der Position des zuletzt eingefügten Steines los (1x horizontal, 1x vertikal, 2x diagonal) und schaue, ob sich eine Vierer-Reihe ergeben hat. Vergiss nicht, dass der eingefügte Stein natürlich nicht zwingend der Anfang oder das Ende einer Reihe ist. Wenn Du so eine Reihe findest, hat der Spieler gewonnen, der den letzten Stein gesetzt hat.

    Klingt doch einfach, oder? 😉



  • ich empfehle dir:

    1. #include <iostream.h> --> #include <iostream>
    2. #define rot 44        --> const int rot = 44;
    3. cprintf();            --> cout
    4. do {/*...*/} while;   --> while {/.../}    //empfehlung vom stroustrup
    

    macht den source lesbarer und du benutzt c++ statt c-fragmenten.



  • Wir müssen ebenfalls das spiel vier gewinnt programmieren.
    hat mir jemand den Quellcode für ein einfaches vier gewinnt. Muss einfacher wie oben sein. Bitte helft mir schnell
    DANKE



  • st schrieb:

    hat mir jemand den Quellcode für ein einfaches vier gewinnt.

    Ja, dann mach mal.

    Bitte helft mir schnell

    Ist dringend, oder was? Dann wuerd ich mich an Deiner Stelle beeilen.



  • hausaufgaben kopieren.... tz tz 😃



  • Hi,

    hier schnell der komplette Code fuer ein 4 Gewinnt:

    #include <iostream>
    using namespace std;
    int main()
    {
    // An dieser Stelle koennte man ein schoenes 3D Intro abspielen
    
    char Spieler;
    
    // Spiele(schleife)
    cout << "Waehle Spieler (1/2): ";
    cin >> Spieler;
    
    // Gewinnabfrage mit Siegerehrung
    if(Spieler == '1')
    cout << "Spieler 1 hat 4"
    else
    cout << "Spieler 2 hat 4"
    
    // hier noch die Mitarbeiternamen einfuegen
    cout << "Credits: ..."
    
    return 0;
    }
    


  • Und das kommt durch den Compiler?

    Übrigens könntest du die Siegerehrung noch kürzer schreiben:

    cout<<"Spieler "<<Spieler<<" hat 4.\n";
    


  • Hi,

    naja ok die 3 ; hatte ich im arbeitswahn vergessen :p

    Und sicher, optimieren kann man das Spiel ja noch. Man koennte ja fuer die einzelnen Spieler eine Klasse erstellen z.B. 👍



  • Kenner des 4 Gewinnt schrieb:

    Und sicher, optimieren kann man das Spiel ja noch. Man koennte ja fuer die einzelnen Spieler eine Klasse erstellen z.B. 👍

    Man kann's auch übertreiben 😃

    (aber trotzdem solltest du den Abschnitt zwischen cin>>Spieler; und if(Spieler=='1') nochmal überarbeiten)



  • Hi,

    naja ich hab das Programm ja noch nicht compiliert, sieh es quasi als ersten groben Entwurf 🙂

    Mal was anderes, du kennst dich doch bestimmt mit MFC und so gut aus.
    Ich habe vor eine Floodfill Funktion selber zu schreiben. Nur wenn ich folgenden Code in z.B. die OnLButtonUp Funktion einfuege gehen sie nicht:

    CPaintDC dc(this);
    dc.SetPixel(100, 100, RGB(255,0,0));
    Invalidate();
    

    Liegt irgendwie am dc(this), den er sich nicht 'richtig' holen kann.
    Was muss ich denn tun, wenn ich SetPixel und GetPixel ausserhalb von OnPaint nutzen will 😕



  • Hi,
    das Problem hat sich gerade von alleine geloest. Ich mache es jetzt so:

    CClientDC dc(this); 
    dc.SetPixel(100, 100, RGB(0,0,0));
    

    Hatte statt 'CClientDC' das 'CPaintDC' verwendet 😮
    Naja ok zurueck zum eigentlichen 4 Gewinnt Problem 😃



  • Kenner des 4 Gewinnt schrieb:

    Was muss ich denn tun, wenn ich SetPixel und GetPixel ausserhalb von OnPaint nutzen will 😕

    Lass es lieber - für's Zeichnen ist nunmal die OnPaint() zuständig, wenn sich da eine andere Funktion reinhängt, bringt das nur Probleme (da gibt es zu viele Situationen, in denen die OnPaint() aufgerufen werden könnte - und die überschreibt dir dann deine wunderschöne Bildschirmausgabe).

    PS: Ob ich mich mit MFC "gut" auskenne, weiß ich nicht. Jedenfalls reicht's für den Hausgebrauch 😃



  • Hi,
    habs doch mal riskiert ausserhalb zu zeichnen 🕶
    Naja stimmt schon, dass sobald man das Fenster verschiebt, alles wieder weg ist usw., aber wollte ja nur mal so ein Floodfill mit Rekursion selber machen.
    Klappt auch soweit ganz gut 😃 Naja wenn die zu fuellenden Flaechen zu gross werden stuerzt es zwar ab, aber is nu auch egal.

    Wenn ich jetzt nochn Radiergummi und die kleinen erstlichen DInge einbaue habe ich fast schon MS Paint 🤡



  • Du könntest dir auch einen Memory-DC anlegen, in den du dann jeweils reinschreibst - dort kannst du rummalen wie du lustig bist und die OnPaint() ist nur noch dafür verantwortlich, die Daten auf den Bildschirm zu BitBlt()n.

    (aber jetzt bitte zurück zum Thema des Beitrags)


Anmelden zum Antworten