[C/C++] probleme bei consolenspiel

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von t-low, 2. November 2007 .

  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
     
  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
     
  3. 3. November 2007
    AW: probleme bei consolenspiel

    Multitasking marke Eingenbau
     
  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!
     
  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
     
  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??
     
  7. 4. November 2007
    AW: probleme bei consolenspiel

    C++- Tutorials - Kongos rand() Tutorials, 5: Multithreading
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.