C++ Ballprogramm

Hi, ich bin grad dabei C++ zu lernen und hab mal dieses kleine Programm Mithilfe eines Buches programmiert.:wink:
Code:
// Simuliert einen springenden Ball

#include <iostream>
#include <string>
using namespace std;

#define DELAY 10000000L // Verzögerung
#define CLS (cout << "\033[2J" ) // Bildschirm löschen
#define LOCATE(z,s) (cout <<"\033[" << z << ';' << s << 'H') // Cursor in Zeile z und Spalte s positionieren

int main()
{
     int x = 2, y = 3, dx = 1, geschw = 0;
     string boden(79, '-'), header = "**** Springender Ball *****";
     
     CLS;
     LOCATE(1,25); cout << header;
     LOCATE(25,1); cout << boden;
     
     while(true) // Ball "immer" springen lassen
     {
                 LOCATE(x,y); cout << 'o' << endl; // Ball anzeigen
                 for (long warten = 0; warten < DELAY; ++warten)
                     ;
                 
                     if (x == 1 || x == 79) dx = -dx; // An einer Wand?
                     
                     if (y == 24)  // Am Boden?
                     {
                           geschw = -geschw;
                           if ( geschw == 0 ) geschw = -7; // Neu Anstoßen
                     }
                     
                     geschw += 1; // Beschleunigung 1
                     
                     LOCATE (x,y); cout << ' '; // Anzeige löschen
                     y += geschw; x += dx; // Neue Position
     }
}
Leider funktioniert es iwie nicht richtig.
Kann bitte jemand mal drüberschauen und den Fehler finden? ^^

EDIT: Benutze DEV-C++ als Compiler und IDE
 
Zuletzt bearbeitet:
Mach mal in Zeile 36 ein CLS ...

Code:
 LOCATE (x,y); cout << ' '; CLS;// Anzeige löschen

... rein. Dann sieht's eigentlich ganz nett aus. :rolleyes:

Nachtrag:
Btw., Dec-C++ ist nur deine IDE, nicht der Compiler selbst.
 
Darstellung

Danke ;).
Ist die Darstellung so richtig??
Ich hab das Gefühl, dass es mit int main() zusammenhängt. Aber void main() nimmt DEV-C++ nicht.8o
 
also unter Windows 7 scheint das CLS nicht zu gehen,

ich bekomme folgende Ausgabe:

attachment.php


In einer schönen Endlosschleife, aber sehe gerade auch keinen Fehler :/

Ok den CLS befehl kann ich mit
Code:
system("CLS")
zwar machen und dann mir aus kommentieren das defenierte teil, aber so richtig passt das immer noch net :/
 
Zuletzt bearbeitet:
@Chackky: Scheint auch nur unter Linux zu funktionieren. Windows dürfte die Steuerzeichen nicht (mehr) kennen. \033 ist ESC, gefolgt von [2J, was zusammen den Bildschirm löscht.

@iBinomic: Weiß jetzt nicht, was du genau meinst, was an der main-Funktion liegen soll. Die muss jedenfalls immer int zurückliefern (siehe dazu auch: Main function - Wikipedia, the free encyclopedia). Vielleicht wäre es besser für dich, dich erstmal mit den Grundideen von C auseinander zu setzen, bevor du solche Spielereien in der Konsole machst. :wink:
 
so ich habs mal für Windows 7 zusammengebastelt

Code:
// Simuliert einen springenden Ball

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

#define DELAY 10000000 // Verzögerung
//#define CLS (cout << "\033[2J" ) // Bildschirm löschen
//#define LOCATE(z,s) (cout <<"\033[" << z << ';' << s << 'H') // Cursor in Zeile z und Spalte s positionieren


int main()
{
COORD abc; //Koordinaten 
     int x = 2, y = 3, dx = 1, geschw = 0;
     abc.X=x; //koordinaten x
     abc.Y=y; //koordinaten y
     string boden(79, '-'), header = "**** Springender Ball *****";
     
    
   // CLS;
   system("CLS");
    // LOCATE(1,25); 
    abc.X=1;
    abc.Y=25;
    //jetz position setzen
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), abc );
    cout << header;
    // LOCATE(25,1); 
    
    abc.X=25;
    abc.Y=1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), abc );
    cout << boden;
     
     while(true) // Ball "immer" springen lassen
     {
                // LOCATE(x,y); 
                     abc.X=x;
                      abc.Y=y;
                      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), abc );
                 cout << 'o' << endl; // Ball anzeigen
                 for (long warten = 0; warten < DELAY; ++warten);
                 
                     if (x == 1 || x == 79) dx = -dx; // An einer Wand?
                     
                     if (y == 24)  // Am Boden?
                     {
                           geschw = -geschw;
                           if ( geschw == 0 ) geschw = -7; // Neu Anstoßen
                     }
                     
                     geschw += 1; // Beschleunigung 1
                     
                    // LOCATE (x,y);
                         abc.X=x;
                         abc.Y=y;
                         SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), abc ); cout << ' '; 
                         //CLS;
                           system("CLS");// Anzeige löschen
                     y += geschw; x += dx; // Neue Position

     }
     system("BREAK");
     return 0;
}

Die Steuerzeichen gibt es nur wenn man den ANSI Treiber, der für die Escapezeichen) mit in das C++ Project aufnimmt, war mir zu viel arbeit. Daher habe ich mir eine Funktion aus <windows.h> ergoogelt und sie implementiert.
 
Wie lädt man denn den ANSI Treiber ins Projekt? Im Buch kommen nämlich noch mehr ähnliche Aufgaben und die will ich ja lösen können.
 
Zuletzt bearbeitet:
Das ist aus C++ Lernen und Professionell anwenden, oder? Da ist zumindest die exakt selbe Aufgabe enthalten.

Es ist einfacher die Funktionen Windows spezifisch nachzubilden, dafür kannst du einfach die Dateien "console.h" und "console.cpp" in dein Projekt einbinden (da ich nicht der Urheber bin nur als Anhang ...)

Du musst dann "console.h" includen und kannst definieren:
Code:
#define  CLS          cls()               // Bildschirm loeschen
#define  LOCATE(z,s)  setCursor(z-1,s-1)  // Cursor in Zeile z,
                                          // Spalte s positionieren
Aber eigentlich ist das auch im Buch erklärt und die entsprechenden Musterlösungen für Windows sind afaik auch auf der CD enthalten ;)
 
Ja genau, das ist aus dem Buch.
Ich hab die zwei Dateien ins Projekt gezogen und console.h inkludiert.
Code:
// Simuliert einen springenden Ball

#include <iostream>
#include <string>
#include <console.h>
using namespace std;

#define DELAY 10000000L // Verzögerung
#define CLS (cout << "\033[2J" ) // Bildschirm löschen
#define LOCATE(z,s) (cout <<"\033[" << z << ';' << s << 'H') // Cu8rsor in Zeile z und Spalte s positionieren

int main()
{
     int x = 2, y = 3, dx = 1, geschw = 0;
     string boden(79, '-'), header = "**** Springender Ball *****";
     
     CLS;
     LOCATE(1,25); cout << header;
     LOCATE(25,1); cout << boden;
     
     while(true) // Ball "immer" springen lassen
     {
                 LOCATE(x,y); cout << 'o' << endl; // Ball anzeigen
                 for (long warten = 0; warten < DELAY; ++warten)
                     ;
                 
                     if (x == 1 || x == 79) dx = -dx; // An einer Wand?
                     
                     if (y == 24)  // Am Boden?
                     {
                           geschw = -geschw;
                           if ( geschw == 0 ) geschw = -7; // Neu Anstoßen
                     }
                     
                     geschw += 1; // Beschleunigung 1
                     
                     LOCATE (x,y); cout << ' '; CLS;// Anzeige löschen
                     y += geschw; x += dx; // Neue Position
     }
}

Aber was genau ist jetzt der Unterschied zu vorhin?
 
Zuletzt bearbeitet:
Ja so geht es natürlich noch nicht. Wie ich oben geschrieben habe musst du noch die #defines von CLS und LOCATE ändern.

"console.h" definiert die Funktionen:

Code:
bool cls();
bool setCursor( int zeile, int spalte);
bool setColor( int color );

void cursorOff();
void cursorOn();
Damit können die Aufgaben aus dem Buch alle mit der Windows Console bearbeitet werden.
 
@iBinomic: Weiß jetzt nicht, was du genau meinst, was an der main-Funktion liegen soll. Die muss jedenfalls immer int zurückliefern (siehe dazu auch: Main function - Wikipedia, the free encyclopedia). Vielleicht wäre es besser für dich, dich erstmal mit den Grundideen von C auseinander zu setzen, bevor du solche Spielereien in der Konsole machst. :wink:

Es muss nicht immer int main() heißen, siehe hier:
Code:
#include <iostream>
#include <string>
using namespace std;

#include "console.h"   // Win32 Konsolenfunktionen

#define  CLS          cls()              // Bildschirm loeschen
#define  LOCATE(z,s)  setCursor(z-1,s-1) // Cursor in Zeile z, 
                                         // Spalte s positionieren.
#define DELAY  50000000L                 // Verzögerung

void main()
{
   int x = 2, y = 3, dx = 1, geschw = 0;
   string boden(79, '-'),
          header = "****  SPRINGENDER BALL  ****";

   CLS;
   LOCATE(1,25);  cout << header;
   LOCATE(25,1);  cout << boden;

   while(true)      // Ball "immer" springen lassen
   {
     LOCATE(y,x);
     cout << 'o' << endl;              // Ball anzeigen
     for( long warten = 0; warten < DELAY; ++warten)
       ;

     if(x == 1 || x == 79) dx = -dx;   // An einer Wand?
     if( y == 24 )                     // Am Boden?
     {
       geschw = - geschw;
       if( geschw == 0 ) geschw = -7;  // Neu anstossen
     }
     geschw += 1;                 // Beschleunigung = 1

     LOCATE(y,x); cout <<  ' ';   // Anzeige löschen
     y += geschw;  x += dx;       // Neue Position
   }
}

Funktioniert perfekt.
 
Zurück
Oben