[Anfängerfrage] Problem bei Benutzereingabe

ja logisch aber trotzdem gibt es sie dortschon. d.h.der Speicherist bekannt
Reintheoretisch könnteman dies tuhen, es wird nur nicht unterstützt.
Aber ist ja auch egal ich wolltenur demIrrtum vorteuschen, dass wenn
man eine Variable initialisiert, dass diese dann 0 ist oder so.
 
Guten Abend liebe Community,

so, ich habe nun endlich wirklich alles fertig, was ich mir vorgestellt habe... und es funktioniert *freu*. Habe mein letztes Problem mit einem "break"-Befehl und einer weiteren "if"-Verwendung gelöst.

Ich wollte einmal wissen, ob ihr so lieb sein könntet und den Code einmal durchsehen könnt und mir ggf. Tipps für Verbesserungen oder Optimierungen geben könntet, damit ich diese gleich mitlerne und das nächste Mal erfolgreich anweden kann ;)

Ich habe auch die "bool"-Variante von 3Cyb3r versucht, aber nicht hinbekomme. Die Versuche habe ich einfach auskommentiert und es wäre sehr nett, falls mir einer die Lösung näher bringen könnte, sofern die Methode effizienter oder besser ist als meine jetztige.

C:
//Includes einlesen
#include <iostream>
#include <string>
 
//Namespace std für cout
using namespace std;
//Programm:
int main()
{
    system("title Daves Ratespiel");
    system("color 02");
    //Variablen setzten:
    string username;
    //bool right=false;
    int zahl = 6; // Zu ratende Zahl
    int zahl_try = 0; // Eigegebene Zahl vom Benutzer
    //Start:
    cout<<"Geben Sie bitte Ihren Namen an:"<<endl;
    cin>>username;
    cout<<"\nHallo "<<username<<", Ich moechte ein Spiel mit Ihnen spielen. \nSie haben gleich 3 Versuche, um eine Zahl zwischen 1 und 10 zu erraten"<<endl;
    
	
	for(int i=0; i<3; i++) // i ist nun dein Versuchszähler
	{
		cout<<"\n\nTeile mir doch jetzt bitte deinen "<<i+1<<". Tipp mit: ";
		cin>>zahl_try;
		if (zahl_try==zahl)
		{
            //bool right=true;             
			cout<<"Richtig, super\n";
		break;
		}             
       else //if (!right)
		{  
			cout<<"\n\nLeider falsch, versuche es bitte noch einmal.\nDas war der "<<i+1<<". von 3 Versuchen"<<endl;
			  
        }	
        if (i==3 && zahl_try != zahl)
        {
        cout<<"Du hast leider nun deinen 3. Versuch verbraucht.\n";
        }
	}

        //cout<<"Du hast leider nun deinen 3. Versuch verbraucht.\n";
  system("Pause");
  return 0;  
}
 
Dachte man hätte immer 3 Versuche unddie Zahlsoll per Zufallbestimmt werden -.-

Code:
#include "stdafx.h"
#include <iostream>
#include <time.h>
 
using namespace std;

int main()
{
    system("title Daves Ratespiel");
    system("color 02");

    bool right=false;
    int zahl; 
    int zahl_try;

	srand(time(NULL));
   
	for(int i=0; i<3; i++)
    {
		cout<<"\n\nTeile mir doch jetzt bitte deinen "<<i+1<<". Tipp mit: ";
        cin>>zahl_try;
		zahl=rand()%10+1;
        if (zahl_try==zahl)
        {
            right=true;            
            cout<<"Richtig, super\n";
        }            
		else    
			cout<<"\n\nLeider falsch, versuche es bitte noch einmal.\nDas war der "<<i+1<<". von 3 Versuchen"<<endl;
			
    }
	if (!right)
    {
		cout<<"Du hast leider nun deinen 3. Versuch verbraucht.\n";
    }

  system("Pause");
  return 0;  
}
 
Guten Abend,

mein "Ratespiel" funktioniert jetzt wirklich, wie gedacht :) . Ich habe micht nun entschlossen, ein kleines Adventure zu programmieren. Es wird eine kleine Story erzählt, die der Benutzer beeinflussen kann. Hier ein dahergegriffendes Beispiel:

Du bist in einem dunklen Raum, was machst du:
a=Kerze anzünden
b= Hilfe rufen
c= orientierungslos weitergehen

Je nachdem, welche Taste der User drückt, ändert sich die Situation. Ich versuche das "Spiel" (wenn man es überhaupt so nennen darf :) )auf mein bis lang gelerntes anzuwenden, damit ich meine momentanigen Kenntnisse einfach aufgreifen kann und sicherer sowie vertrauter mit C++ werde.

Wie sicherlich schon geahnt, gibt es die ersten Probleme und ich hoffe, ihr werdet mir wieder so super zur Seite stehen.

Ich habe zurzeit den "Startscreen" fertig, da ich es über die Console programmiere, versuche ich zu improvisieren, wo es nur geht ;) :
Startscreen

Der Code, der die ganzen # und den Text ausgibt, habe ich ein eine Header.h Datei gepackt, damit in der Main.cpp eine bessere Übersicht herrscht.
Header.h - Code für # und Text

Die Datei habe ich dann in den selben Ordner gepackt, wo die .*exe usw lagert. Auch unter Projekt-Optionen ist der Pfad angegeben, wo die Header-Dateien liegen.

Leider kommt beim Compilieren der Main.cpp ein Fehler.
Fehler beim Compilieren

Das Seltsame ist, dass der Compiler bei #include "Header.h" meckert, anstatt bei #include "Test.h", denn diese gibt es gar nicht und diente nur zu Testzwecken...

Sobald ich den Kommentar von #include <windows.h> entferne, wird die main.cpp ohne Fehler compiliert. Ich weiß, dass die Funktion Sleep den windows include benötigt... Aber sobald ich irgendetwas anderes "include", geht der Fehler bei Header.h weg

Ich hoffe, mir kann jemand meinen Fehler erklären und möchte mich schon im Voraus bedanken
 
Hi.
Der Code, der die ganzen # und den Text ausgibt, habe ich ein eine Header.h Datei gepackt, damit in der Main.cpp eine bessere Übersicht herrscht.
Definitionen gehören nicht in eine Header-Datei. In Header-Dateien werden lediglich Deklarationen vorgenommen. Die Definitionen werden in eigene .c Dateien geschrieben.
Leider kommt beim Compilieren der Main.cpp ein Fehler.
Fehler beim Compilieren

Das Seltsame ist, dass der Compiler bei #include "Header.h" meckert, anstatt bei #include "Test.h", denn diese gibt es gar nicht und diente nur zu Testzwecken...
Da hast du schief gekuckt. Im unteren Bereich ist die erste Compilermeldung markiert. Diese hängt mit der Warnung zusammen.

Darunter befindet sich doch klipp und klar die Fehlermeldung: "Test.h: No such file or directory".

Gruß

PS: Findest du es wirklich einfacher Bilder zu machen als den Code hier schnell reinzukopieren? Warum postest du nicht einfach die Compilerausgabe (aus dem Compiler-Log)
 
Guten Abend deepthroat,

Danke für deine Hilfe. Ich habe deinen Rat befolgt und jetzt 3 Dateien:

1. Header.h
C:
#include <iostream>
#include <iomanip>

using namespace std;

char Header();
//char Header()
//{
     //Header START:
        // cout<<setfill('#')<<setw(80)<<"#";
         //cout<<setfill(' ');
        // cout<<"#"<<setw(79)<<"#";
        // cout<<"#"<<setw(79)<<"#";
         //cout<<"#"<<"\t\t\t   Dracul -  A Vampire Story"<<setw(28)<<"#";
         //cout<<"#"<<"\t\t\t     Created by Lesterdor"<<setw(31)<<"#";
         //cout<<"#"<<setw(79)<<"#";
         //cout<<"#"<<setw(79)<<"#";
         //cout<<setfill('#')<<setw(85)<<"#\n\t\t\  ";
//Header END:
//}

2. Header.c
C:
#include <iostream>
#include "Header.h"
#include <iomanip>
using namespace std;
char Header()
{
     //Header START:
         cout<<setfill('#')<<setw(80)<<"#";
         cout<<setfill(' ');
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<"\t\t\t   Dracul -  A Vampire Story"<<setw(28)<<"#";
         cout<<"#"<<"\t\t\t     Created by Lesterdor"<<setw(31)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<setfill('#')<<setw(85)<<"#\n\t\t\  ";
//Header END:
}

3. Meine Main.cpp:
C:
//#include <cstdlib>
#include <iostream>
#include <iomanip>
#include "Header.h"
#include <windows.h>
#include "Header.c"


using namespace std;

     
int main()
{
    
    system ("title Dracul - A Vampire Story");
    system ("color 04");
    int x = 0;
    int y = 0;
          
  for (int i=0; i<224;i++)
  {
  x = x+6;
  Sleep (2);
  y=y+1;
HWND hwnd = FindWindow("ConsoleWindowClass",NULL); 
MoveWindow(hwnd,250,100,x,y,TRUE);
}
    cout<<Header();
    system("PAUSE");
    return 0;
}
Ist das so richtig, zumindest funktioniert es :) . Warum schreibt man das in 2 Dateiein (.*h und .*c), denn als ich alles in Header.h hatte, ging es ja auch?
 
Das ist wesentlich übersichtlicher in der einen Datei haste alle Prototypen und in der anderen die Funktionen ausformuliert.
Noch ein Tipp schreib in deine Header ifndef define und endif z.B.:
Code:
#ifndef HEADER_H
#definde HEADER_H

// und am Ende der Datei
#endif
Das soll doppeltes einbinden des Headers verhindern.
 
Zuletzt bearbeitet:
Hi.
Ist das so richtig, zumindest funktioniert es :)
Nein, du hast es nicht richtig gemacht. Headerdateien werden mit #include eingebunden. Die .c Dateien selbstverständlich nicht. Dann hättest du ja exakt die gleiche Situation wie vorher.

Die .c Datei mußt du einfach in dein Projekt mit einfügen. Diese wird dann separat compiliert und zum Schluß mit ins Programm eingebunden.
Warum schreibt man das in 2 Dateiein (.*h und .*c), denn als ich alles in Header.h hatte, ging es ja auch?
Weil es sonst bei mehreren Dateien zu Fehlern führt, da Variablen und Funktionen dann mehrfach definiert werden. Außerdem hat die Trennung den Vorteil, das Programmteile nur einmal kompiliert werden müssen, und wenn du Änderungen an einem Teil machst die anderen Teile nicht nochmal eingebunden werden.

Die nächste Sache ist, dass man grundsätzlich keine "using namespace" Anweisungen in Headerdateien schreibt, da dies den globalen Namensraum "verschmutzt". Stattdessen qualifiziert man die Typen usw. mit dem zugehörigen Namensraum (z.B. std::string etc.)

Gruß

PS: Und beachte auch den Hinweis von 3Cyb3r!
 
Guten Abend,

wie immer recht herzlichen Dank. Ich habe eure Ratschläge umgesetzt. Doch leider erhalte ich wieder eine Meldung beim Compilieren :rolleyes:

Header.h :

C:
#include <iostream>
#include <iomanip>
#ifndef Header.h
#definde Header.h

char Header();
//char Header()
//{
     //Header START:
        // cout<<setfill('#')<<setw(80)<<"#";
         //cout<<setfill(' ');
        // cout<<"#"<<setw(79)<<"#";
        // cout<<"#"<<setw(79)<<"#";
         //cout<<"#"<<"\t\t\t   Dracul -  A Vampire Story"<<setw(28)<<"#";
         //cout<<"#"<<"\t\t\t     Created by Lesterdor"<<setw(31)<<"#";
         //cout<<"#"<<setw(79)<<"#";
         //cout<<"#"<<setw(79)<<"#";
         //cout<<setfill('#')<<setw(85)<<"#\n\t\t\  ";
//Header END:
//}
#endif

Header.c:

C:
#include <iostream>
#include "Header.h"
#include <iomanip>

char Header()
{
     //Header START:
         cout<<setfill('#')<<setw(80)<<"#";
         cout<<setfill(' ');
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<"\t\t\t   Dracul -  A Vampire Story"<<setw(28)<<"#";
         cout<<"#"<<"\t\t\t     Created by Lesterdor"<<setw(31)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<"#"<<setw(79)<<"#";
         cout<<setfill('#')<<setw(85)<<"#\n\t\t\  ";
//Header END:
}

Main.cpp :

C:
//#include <cstdlib>
#include <iostream>
#include <iomanip>
#include "Header.h"
#include <windows.h>


using namespace std; 

int main()
{
    
    system ("title racul - A Vampire Story");
    system ("color 04");
    int x = 0;
    int y = 0;
            for (int i=0; i<224;i++)
  {
  x = x+6;
  Sleep (2);
  y=y+1;
HWND hwnd = FindWindow("ConsoleWindowClass",NULL); 
MoveWindow(hwnd,250,100,x,y,TRUE);
}

    cout<<Header();
    system("PAUSE");
    return 0;
}

Ich habe die Header.c dem Projekt hinzugefügt.

Compiler-Log:

In file included from main.cpp:4:
Header.h:3:15: warning: extra tokens at end of #ifndef directive
Header.h:4:2: invalid preprocessing directive #definde

make.exe: *** [main.o] Error 1

Ausführung beendet

Also ich ahne schon, dass es was mit ##ifndef und #definde zu tun hat, aber ich sollte es doch einbinden, was läuft da bloß wieder schief? :)

Wie immer danke ich im Voraus (auch wenn meine Fehler nerven, aber als Anfänger ist der Anfang schwierig ;) )
 
Zurück