C++ Anfänger hat 2 Fragen ( Funktion und Enummeration)

LordofFrog

Enthusiast
Thread Starter
Mitglied seit
03.11.2007
Beiträge
416
ich brauche mal rat, ich habe ein kleines spiel geschrieben, ist auch noch nicht fertig.

Code:
// Autorennen.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include <iomanip>
#include <windows.h>
#include <cstdlib>



using namespace std;

void rahmen(void);   // Rahmen zeichnen
void gotoxy(int x, int y); // Mauszeiger auf Punkt im Fenster setzen.
void strecke(void);  // Streckenbegrenzungen

const int STARTX=25,STARTY=25;  // Startposition des Fahrzeugs

class Auto
{
public:
	int itsFarbe;
	
	int itsXPosition;
	int itsYPosition;
		
	void fahrzeug(int posix,int posiy, int farbe)// Fahrzeug erstellen
    {
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , farbe);
	  gotoxy(posix,posiy);
	  cout<<"  /^\\  ";
	  gotoxy(posix,posiy+1);
	  cout<<"0-| |-0";
	  gotoxy(posix,posiy+2);
	  cout<<"  | |  ";
	  gotoxy(posix,posiy+3);
	  cout<<"0-|_|-0";
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , 7);
    };

	void bewegen(int posix, int posiy, int farbe) // Fahrzeug bewegen
    {
	  char richtung; 	
	  do{
		richtung = _getch();	
		switch(richtung)
		{
	       case'w':
				  if (itsYPosition > 0)
				  {
		                 itsYPosition-=1;
						 fahrzeug(itsXPosition, itsYPosition, farbe);
						 gotoxy(itsXPosition,itsYPosition+4);
	                     cout<<"       ";
				  }
				  break;
		                 
		   case's':
				  if (itsYPosition <= 75)
				  {
		                 itsYPosition+=1;
						 fahrzeug(itsXPosition, itsYPosition, farbe);
						 gotoxy(itsXPosition,itsYPosition-1);
	                     cout<<"       ";					 
				  }
				  break;
		                 
		   case'a':
				  if (itsXPosition >= 7)
				  {
		                 itsXPosition-=1;
						 fahrzeug(itsXPosition, itsYPosition, farbe);
                         gotoxy(itsXPosition+7,itsYPosition+1);
	                     cout<<" ";
	                     gotoxy(itsXPosition+7,itsYPosition+3);
	                     cout<<" ";	 
				  }
				  break;
		                 
		   case'd':
				  if (itsXPosition <= 67)
				  {
		                 itsXPosition+=1;          
		                 fahrzeug(itsXPosition, itsYPosition, farbe);
						 gotoxy(itsXPosition-1,itsYPosition+1);
	                     cout<<" ";
	                     gotoxy(itsXPosition-1,itsYPosition+3);
	                     cout<<" ";
				  }
				  break;	
		};
	 }while (richtung != 'e');	
					
   }; //Ende der Bewegen Funktion

}; //Ende der Klasse


int _tmain(int argc, _TCHAR* argv[])
{
	CONSOLE_CURSOR_INFO ci = {10,FALSE};                           // Curser verschwinden lassen
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci);
	
	char ant;
	do
	{
       system("cls");
	   rahmen();
       gotoxy(20,4);
	   cout<< "Welcome to the DOS-Console Grand Prix";
	   gotoxy(25,10);
	   cout<< "Bitte Spielmodus waehlen!";
	   gotoxy(30,14);
	   cout<< "[S]ingleplayer";
	   gotoxy(30,15);
	   cout<< "[M]ultiplayer (NYI)";
	   ant=_getch();
	if(ant=='s' || ant=='S'|| ant=='m' || ant=='M'|| ant=='e'||ant=='E')
	{
		
		switch(ant)
		{
		    case'e':
		    case'E': 
			     gotoxy(27,20);
		         cout <<"Auf wiedersehen";
				 _getch();
			     exit(0);
			     break;
		   
			case's':
		    case'S':	

				Auto Player, PC1, PC;
				int farbe;
				enum Farben {Blau=11, Rot, Grün, Gelb};
				system("cls");
				rahmen();
				gotoxy(20,4);
				cout<<"Bitte Farbe waehlen!";
				cin>>Player.itsFarbe;
				system("cls");
				strecke();
				
				Player.itsXPosition=STARTX;
				Player.itsYPosition=STARTY;
				Player.fahrzeug(Player.itsXPosition, Player.itsYPosition, Player.itsFarbe);
				Player.bewegen(Player.itsXPosition, Player.itsYPosition, Player.itsFarbe);
				PC1.itsXPosition=STARTX;
				PC1.itsYPosition=STARTY;
				PC1.fahrzeug(PC1.itsXPosition, PC1.itsYPosition, 15);
				PC1.bewegen(PC1.itsXPosition, PC1.itsYPosition, 15);
				Player.bewegen(Player.itsXPosition, Player.itsYPosition, farbe);
				PC1.bewegen(PC1.itsXPosition, PC1.itsYPosition, 15);

				_getch();
				break;	              
		
						
		    case'm':
		    case'M':
				gotoxy(27,20);
			    cout<<"Noch nicht impementiert";
				_getch();
				break;		
		};		
				
	}else
	{	
		gotoxy(27,20);
		cout <<"Ungueltige Eingabe!!!";
		_getch();
	}
    }while(ant!='n' && ant!= 'N');
	_getch();
	return 0;
};

void rahmen(void)  //Erstellt einen Rahmen und zeigt Exit an
{
	int i;
	for(i= 0;i<80;i++)
	{
		cout<<"#";
	};
		
	for(i= 0;i<79;i++)
	{
		gotoxy(0,i);
		cout<<"#";	
	    gotoxy(79,i);
		cout<<"#";	
	};	
	for(i=1;i<80;i++)
	{
		gotoxy(i,78);
		cout<<"#";
	};
	gotoxy(5,70);
	cout<<"[E]xit";
};
void gotoxy(int x, int y) // Setzt den Curser an Position x y
{
  COORD point;
  point.X = x; point.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
};
void strecke(void)
{	
	for(int i=0;i<40;i++)
	{   
		gotoxy(3,(2*i));
		cout<<"# #";
		gotoxy(3,(2*i)+1);
		cout<<" # ";
		gotoxy(75,(2*i));
		cout<<" # ";
		gotoxy(75,(2*i)+1);
		cout<<"# #";
	};	
};

nun meine fragen:

ist es besser die positionen eines jeden fahrzeugs beim erstellen (z 149 )in der main funktion zu übergen oder besser in der klasse selber?

und wie funktioniert das mit der enummeration genau, wie muss ich es im Spiel eingeben, um dann die Farbe es Fahrzeugs zu bestimmen?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
So, ich klink mich mal ein - Ich bin absoluter Anfänger und habe das Problem, dass er mir einen Buchstabensalat beim folgenden Programm ausgibt.

Warum passiert das und wie kann ich das Ergebnis mit 2 Nachkommastellen versehen. (Double, float?:confused:)

#include <iostream>

using namespace std;

int main()
{
int k=0; // Verbrauchter Kraftstoff in Litern
int s=0; // Gefahrene Kilometer seit dem letzten Tanken
int b=0; // bezahlter Betrag in €
int x=0;
int y=0;
cout << "Wieviele Liter wurden getankt?" << endl;
cin >> k;

cout << "Wieviele Kilometer wurden gefahren?" << endl;
cin >> s;
cout << "Wieviel wurde bezahlt in Euro?" << endl;
cin >> b;

x= 100*(k/s);
y=(b/s)*100;

cout << "Ihr Durchschnittsverbrauch betraegt: " <<
cout << x << endl;

cout << "Ihre Kosten pro 100 km betragen: " <<
cout << y << endl;
return 0;
}
 
@=]NuEVO[=
"Don't forget the trailing semicolon"
-> Die Problemzone effektiv formatiert:
Code:
cout << "Ihr Durchschnittsverbrauch betraegt: " << cout << x << endl;
cout << "Ihre Kosten pro 100 km betragen: " << cout << y << endl;
vs.
Code:
cout << "Ihr Durchschnittsverbrauch betraegt: "<< x << endl;
cout << "Ihre Kosten pro 100 km betragen: "<< y << endl;
wie kann ich das Ergebnis mit 2 Nachkommastellen versehen. (Double, float? :confused:)
Ich würde dir mal empfehlen dich ein bisschen einzulesen und ggf. im Inet zu suchen, denn informationen über die versch. datentypen sind wirklich sehr einfach aufzutreiben:wink:
http://www.cplusplus.com/doc/tutorial/variables/

Wenn du wirklich genau zwei nachkommastellen willst kannst du entweder den C befehl printf nutzen oder durch methoden von cout die ausgabe formatieren (http://www.google.at/search?hl=de&source=hp&q=cout+float+ausgabe+formatieren&meta=&aq=f&oq=)
http://homepages.fh-giessen.de/~hg13399/download/progII/Prgiib02.pdf

@LordofFrog
ist es besser die positionen eines jeden fahrzeugs beim erstellen (z 149 )in der main funktion zu übergen oder besser in der klasse selber?
Wenn die position variabel sein soll in der main
und wie funktioniert das mit der enummeration genau, wie muss ich es im Spiel eingeben, um dann die Farbe es Fahrzeugs zu bestimmen?
kann ich dir leider nicht sagen... ich kann dir nur raten das inet zu befragen und codefragmente zu studieren die diesen befehl enthalten :wink:

Mir ist beim lesen deines codes aufgefallen dass du in der methode "bewegen" der klasse "Auto" Eingaben abfragst, Grafik darstellst, die position des autos verschiebst und das auch noch in einer schleife laufen lässt die erst abbricht wenn man "e" drückt (wieso das denn?)

Soweit ich mich jetzt mit OO auskenne ist das nicht im sinne des erfinders, die methode sollte nur das objekt der klasse auto manipulieren und nicht noch grafik,input usw. steueren
Dh. die schleife sollte meiner meinung nach in der das rennen abläuft sollte in der main ablaufen. (ist aber wie gesagt nur meine meinung..)
 
Jedes Auto wird wohl eine andere Position und eine andere Farbe haben. Sowas macht man überlichweise über den Konstruktor. Beim Instanziieren musst du die Werte dann übergeben. Wo du das machst ist völlig egal bzw hängt es davon ab wo du die Instanz brauchst.

Beim Rest gibt es nichts mehr hinzuzufügen. hydrotoxin hat schon alles wichtige gesagt. Ich würde ebenfalls die Ein und Ausgaben der Klasse nochmal überdenken. Wenn es möglich ist, sollte das über die Main laufen oder noch besser über eine weitere Klasse Spielfeld oder so ähnlich.

Ein Tipp noch: Ein paar Kommentare haben noch keinem Quelltext geschadet.
 
Tach,

1. das mit dem Abbrechen der schleife in der Klasse ist noch nicht entgültig, nur zum schreiben des programmes, da ich so viel schneller ausprobieren kann, ob sich das Auto Player bzw alle Auto Instanzen richtig bewegen ohne zb aus dem Fenster zu fahren, das wird noch geänder.

2. da die funktion "fahrzeug" das jeweilige Auto ja als zeichenketten auf den bildschirm zeichnet, muss ich ihm ja sagen, wo er anfangen soll. bei der funktion "bewegen" wird praktisch diese anfangsposition geändert und von der neuen position aus wieder gezeichnet. d.h. ich muss der funktion "fahrzeug" mitteilen, wo diese neue position ist. wie kann ich as umgehen, vllt. mit zeigern?

wenn ich also nur eine "bewegen" funktion in der main mache müsste sie jeweils an eine Instanz von Auto 2 werte zurückgeben (X und Y position), damit diese dann neu gezeichnet werden kann?
 
2. da die funktion "fahrzeug" das jeweilige Auto ja als zeichenketten auf den bildschirm zeichnet, muss ich ihm ja sagen, wo er anfangen soll. bei der funktion "bewegen" wird praktisch diese anfangsposition geändert und von der neuen position aus wieder gezeichnet. d.h. ich muss der funktion "fahrzeug" mitteilen, wo diese neue position ist. wie kann ich as umgehen, vllt. mit zeigern?

wenn ich also nur eine "bewegen" funktion in der main mache müsste sie jeweils an eine Instanz von Auto 2 werte zurückgeben (X und Y position), damit diese dann neu gezeichnet werden kann?
hier ein bisschen nutzloser pseudocode:
Code:
int main(){
//blah...
do{
key=input.get()
if key==blubb
auto.moverotate(angle); //bewegungsrichtung ggf. ändern
elseif key==blah
auto.speedadd(+);  //geschwindigkeit manipulieren
endif
auto.move();              //auto je nach geschwindigkeit und richtung bewegen
display.show();           //alles darstellen
}while(racenotover==true);
}
Du speicherst in jedem objekt der klasse auto selbst die position und manipulierst sie durch die methoden der klasse.

Deine frage ist nun wie "display.show()" in meinem bsp. an die koordinaten der autos kommt?

Der klasse auto könntest du seeehr einfach eine methode hinzufügen die die aktuelle x,y postion zurückgibt, und diese methode wird wiederum in "display.show()" aufgerufen.

Eine andere frage ist woher die funktion/methode zum darstellen weiß welche objekte es darstellen und informationen aufrufen muss...
In Python gibt es dafür die flexiblen Listen, ka wie man das in c++ lösen kann, würd mich ehrlich gesagt ziemlich interessieren :-)
 
Zuletzt bearbeitet:
so, habs jetzt anders gemacht, die methoden der klasse brauchen jetzt keine argumente mehr. die methoden bekommen die benötigten positionen nun dierekt als lokale variablen, die in der jeweiligen klasse gespeichert sind.






Code:
// Autorennen.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include <iomanip>
#include <windows.h>
#include <cstdlib>



using namespace std;

void rahmen(void);   // Rahmen zeichnen
void gotoxy(int x, int y); // Mauszeiger auf Punkt im Fenster setzen.
void strecke(void);  // Streckenbegrenzungen
void menü(void);

const int STARTX=25,STARTY=25;  // Startposition des Fahrzeugs

class Auto
{
public:
	
	int itsFarbe;
	int itsXPosition;
	int itsYPosition;
		
void fahrzeug()// Fahrzeug erstellen
    {
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , itsFarbe);
	  gotoxy(itsXPosition,itsYPosition);
	  cout<<"  /^\\  ";
	  gotoxy(itsXPosition,itsYPosition+1);
	  cout<<"0-| |-0";
	  gotoxy(itsXPosition,itsYPosition+2);
	  cout<<"  | |  ";
	  gotoxy(itsXPosition,itsYPosition+3);
	  cout<<"0-|_|-0";
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , 7);
    };
void bewegen() // Fahrzeug bewegen
    {
	  char richtung; 	
	  do{
		richtung = _getch();	
		switch(richtung)
		{
	       case'w':
				  if (itsYPosition > 0)
				  {
		                 itsYPosition-=1;
						 fahrzeug();
						 gotoxy(itsXPosition,itsYPosition+4);
	                     cout<<"       ";
				  }
				  break;
		                 
		   case's':
				  if (itsYPosition <= 75)
				  {
		                 itsYPosition+=1;
						 fahrzeug();
						 gotoxy(itsXPosition,itsYPosition-1);
	                     cout<<"       ";					 
				  }
				  break;
		                 
		   case'a':
				  if (itsXPosition >= 7)
				  {
		                 itsXPosition-=1;
						 fahrzeug();
                         gotoxy(itsXPosition+7,itsYPosition+1);
	                     cout<<" ";
	                     gotoxy(itsXPosition+7,itsYPosition+3);
	                     cout<<" ";	 
				  }
				  break;
		                 
		   case'd':
				  if (itsXPosition <= 67)
				  {
		                 itsXPosition+=1;          
		                 fahrzeug();
						 gotoxy(itsXPosition-1,itsYPosition+1);
	                     cout<<" ";
	                     gotoxy(itsXPosition-1,itsYPosition+3);
	                     cout<<" ";
				  }
				  break;	
		};
	 }while (richtung != 'e');	
					
   }; //Ende der Bewegen Funktion

}; //Ende der Klasse
int _tmain(int argc, _TCHAR* argv[])
{
	CONSOLE_CURSOR_INFO ci = {10,FALSE};                           // Curser verschwinden lassen
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci);
	
	char ant;
	
	do
	{
	   menü();
       ant=_getch();
	if(ant=='s' || ant=='S'|| ant=='m' || ant=='M'|| ant=='e'||ant=='E')
	{
		
		switch(ant)
		{
		    case'e':
		    case'E': 
			     gotoxy(27,20);
		         cout <<"Auf wiedersehen";
				 _getch();
			     exit(0);
			     break;
		   
			case's':
		    case'S':	

				Auto Player, PC1;
				enum Farben { Dunkelblau=1, Grün, Blaugrün, Bordou, Violett, Cyan=11, Rot, Pink, Gelb, Weiss};
				system("cls");
				rahmen();
				gotoxy(20,4);
				cout<<"Bitte Farbe waehlen!";
				cin>>Player.itsFarbe;
				system("cls");
				strecke();
				Player.itsXPosition=STARTX;
				Player.itsYPosition=STARTY;
				Player.fahrzeug();
				Player.bewegen();
				cout<<"Bitte Farbe waehlen!";
				cin>>PC1.itsFarbe;
				PC1.itsXPosition=STARTX;
				PC1.itsYPosition=STARTY;
				PC1.fahrzeug();
				PC1.bewegen();			
				//_getch();
				break;	              
		
						
		    case'm':
		    case'M':
				gotoxy(27,20);
			    cout<<"Noch nicht implementiert";
				_getch();
				break;		
		};		
				
	}else
	{	
		gotoxy(27,20);
		cout <<"Ungueltige Eingabe!!!";
		_getch();
	}
    }while(ant!='e' && ant!= 'E');
	_getch();
	return 0;
};

