Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Vier Gewinnt - Vier Steine in einer Reihe

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
cp+no0B
Gast





BeitragVerfasst am: 17. Apr 2005 12:41    Titel: Vier Gewinnt - Vier Steine in einer Reihe Antworten mit Zitat

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 :

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
Nach oben
Gast






BeitragVerfasst am: 17. Apr 2005 21:02    Titel: Antworten mit Zitat

Im Idealfall prüfst du nach jedem gesetzten Spielstein die Umgebung des Steins.

Du kennst die Position des letzten Spielsteins (x, y). Nur dieser Spielstein kann zu einem Sieg beitragen, denn sonst hätte der Spieler schon vorher gewonnen.
Außerdem kennst du die Farbe F des Steins.

Alles, was du nun tun musst, ist von der aktuellen Position (x, y) die Umgebung abzusuchen. Ich mache ein Beispiel für die Waagerechte.


// In-Einer-Reihe-Counter auf 0
c = 0

// gehe 3 Schritte nach links und zähle gleichfarbige Steine
Für i = x-1, x-2, x-3
Ist i ausserhalb des Spielfeldes: Schleife abbrechen
Prüfe Spielstein (i, y) auf Farbe F.
Wenn gleich: c = c+1
Wenn ungleich: Schleife abbrechen

// gehe 3 Schritte nach rechts und zähle
Für i = x+1, x+2, x+3
Ist i ausserhalb des Spielfeldes: Schleife abbrechen
Prüfe Spielstein (i, y) auf Farbe F.
Wenn gleich: c = c+1
Wenn ungleich: Schleife abbrechen

Wenn c >= 3: Spieler mit Farbe F hat gewonnen
Sonst: c = 0, weiter mit Diagonalen und Senkrechten


Die Idee sollte klar werden. Den Prüfalgorithmus kann man erheblich verkürzen, wenn man die Schrittrichtung in einem Vektor darstellt:

(1, 0) - Schritt nach rechts
(-1, 0) - Schritt nach links
(0, 1) - Schritt nach oben
(0, -1) - Schritt nach unten
(1,1) - Schritt nach rechts oben
etc.

Wenn du den Richtungsvektor (b1, b2) vorgibst, dann musst du die Steine in der Umgebung durch (x, y) + (b1, b2) ; (x, y) + 2*(b1, b2) ; ... absuchen und erhälst so eine Strategie für alle Richtungen.
Nach oben
mr. black



Anmeldungsdatum: 20.02.2005
Beiträge: 39
Wohnort: Krumbach

BeitragVerfasst am: 20. Apr 2005 19:28    Titel: Antworten mit Zitat

warum machst dus eigentlich mit

int feld[SPALTE] [ZEILE];

So ists besser, da es im Stack auch so aufgebaut ist.
und daher auch besser mit Scleifen durchlaufbar ist,
da der Pointer immer um eins versetzt werden muss und
nicht um ZEILE:

int feld[ZEILE] [SPALTE];

_________________
Zeit ist, was man auf einer Uhr abliest. A.E.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++ Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen