In C/C++ die Farbe der Zeichen wechseln
sergej
- programmiertechnik
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. :-)
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
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.
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
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
AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!
Wie soll ich denn das sonst anstellen???????????!!!!!!!!
fragundganzdummguck :-)
S.K.
AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!
Wie soll ich denn das sonst anstellen???????????!!!!!!!!
fragundganzdummguck :-)
S.K.
AAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!
Wie soll ich denn das sonst anstellen???????????!!!!!!!!
fragundganzdummguck :-)
S.K.
www.kaufdicheinkecks.de
:-(
www.kaufdicheinkecks.de
</faq/#Q-19>
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