Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » vier-gewinnt-spiel in C

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.05.2009, 12:10 Uhr
~Joe
Gast


Guten Tag zusammen,
Ich bin zur Zeit am verzweifeln. Ich weiss, dass ich ein Programmiernoob bin. Darum wende ich mich jetzt an euch. Ich programmiere zur Zeit ein Vier-gewinnt-spiel in C und nicht in C++. Habe schon alles Fertig, bis auf die Gewinnprüfung. Diese wollte ich als Funktion schreiben. Der Gewinnprüfungsfunktion übergebe ich die werte:char matrix[][7], die spalte: in meinem quelltext ist das zug_auswahl-1 und das symbol, das zeigt, welcher spieler grade an der reihe ist. Also O oder X.

Jetzt weiss ich nicht wie ich damit die Gewinnprüfung senkrecht, waagerecht und auch diagonal durch den 2D-Vektor laufen lassen soll.(Haben 2d vektoren noch nicht durchgenommen, aber für vier gewinnt braucht man das ja)

Meine Quelltexte habe ich HIER mal hochgeladen, damit ihr euch mal angucken könnt, wie das Programm so aussieht.

Brauche Hilfe
der Joe

ps: wenn ihr vorschläge zu der gewinnfunktion oder auch verbesserungsvorschläge für das ganze Programm habt, könnt ihr diese hier posten oder mir eine email an smokin4joe@googlemail.com schicken.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.05.2009, 15:58 Uhr
0xdeadbeef
Gott
(Operator)


Den Code lesbar einzurücken wäre eine gute Angewohnheit...

Wie dem auch sei, ich hab sowas vor Jahren auch mal gemacht, allerdings für die UNIX-Konsole. Der Trick bei der Gewinnprüfung ist, nicht zu überprüfen, ob auf dem Brett eine Gewinnerkombination ist, sondern ob der letzte Zug es ist. Bei mir sah das so aus:

C++:
static int spiel_t_gewonnen(spiel_t const *this, size_t x, size_t y) {
  int farbe = this->spielfeld[x][y];
  int i, j, tmp;

  /* senkrecht */
  tmp = 1;
  for(j = y + 1; j < HOEHE && this->spielfeld[x][j] == farbe; ++j, ++tmp);
  if(tmp >= GEWINNT) return 1;

  /* waagerecht */
  tmp = 1;
  for(i = x - 1; i >=      0 && this->spielfeld[i][y] == farbe; --i, ++tmp);
  for(i = x + 1; i <  BREITE && this->spielfeld[i][y] == farbe; ++i, ++tmp);
  if(tmp >= GEWINNT) return 1;

  /* diagonal \ */
  tmp = 1;
  for(i = x - 1, j = y - 1; i >=      0 && j >=     0 && this->spielfeld[i][j] == farbe; --i, --j, ++tmp);
  for(i = x + 1, j = y + 1; i <  BREITE && j <  HOEHE && this->spielfeld[i][j] == farbe; ++i, ++j, ++tmp);
  if(tmp >= GEWINNT) return 1;

  /* diagonal / */
  tmp = 1;
  for(i = x - 1, j = y + 1; i >=      0 && j <  HOEHE && this->spielfeld[i][j] == farbe; --i, ++j, ++tmp);
  for(i = x + 1, j = y - 1; i <  BREITE && j >=     0 && this->spielfeld[i][j] == farbe; ++i, --j, ++tmp);
  if(tmp >= GEWINNT) return 1;

  return 0;
}


...wobei HOEHE == 5, BREITE == 7 und GEWINNT == 4 als Makros definiert waren, für den Fall, dass jemand das ganze als fünf-gewinnt kompilieren wollte oder so. spiel_t ist ein

C++:
typedef struct {
  int spielfeld[BREITE][HOEHE];
  int tops[BREITE];
} spiel_t;


this bezeichnet also den Spielstand, x und y sind die Koordinaten des letzten Zuges. Entschuldige die merkwürdige Einrückung, das Code-Feld hier im Forum ist leider nicht breit genug. Kopier's dir am besten in einen Editor deiner Wahl, es ist dann sehr viel lesbarer.

Was Verbesserungsvorschläge angeht, auf Anhieb sehe ich, dass du main falsch deklariert hast.

C++:
void main(void)


ist schlicht falsch, main muss immer int zurückgeben. Vom Standard garantierte Signaturen für main sind

C++:
int main(void);
int main(int argc, char *argv[]);


Im Erfolgsfall sollte main am Ende dann

C++:
return 0;


zurückgeben. Das ist dann von Bedeutung, wenn du einen hinreichend strengen Compiler benutzt (die meisten neueren hauen dir void main um die Ohren) oder das Programm in Skripten benutzt werden soll.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.05.2009 um 15:59 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.05.2009, 19:04 Uhr
~Joe
Gast


