Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vier Gewinnt

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 < [ 2 ]
000
11.04.2005, 20:58 Uhr
~piet
Gast


Bin schon fast fertig mit dem C Buch habe einiges dazu gelernt auch einige Beispiele im Buch gemacht. Nun will ich endlich mein erstes Speil programmieren.
Ich habe Vier Gewinnt angefangt nur ich bekomme den rahmen im vier gewinnt spiel nich ganz hin.


Bitte um eine Lösung.

Mfg.piet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.04.2005, 21:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ansatz?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.04.2005, 21:55 Uhr
CaesarCortezz
minderer Student


muss aber schon ein gutes C-Buch gewesen sein ^^
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.04.2005, 01:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wenn du das ohne eine Gui machen willst und das ganze wirklich in Ansi-C sein soll wird dir nix weiter anderes übrig bleiben als z.b. sternchen und Nullen zu malen...
an sonsten gibts für die konsole noch eine lib names ncurses damit kannst du das auch alles schön bunt machen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.04.2005, 16:14 Uhr
~piet
Gast


Das ist nur mal der Rahmen aber das funktioniert auch nicht ganz:

C++:
#include <stdio.h>

int main(void){

    int matrix[20][10];
    int i=0;

    for(i=0;i<18;i++){
        matrix[i][10]='*';
        printf("%c", matrix[i][10]);
    }

    matrix[5][5]='*';
    printf("%c", matrix[5][5]);
    printf("\n");
    for(i=2;i<18;i++){
        matrix[i][10]='*';
        printf("%c", matrix[i][10]);
    }

    for(i=0;i<9;i++){
        matrix[9][i]='*';
        printf("%c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        matrix[9][i]='*';
        printf("%3c", matrix[9][i]);
        printf("\n");
    }

    for(i=0;i<19;i++){
        matrix[i][19]='*';
        printf("%c", matrix[i][19]);
    }

    return 0;
}



Bearbeitung von 0xdeadbeef:

Einrückung, cpp-tags. Nächstes mal den Quellcode bitte selbst vernünftig formatieren.


Dieser Post wurde am 12.04.2005 um 16:56 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.04.2005, 17:02 Uhr
Th



Du solltest zuerst das Array füllen und dann das gesamte Array ausgeben, also z.B.

C++:
int main()
{
  char matrix[20][10];
  int i, j;

  /* initialisieren */
  for(i=0;i<20;i++)
    matrix[i][9]='*';   /* array hat indizes 0 bis 9 - nicht 10!!! */

  matrix[5][5]='*';

   /* ... */

   /* ausgeben */
   for(j=0; j<10; j++)
   {
      for(i=0; i<20; i++)
         printf("%c", matrix[i][j];
      printf("\n");
   }


Besser noch dafür eigene Funktionen schreiben...

Dieser Post wurde am 12.04.2005 um 17:02 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.04.2005, 17:20 Uhr
~piet
Gast


Wie könnte ich einen Stein bewegen. Davon habe ich überhaupt keine ahnung.
Gelesen habe ich davon wie man ein objekt bewegt aber bei mir geht das nicht.

Bitte einen kleinen ansatz.

Danke Mfg.piet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.04.2005, 17:32 Uhr
Th



Du mußt einfach das Array ändern und danach wieder das gesamte Array ausgeben.
z.B.

C++:
matrix[0][0] = ' ';
matrix[0][1] = '*';


Um z.B einen Stein von oben fallen zu lassen, mußt du eine Schleife nehmen und solange den Stein bewegen, bis das darunterliegende Feld besetzt ist, d.h. '*' drinsteht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.04.2005, 17:38 Uhr
~piet
Gast


Wenn man zb ein stein runter fallen lässt wie kan man das machen das der zweite stein darüber liegen bleibt sonst überschreibt er den ersten stein bei mir.

Danke und Mfg. piet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.04.2005, 22:11 Uhr
0xdeadbeef
Gott
(Operator)


Ich habs mal eben aus Langeweile zusammengeschustert:

C++:
#include <stdio.h>

#ifndef HOEHE
#define HOEHE  5
#endif

#ifndef BREITE
#define BREITE 7
#endif

#ifndef GEWINNT
#define GEWINNT 4
#endif

#define RED    31
#define YELLOW 32

static int const players[] = { RED, YELLOW };

int gewonnen(int feld[BREITE][HOEHE], int x, int y) {
  int farbe = feld[x][y];
  int i, j, tmp;

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

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

  /* diagonal \ */
  tmp = 1;
  for(i = x - 1, j = y - 1; i >=      0 && j >=     0 && feld[i][j] == farbe; --i, --j, ++tmp);
  for(i = x + 1, j = y + 1; i <  BREITE && j <  HOEHE && feld[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 && feld[i][j] == farbe; --i, ++j, ++tmp);
  for(i = x + 1, j = y - 1; i <  BREITE && j >=     0 && feld[i][j] == farbe; ++i, --j, ++tmp);
  if(tmp >= GEWINNT) return 1;

  return 0;
}

static void print_feld(int feld[BREITE][HOEHE]) {
  int x, y;

  for(y = 0; y < HOEHE; ++y) {
    for(x = 0; x < BREITE; ++x) {
      if(feld[x][y] == 0) {
        printf("| ");
      } else {
        printf("|\x1b[%dm*\x1b[0m", feld[x][y]);
      }
    }
    puts("|");
  }

  for(x = 0; x < BREITE * 2 + 1; ++x) putchar('-');
  putchar('\n');
  for(x = 0; x < BREITE; ++x)
    printf("%2d", x + 1);
  putchar('\n');
}

static int eingabe(int farbe) {
  char zeile[100];
  int slot;

  do {
    printf("\x1B[%dm1-%d:\x1B[0m ", farbe, BREITE);
    fflush(stdout);

    fgets(zeile, 100, stdin);
  } while(sscanf(zeile, "%d", &slot) != 1);

  return slot;
}

static int spiel(void) {
  int feld[BREITE][HOEHE] = { { 0 } };
  int tops[BREITE] = { HOEHE, HOEHE, HOEHE, HOEHE, HOEHE, HOEHE, HOEHE };
  int player_ix = 1, x, y;

  print_feld(feld);

  do {
    player_ix = (player_ix + 1) % 2;

    do {
      x = eingabe(players[player_ix]) - 1;
    } while(x < 0 || x >= BREITE || tops[x] == 0);

    y = --tops[x];

    feld[x][y] = players[player_ix];
    print_feld(feld);
  } while(!gewonnen(feld, x, y));

  return player_ix;
}

int main(void) {
  printf("\x1B[%dmGEWONNEN!\x1B[0m\n", players[spiel()]);

  return 0;
}


Der ganze \x1B-Kram ist halt für die Farben, der Rest ziemlich selbsterklärend.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: