sergej: In C/C++ die Farbe der Zeichen wechseln

Hallo und guten Morgen,

folgendes Problem : Wir haben ein 4Gewinnt Spiel geschrieben für die Windows Textkonsole. Nun die Frage, wie die einzelnen Eingaben von den 2 Spielern farblich unterschieden werden können.

Hier unser Code :
Ich denke, vielleicht könnte man bei dem "switch" ja schon die textcolor irgendwie einbauen, hm?

---------------------------------------------------------------------

#include <iostream.h>
#include <conio.h>
#include <stdio.h>

#define WIDTH 7
#define HEIGHT 6
#define N 4

int player;
int feld[9][8];
char feld1[9][8];
char player1[20];
char player2[20];

void ausgeben(void)
{
  clrscr();
  for (int i=0; i<=8; i++) {
    for (int j=0; j<=7; j++) {
      switch (feld[i][j]) {
      case  1: feld1[i][j]=1;break;
      case -1: feld1[i][j]=2;break;
      case  0: feld1[i][j]=' ';break;
      }
    }
  }
  //system("CLS");
  cout << "\xFF\xFF\xFF\xFF\xFF\xFF\xFF 1 \xFF 2 \xFF 3 \xFF 4 \xFF 5 \xFF 6 \   xFF 7 \xFF" << endl;
  cout << "\xFF\xFF\xFF\xFF\xFF\xFF\xC9";
  for (int i=1; i<=6; i++) cout << "\xCD\xCD\xCD\xCB";
  cout << "\xCD\xCD\xCD\xBB"<<endl;
  for (int j=1; j<=5; j++) {
    cout << "\xFF\xFF\xFF\xFF"<<j;
    for (int i=1; i<=7; i++) {
      cout<<"\xFF\xBA\xFF";
      //if (feld[j][i]==1) textcolor(12);
      //if (feld[j][i]==-1) textcolor(14);
      cout<<feld1[i][j];
      //textcolor(15);
    }
    cout<<"\xFF\xBA"<<endl;
    cout << "\xFF\xFF\xFF\xFF\xFF\xFF\xCC";
    for (int i=1; i<=6; i++) cout << "\xCD\xCD\xCD\xCE";
    cout << "\xCD\xCD\xCD\xB9"<<endl;
  }
  cout << "\xFF\xFF\xFF\xFF"<<"6";
  for (int i=1; i<=7; i++) {
    cout<<"\xFF\xBA\xFF";
    //if (feld[j][6]==1) textcolor(12);
    //if (feld[j][6]==-1) textcolor(14);
    cout<<feld1[i][6];
    //textcolor(15);
  }
  cout<<"\xFF\xBA"<<endl;
  cout << "\xFF\xFF\xFF\xFF\xFF\xFF\xC8";
  for (int i=1; i<=6; i++) cout << "\xCD\xCD\xCD\xCA";
  cout << "\xCD\xCD\xCD\xBC"<<endl;
}

void players(void)
{
  cout << "Name des ersten Spielers: ";
  gets(player1);
  cout << "Name des zweiten Spielers: ";
  gets(player2);
}

int select_column(int player)
{
  int col;
  switch(player) {
   case  1: cout << endl << "Der Spieler "; puts(player1); cout<<"ist am Zug"
   << endl; break;
   case -1: cout << endl << "Der Spieler "; puts(player2); cout<<"ist am Zug"
   << endl; break;
  }
  cout <<"Wählen Sie die Spalte(1 bis 7): ";
  cin >> col;
  return col;
}

int insert_stone(int col, int player)
{
  int i=1;
  while ((feld[col][i]==0) && (i<=HEIGHT)) i++;
  if (i>1) {
   switch (player) {
    case  1:  feld[col][i-1]=1;break;
    case -1:  feld[col][i-1]=-1;break;
   }
  }
  return (i-1);
}

int check(int col, int row, int dir, int player)
{
  int c,r,counter=0;

///////////////////////////////
// Vielleicht irgendwo hier?//
/////////////////////////////

switch(dir) {
  case 1: r=+1; c=+0; break;
  case 2: r=+1; c=+1; break;
  case 3: r=+0; c=+1; break;
  case 4: r=-1; c=+1; break;
  case 5: r=-1; c=+0; break;
  case 6: r=-1; c=-1; break;
  case 7: r=+0; c=-1; break;
  case 8: r=+1; c=-1; break;
  }
  while (feld[col][row]==player) {
    row+=r;col+=c;counter++;
    if (counter==N) break;
  }
  return counter-N+1;
}

int inspect(int player)
{
  int success=0;
  for (int c=1; c<=WIDTH; c++) {
    for (int r=1; r<=HEIGHT; r++) {
      if(feld[c][r]!=0) {
        for (int i=1; i<=8; i++) {
          if(check(c,r,i,player)==1) {
            success=1; break;
          }
        }
      }
    }
  }
  return success;
}

void play(void)
{
  //int i=0;
  int player=1;
  ausgeben();
  while ((inspect(player)!=1) && (inspect(-player)!=1)) {
    if (insert_stone(select_column(player),player)>0) player*=-1;
    ausgeben();
  }
  ausgeben();
  switch(-player) {
  case  1: puts(player1);cout<<"hat gewonnen!"<<endl;break;
  case -1: puts(player2);cout<<"hat gewonnen!"<<endl;break;
  }
  cout << "Herzlichen Glückwunsch!!!";
  getch();
}

void main(void)
{
  for (int i=0; i<=8; i++) {
    for (int j=0; j<=7; j++) {
      feld[i][j]=0;
    }
  }
  //ausgeben();
  players();
  play();
  //getch();
}

Ähm ja, ich hoffe, dass es in Ordnung geht, dass ich hier den ganzen Code hingemalt habe. Ich denke aber, dann kann man das besser nachvollziehen.

Danke im Voraus für die Mühe.
aufdieantwortwartender Sergej

S.K. :-)

  1. Moin,

    Hallo und guten Morgen,
    folgendes Problem : Wir haben ein 4Gewinnt Spiel geschrieben für die Windows Textkonsole. Nun die Frage, wie die einzelnen Eingaben von den 2 Spielern farblich unterschieden werden können.

    nochmal zum Verständnis ... zielt die Frage darauf ab,
    wie man verschiedene Textfarben unter einer WinDOS-Konsole
    darstellt oder geht es darum, wie man beim Checken auf Viererreihen
    die unterschiedlichen Spielerfarben in der Programmlogik
    berücksichtigt?

    Viele Grüße

    Andreas

    1. Moin,

      Hi Andreas :-)

      Hallo und guten Morgen,
      folgendes Problem : Wir haben ein 4Gewinnt Spiel geschrieben für die Windows Textkonsole. Nun die Frage, wie die einzelnen Eingaben von den 2 Spielern farblich unterschieden werden können.

      nochmal zum Verständnis ...

      Jedem Spieler soll eine Farbe zugeteilt werden. d.h. wenn der jeweilige Spieler die Spalte auswählt, wo er seinen Stein plazieren möchte, soll das Symbol (in diesem Fall z.Bsp die ASCII "1") eine andere Farbe haben .

      Hm, ich hoffe dass es jetzt verständlicher ist. ( bin noch nicht ganz wach... hehe) :-)

      S.K.

      1. Moin,

        Jedem Spieler soll eine Farbe zugeteilt werden. d.h. wenn der jeweilige Spieler die Spalte auswählt, wo er seinen Stein plazieren möchte, soll das Symbol (in diesem Fall z.Bsp die ASCII "1") eine andere Farbe haben .

        die einfachste Möglichkeit, die mir einfällt, ist die Verwendung
        von ANSI-Codes. Dies sind Escape-Sequenzen, mit denen man
        die Cursor-Position sowie Darstellung (Farbe, Fett, Kursiv, ...)
        der Schrift in Konsolen beeinflussen kann.
        Eine Zusammenstellung dieser Sequenzen findet sich z.B. unter
        http://www.bluesock.org/~willg/dev/ansi.html.

        Falls dann in der Konsole nur Zeichensalat erscheint, musst
        Du noch den Treiber ANSI.SYS einbinden (IMHO in der config.sys-Datei
        mit 'devicehigh=<pfad>../ansi.sys' o. Ä. laden).

        Das ganze hat den Vorteil, dass es unabhängig von irgendwelchen
        Compilerbibliotheken funktioniert.

        Viele Grüße

        Andreas

        1. Hallo,

          Jedem Spieler soll eine Farbe zugeteilt werden. d.h. wenn der
          jeweilige Spieler die Spalte auswählt, wo er seinen Stein
          plazieren möchte, soll das Symbol (in diesem Fall z.Bsp die
          ASCII "1") eine andere Farbe haben .

          Conio oder Curses. SLang koennte es auch fuer Win geben.

          die einfachste Möglichkeit, die mir einfällt, ist die Verwendung
          von ANSI-Codes. Dies sind Escape-Sequenzen, mit denen man
          die Cursor-Position sowie Darstellung (Farbe, Fett, Kursiv, ...)
          der Schrift in Konsolen beeinflussen kann.

          Das wuerde ich nicht tun. Das ist in hoechstem Masse
          System-abhaengig.

          Das ganze hat den Vorteil, dass es unabhängig von irgendwelchen
          Compilerbibliotheken funktioniert.

          Der "Vorteil" ist nur scheinbar vorhanden. Das ist in aller hoechstem
          Masse System-abhaengig.

          Gruesse,
           CK

          1. AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!

            Wie soll ich denn das sonst anstellen???????????!!!!!!!!
            fragundganzdummguck :-)

            S.K.

            1. AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!

              Wie soll ich denn das sonst anstellen???????????!!!!!!!!
              fragundganzdummguck :-)

              S.K.

              http://learn.to/cool_down

              1. AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!

                Wie soll ich denn das sonst anstellen???????????!!!!!!!!
                fragundganzdummguck :-)

                S.K.

                http://learn.to/cool_down

                www.kaufdicheinkecks.de

                :-(

                1. www.kaufdicheinkecks.de

                  </faq/#Q-19>

        2. Moin auch!

          die einfachste Möglichkeit, die mir einfällt, ist die Verwendung
          von ANSI-Codes. Dies sind Escape-Sequenzen, mit denen man
          die Cursor-Position sowie Darstellung (Farbe, Fett, Kursiv, ...)
          der Schrift in Konsolen beeinflussen kann.
          Eine Zusammenstellung dieser Sequenzen findet sich z.B. unter
          http://www.bluesock.org/~willg/dev/ansi.html.

          Falls dann in der Konsole nur Zeichensalat erscheint, musst
          Du noch den Treiber ANSI.SYS einbinden (IMHO in der config.sys-Datei
          mit 'devicehigh=<pfad>../ansi.sys' o. Ä. laden).

          Ansi.sys ist heutzutage kaum irgendwo installiert, niemand weiß, wie man das macht (ist heftigste DOS-Konfiguration), und außerdem:
          Die Verwendung von ANSI.SYS ist ein nicht ganz unerhebliches Sicherheitsproblem. Es gibt sogenannte ANSI-Bomben, welche durchaus allein durch Bildschirmausgabe Schaden anrichten können!

          Deine Idee ist also nicht wirklich praxisnah. :)

          - Sven Rautenberg