Danke 0xdeadbeef für deine schnelle Hilfe,
Jetzt frag ich mich nun, was du der Funktion für Werte übergibst? x und y stehen bestimmt für zeile und spalte. Aber die anderen Werte der Funktion sind für mich ein Geheimnis.


Zitat von Verfasser:

static int spiel_t_gewonnen(spiel_t const *this, size_t x, size_t y)

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2009, 19:21 Uhr
~Joe
Gast


hmmm.... Bei mir muss ich der Funktion das Symbol mit angeben und keine farbe oder meinst du damit das symbol. Oder kann man verschiedenen symbolen farben zuweisen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.05.2009, 19:57 Uhr
0xdeadbeef
Gott
(Operator)


Welche Werte ich der Funktion übergebe, habe ich oben im Detail erläutert.

Ich hab die Spieler durch Farben unterschieden - gelb und rot. Im Array stand die Farbe, beim Zeichnen des Brettes wurde dann halt ein Stern in der jeweiligen Farbe ausgegeben. Du kannst es auch "spieler" nennen, oder "symbol" - läuft auf das selbe hinaus. Welche Farbe gerade gezogen hat, muss nicht explizit übergeben werden, es lässt sich mit den Koordinaten aus dem Spielfeld ablesen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.05.2009, 17:01 Uhr
~Joe
Gast


Jetzt hab ich die Funktion für meinen Quelltext so umgeändert:

Zitat von Verfasser:

int gewinnpruefung(char matrix[8][8], char symbol, int zug_auswahl, int zl)
{
int i, j, tmp;

/* senkrecht */
tmp = 1;
for(j = zl + 1; j < HOEHE && matrix[(zug_auswahl-1)][j] == symbol; ++j, ++tmp);
if(tmp >= GEWINNT)
return 1;

/* waagerecht */
tmp = 1;
for(i = (zug_auswahl-1) - 1; i >= 0 && matrix[i][zl] == symbol; --i, ++tmp);
for(i = (zug_auswahl-1) + 1; i < BREITE && matrix[i][zl] == symbol; ++i, ++tmp);
if(tmp >= GEWINNT)
return 1;

/* diagonal \ */
tmp = 1;
for(i = (zug_auswahl-1) - 1, j = zl - 1; i >= 0 && j >= 0 && matrix[i][j] == symbol; --i, --j, ++tmp);
for(i = (zug_auswahl-1) + 1, j = zl + 1; i < BREITE && j < HOEHE && matrix[i][j] == symbol; ++i, ++j, ++tmp);
if(tmp >= GEWINNT)
return 1;

/* diagonal / */
tmp = 1;
for(i = (zug_auswahl-1) - 1, j = zl + 1; i >= 0 && j < HOEHE && matrix[i][j] == symbol; --i, ++j, ++tmp);
for(i = (zug_auswahl-1) + 1, j = zl - 1; i < BREITE && j >= 0 && matrix[i][j] == symbol; ++i, --j, ++tmp);
if(tmp >= GEWINNT)
return 1;

return 0;
}



und in meinem Main wollte ich die Funktion so aufrufen:

Zitat von Verfasser:

pruef=gewinnpruefung(matrix[8][8],symbol,zug_auswahl,zl);



doch nun bekomme ich diese Fehler:

Zitat von Verfasser:

Warnung 2 warning C4024: 'gewinnpruefung': Unterschiedliche Typen für formalen und übergebenen Parameter 1 cusers\joe\desktop\4gewinnt_9_5_09\projekt.c 116 4gewinnt

Warnung 1 warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'char (*)[8]' und 'int' unterschiedlich cusers\joe\desktop\4gewinnt_9_5_09\projekt.c 116 4gewinnt




Was sind das für Fehler und gibt es eine Lösung um das Prob zu beheben?

Greetz
Joe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.05.2009, 18:00 Uhr
0xdeadbeef
Gott
(Operator)



C++:
pruef=gewinnpruefung(matrix,symbol,zug_auswahl,zl);


nehme ich an. Wenn matrix ein char[8][8] ist, ist matrix[8][8] ein (ungültiger) char. Allerdings würde es mehr Sinn machen, wenn matrix ein char[BREITE][HOEHE] wäre.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 09.05.2009 um 18:01 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.06.2009, 12:11 Uhr
~Joe
Gast


ich bedanke mich für deine Hilfe, die mir sehr weitergeholfen hat.

mein 4-gewinnt spiel ist jetzt fertig. es ist mit c programmiert.

Ich hab mal die quellcodes und die erstellte exe in ein rar archiv gepackt und für euch mal hochgeladen, falls jemand mal sowas braucht^^; so wie ich xD

4-gewinnt

http://uploaded.to/file/wgxq3i

der Joe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: