#1 2. November 2007 probleme bei consolenspiel also ich hab mal tennis in form vonpaddle war in der console geschrieben... hier das ergebnis: klick mich wenn man das spiel öffnet kann spieler 1 (oben )mit den pfeiltasten lenken, spieler2 (unten) mit a und d; wenn man dann aber versucht, das spiel zu spielen, merkt man, dass sich die spieler nicht schnell genug bewegen können um den ball zu bekommen... hier erst mal der code, dann kommt meine frage: Code: #include <windows.h> #include <iostream> #include <conio.h> #ifndef VK_A #define VK_A 'A' #endif #ifndef VK_D #define VK_D 'D' #endif using namespace std; class ball { // die klasse für den ball public: int x; int y; int steigung; // steigung in der bewegung des balls int richtung; // ballrichtung, in welche richtung sich der ball bewegt }; class schiff { // die klasse für die spieler public: int x; int y; int ly; // alte x position int lx; int punkte; }; void Textposition(int x, int y) { COORD coordScreen; coordScreen.X = x; coordScreen.Y = y; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coordScreen); } int main () { schiff spieler1, spieler2; spieler1.x = 0; spieler1.y = 1; spieler2.x = 0; spieler2.y = 23; spieler1.punkte = 0; spieler2.punkte = 0; ball Ball; Ball.x = 10; Ball.y = 10; Ball.steigung = 0; Ball.richtung = 1; //intro Textposition(30, 12); cout << "Du stinkst praesentiert" << flush; Textposition(35, 13); cout << "Tennis" << flush; getch(); Textposition(30, 12); cout << " " << flush; Textposition(35, 13); cout << " " << flush; while (Ball.richtung){ // endlosschleife if (GetKeyState(VK_LEFT) < 0) { spieler1.ly=spieler1.y;spieler1.lx=spieler1.x;spieler1.x==0?spieler1.x=79:--spieler1.x; } // spieler 1 bewegt sich nach links if (GetKeyState(VK_RIGHT) < 0) { spieler1.ly=spieler1.y;spieler1.lx=spieler1.x;spieler1.x==79?spieler1.x=1:++spieler1.x;} if (GetKeyState(VK_A) < 0) { spieler2.ly=spieler2.y;spieler2.lx=spieler2.x;spieler2.x==0?spieler2.x=79:--spieler2.x;} if (GetKeyState(VK_D) < 0) { spieler2.ly=spieler2.y;spieler2.lx=spieler2.x;spieler2.x==79?spieler2.x=1:++spieler2.x;} Textposition(spieler1.lx,spieler1.ly);cout<<" "<<flush; // alte position überschreibnen Textposition(spieler1.x,spieler1.y);cout<<"<=>"<<flush; // neue ausgeben Textposition(spieler2.lx,spieler2.ly);cout<<" "<<flush; Textposition(spieler2.x,spieler2.y);cout<<"<=>"<<flush; Textposition( Ball.x, Ball.y); cout << " " << flush; Ball.y += Ball.richtung; Ball.x += Ball.steigung; if (Ball.x > 78) Ball.x = 0; if (Ball.x < 0) Ball.x = 79; Textposition(Ball.x, Ball.y); cout << "0" << flush; Textposition(0,0); cout << spieler1.punkte; Textposition(0,24); cout << spieler2.punkte; Textposition(0,0); Sleep(500); // eine halbe sekunde warten, damit der ball nicht zu schnell bewegt // der aprallefekt des balles (für frage unwichtig) if ((((Ball.x == spieler2.x) or (Ball.x == spieler2.x + 1) or (Ball.x == spieler2.x + 2)) and Ball.y == (spieler2.y - 1)) and Ball.richtung == 1) { if (Ball.x == spieler2.x) { switch (Ball.steigung) { case 0: Ball.steigung = -1; break; case 1: Ball.steigung = 0; break; case 2: Ball.steigung = 1; break; case -1: Ball.steigung = 2; break; case -2: Ball.steigung = 2; break; } } else if (Ball.x == (spieler2.x +1)) { Ball.steigung = -Ball.steigung; } else if (Ball.x == (spieler2.x +2)) { switch (Ball.steigung) { case 0: Ball.steigung = 1; break; case 1: Ball.steigung = 0; break; case 2: Ball.steigung = -1; break; case -1: Ball.steigung = -2; break; case -2: Ball.steigung = -2; break; } } Ball.richtung = -Ball.richtung; } if ((((Ball.x == spieler1.x) or (Ball.x == spieler1.x + 1) or (Ball.x == spieler1.x + 2)) and Ball.y == (spieler1.y + 1)) and Ball.richtung == -1) { if (Ball.x == spieler1.x) { switch (Ball.steigung) { case 0: Ball.steigung = -1; break; case 1: Ball.steigung = 0; break; case 2: Ball.steigung = 1; break; case -1: Ball.steigung = 2; break; case -2: Ball.steigung = 2; break; } } else if (Ball.x == (spieler1.x +1)) { Ball.steigung = -Ball.steigung; } else if (Ball.x == (spieler1.x +2)) { switch (Ball.steigung) { case 0: Ball.steigung = 1; break; case 1: Ball.steigung = 0; break; case 2: Ball.steigung = -1; break; case -1: Ball.steigung = -2; break; case -2: Ball.steigung = -2; break; } } Ball.richtung = -Ball.richtung; } if (Ball.y > spieler2.y) { spieler1.punkte++; Ball.richtung = -Ball.richtung; Sleep(2000); // wenn ein spieler punktet 2 s warten } if (Ball.y < spieler1.y) { spieler2.punkte++; Ball.richtung = -Ball.richtung; Sleep(2000); } } return 0; } kann man den ball in eine andere schleife legen als die spieler, sprich der ball bewegt sich alle halbe sekunde, der spieler kann sich öfter bewegen? Also 2 parallel laufende schleifen?? ich hoffe ihr könnt antworten mfg t-low + Multi-Zitat Zitieren
#2 2. November 2007 AW: probleme bei consolenspiel zwei paralell laufende schleifen gehören in den bereich des mutlithreading. java ist dazu in der lage und das sehr einfach. bei c++ wird das ganze etwas schwieriger glaube ich. mir würde da nur was einfallen mit dem man das manuell machen könnte. du müsstest zb bei ungeraden schleifen stoppen und die andere, dran lassen. zählt die zweite ne ungerade, dann darf wieder die andere schleife weiterzählen. aber das ist nicht unbedingt so einfach + Multi-Zitat Zitieren
#3 3. November 2007 AW: probleme bei consolenspiel Multitasking marke Eingenbau + Multi-Zitat Zitieren
#4 3. November 2007 AW: probleme bei consolenspiel du kannst doch den ball nur halb so schnell bewegen lassen wie die schläger. MfG - Idefix! + Multi-Zitat Zitieren
#5 3. November 2007 AW: probleme bei consolenspiel hi! die lösung deines problems heißt wie schon angemerkt wurde: threading. setze einfach jeden spieler in einen eigenen thread dann ist das problem mit der geschwindigkeit gelöst. hier ein sehr gutes how-to für threads unter c++: http://www.geocities.com/SiliconValley/Heights/6038/dthreads.html + Multi-Zitat Zitieren
#6 3. November 2007 AW: probleme bei consolenspiel ok danke bewertungen habt ihr... hat irgendwer noch ein deutschsprachiges tut ich hab das hier gefunden http://www.tutorials.de/forum/c-c/22831-c-c-zwei-sachen-gleichzeitig-laufen-lassen.html aba bei mir kommen imma probleme, wenn ich _beginthread benutze... darf man in threads kein cout benutzen oda so?? + Multi-Zitat Zitieren
#7 4. November 2007 AW: probleme bei consolenspiel C++- Tutorials - Kongos rand() Tutorials, 5: Multithreading + Multi-Zitat Zitieren