void rahmen(void)  //Erstellt einen Rahmen und zeigt Exit an
{
	int i;
	for(i= 0;i<80;i++)
	{
		cout<<"#";
	};	
	for(i= 0;i<79;i++)
	{
		gotoxy(0,i);
		cout<<"#";	
	    gotoxy(79,i);
		cout<<"#";	
	};	
	for(i=1;i<80;i++)
	{
		gotoxy(i,78);
		cout<<"#";
	};
	gotoxy(5,70);
	cout<<"[E]xit";
};
void gotoxy(int x, int y) // Setzt den Curser an Position x y
{
  COORD point;
  point.X = x; point.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
};
void strecke(void)
{	
	for(int i=0;i<40;i++)
	{   
		gotoxy(3,(2*i));
		cout<<"# #";
		gotoxy(3,(2*i)+1);
		cout<<" # ";
		gotoxy(75,(2*i));
		cout<<" # ";
		gotoxy(75,(2*i)+1);
		cout<<"# #";
	};	
};
void menü(void)
{
	system("cls");
	   rahmen();
       gotoxy(20,4);
	   cout<< "Welcome to the DOS-Console Grand Prix";
	   gotoxy(25,10);
	   cout<< "Bitte Spielmodus waehlen!";
	   gotoxy(30,14);
	   cout<< "[S]ingleplayer";
	   gotoxy(30,15);
	   cout<< "[M]ultiplayer (NYI)";
};
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh