Suche Aufgabe - Rund um das Thema Konsolen Programmierung
-
Ich würde dir vorschlagen, nachdem du die Fragen meines Vorposters beantwortet hast, ein kleines Tic Tac Toe Spiel mit einfacher (!) AI zu programmieren. Dies habe ich auch getan und es ist ganz nett. Die AI muss ja nicht auf irgendwelchen mathematischen Formeln basieren sondern kann, ganz individuell, für jeden Spielzug programmiert werden. Dies bedeutet zwar viel Aufwand, aber man lernt eine Menge!
-
MAch doch zum aufwärmen das heiss geliebte Zahlenraten mit versch. Leveln, Bonuspunkten, Highscore usw.
-
Galgenraten!
-
knivil schrieb:
Galgenraten!
Mit ASCII Animation! Habe ich noch nie als Konsolenversion gesehen. Wäre echt nett.

-
Ich habe ein Programm geschrieben, mit dem man ASCII-Bilder aus Dateien lesen, erstellen und editieren kann.
Ich denke ich fange mit Zahlenraten an.
Tut mir leid wenn sich das dumm anhört, aber ich habe noch nie etwas davon gehört, ich hab mir bei Google mal die Spielregeln ausgelesen, jetzt weiß ich wie's geht. Ich werde das Spiel jetzt programmieren.Ich hoffe der Code wird euch gefallen, erster Linie natürlich das Spiel.
-
Developer_X schrieb:
Ich hoffe der Code wird euch gefallen, erster Linie natürlich das Spiel.
Sei bitte nicht enttaeuscht. Du tust das fuer dich und nicht fuer uns. Der Code eines Anfaengers wird wohl viele Maengel aufweisen. Trotzdem ist es gut zum Ueben.
-
Developer_X schrieb:
Ich hoffe der Code wird euch gefallen, erster Linie natürlich das Spiel.
Programmier den besser nicht für uns. Wahrscheinlich wird hier jeder schon solche Dinge programmiert haben als Anfänger und von zig anderen Anfänger gesehen haben.

Du kannst im Projekte Forum den Code dann allerdings schon reinstellen, wenn du Kritik dazu möchtest. Da es aber einiges an Aufwand zum Erstellen von sinnvollen Kritiken braucht, stell dich besser darauf ein, dass du nicht so schnell eine bekommst, wenn überhaupt
Auch noch eine interessante Aufgabe wäre Game Of Life oder irgendeine Abwandlung davon zu programmieren.
Grüssli
-
Ich habe eure Posts gelesen, aber ich bitte euch trotzdem mal nach meinem Code zu schauen, er funktioniert so, wie ich ihn mir vorgestellt habe:
- Beim Spielen kann man den Raum angeben. (sprich von 0 bis Eingabe)
- Bei falschen Versuchen sollte gesagt werden, ob es eine kleinere oder größere Zahl ist.
- Die bisherige Anzahl von Versuchen soll bei jedem neuen Versuch angezeigt werden.
Zahlen_Raten.cpp
// Zahlen Raten, Von Kevin Riehl #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <time.h> #include <string> #include <iostream> using namespace std; // Methods void printTitle() { cout << "- Zahlen Raten -" << endl; } void drawLine() { cout << "----------------" << endl; } bool Menu() { bool answer = false; cout << "<1> Neues Spiel" << endl; cout << "<2> Beenden" << endl; int input = 0; while(cin.fail()||input<1||input>2) { drawLine(); cout << "Bitte Waehlen Sie!" << endl; cin >> input; } switch(input) { case 1 : answer = true; break; case 2 : answer = false; break; } return answer; } void play() { int max = -1; int number; int eingabe = -1; int experiments = 0; cout << endl << endl; drawLine(); cout << "Neues Spiel" << endl; drawLine(); while(cin.fail()||max<=0) { cout << "Geben Sie den Zahlenraum der Zahl an (von 0 bis Ihrer Eingabe) : "; cin >> max; } drawLine(); number = rand()%max; while(eingabe!=number) { cout << "Bisherige Versuche : " << experiments << "." << endl; cout << "Geben Sie eine Zahl zwischen 0 und " << max << " ein." << endl; cin >> eingabe; while(cin.fail()) { cout << "Geben Sie eine !Zahl! zwischen 0 und " << max << " ein." << endl; cin >> eingabe; } experiments++; if(eingabe < number) cout << "Groesser!" << endl; if(eingabe > number) cout << "Kleiner!" << endl; } cout << endl; cout << "Sie haben die richtige Zahl erraten, es ist " << number << "." << endl; cout << "Das haben Sie nach " << experiments << " Versuchen herausgefunden. Herzlichen Glueckwunsch! " << endl; drawLine(); cout << endl << endl; } // Main int _tmain(int argc, _TCHAR* argv[]) { printTitle(); drawLine(); while(true) { bool action = Menu(); switch(action) { case true : play(); break; case false : return 0; } } return 0; }Ich möchte unbedingt wissen was ihr von ihm haltet, da ich mich verbessern will, und nicht ewig auf meinem Stand bleiben will, schaut ihn euch bitte mal an,
M.f.G.
Developer_X 
-
- Benutz die C++ Versionen der Header (z.B ctime).
- Nach Funktionsdefinitionen kannst du ruhig eine Zeile Abstand lassen
- Objektorientierung
- in der main würde ich nicht unbedingt ein switch/case Gebilde machen. Da benutzt man üblicherweise if/else
- Deklarier Variablen erst, wenn du sie mit einem sinnvollen Wert initialisieren kannst (siehe play())
- Zeile 71-79 kann man schöner machen. Überleg wie!
- Wähle eine Sprache für die Bezeichner im Code (am besten Englisch)
- Warum ist
Menugross und alle anderen klein?
Ansonsten sieht es eigentlich relativ anständig aus (Vom Stil her).
Viel mehr als ein wenig den Stil und kleine Mängel beanstanden können wir nicht. Du musst selbst grössere Projekte machen, um besser zu werden, denn nur da wirst du auf die gängigen Probleme stossen..
-
Noch ein paar zusätzlich Dinge:
- Du hast viel zu viele Header drin. Für dein Programm sollten
<cstdlib>und<iostream>ausreichen. - Starte lieber mit einem Empty Project in Visual Studio. Dann kannst duch auch einfach auf den Precompiled Header verzichten (
stdafx.h). Sowas brauchst du aktuell sowieso noch nicht. - Deine main ist kompilerspezifisch. Auch brauchst du die Argument gar nicht, also nimm gleich
int main(). Wahrscheinlich einfach übernommen, weil du nicht ein Empty Project gestartet hast, oder?
- using namespace std; Bitte äusserste Vorsicht damit. Damit hebelst du den Sinn von Namensräumen aus, sowas sollte man mit bedacht benutzen. Als Anfänger empfehle ich grundsätzlich, dies wegzulassen. Aber darüber sind die Leute geteilter Meinung.
- std::endl heisst nicht "füge eine neue Zeile ein", sondern "füge eine neue Zeile ein und führe ein Flush durch". Wenn man nur eine neue Zeile möchte, sollte man eher
'\n'verwenden. - Mehr Raum einführen wurde ja schon gesagt ...
- Und die unnötigen switches auch ...
- Daher fällt mir grad nix mehr ein

Grüssli
- Du hast viel zu viele Header drin. Für dein Programm sollten
-
Das was schon gesagt wurde. Außerdem:
- Viele der benutzten Header brauchst du nicht. Du benutzt nur cstdlib und iostream
- Wo du ctime schon benutzt, kannst du auch ein
srand(time(0))ganz am Anfang machen, sonst kommt immer das gleiche Spiel - Du fängst zwar falsche Eingaben ab, aber danach ist das Programm in einer Endlosschleife (gib z.B. mal einen Buchstaben ein). Überleg dir mal, wie du sowas behandeln kannst.
- Wenn du schon bool-Werte benutzt, dann benutze sie auch
! Deine switches sind total umständlich. Die main könnte man so kurz schreiben: while (Menu()) play(); - Wenn du Zahlen hast, die nur positiv sein können, so gibt es dafür den Datentyp
unsigned int
-
Danke für all eure Ratschläge, besonders den mit dem Empty Project, so etwas habe ich gesucht, mir wurde gesagt, ich sollte das mit Win32 Konsolenanwendung machen.
Zu SeppJ,
ich akzeptiere alle Punkte außer einen, ich fange immer die Zahl ab, wenn ein Buchstabe eingegeben wird, dann muss man so lange eine Eingabe machen bis es eine Zahl ist, teilweise sogar solange, bis die Zahl im richtigen Raum liegt.
Das ist wirklich so, oder nenne mir bitte eine Stelle wo ich es micht so gemacht, habe, mit cin.fail()-Ich werde das Spiel erst einmal optimieren, danach wage ich mich an etwas größeres,
M.f.G. Developer_X
-
also ich könnt schon nen scheiß an start bringen:(
-
OK, ich habe meinem Spiel sogar noch meine Library hinzugefügt.
Den Code habe ich auch optimiert, und ich muss zugeben, ich habe doch nicht
das Ereignis, dass ein Buchstabe eingegeben wird, gehandelt. Ich dachte cin.fail() reicht, aber das tut es wohl doch nicht. Kann mir einer helfen, in Google habe ich dazu nichts passendes gefunden.Wie kann ich eine Zahl einlesen, und nur eine Zahl, bei anderer Eingabe wird das Einlesen wieder holt, quasi in einer Schleife.
Bisher tat ich das ja immer so:
int zahl; cout << "Geben Sie eine Zahl an." << "\n"; cin >> zahl; while(cin.fail()) { cout << "Geben Sie eine Zahl an." << "\n"; cin >> zahl; }Das reicht aber nicht, wenn ich dem Programm einen Buchstaben gebe, dann ist es wort wörtlich sprachlos^^.
Wie kann ich also herausfinden, ob ein Wert ein Buchstabe ist?
quasi etwas wie isDigit, wenn es so etwas gibt, und in welchem Header ist dies dann?Danke für eure Hilfen,
M.f.G. Developer_X
-
mach doch was mit unicode
-
Eine von mehreren Möglichkeiten:
http://www.cplusplus.com/reference/clibrary/cctype/isalpha/ist zwar nicht ganz passend, aber, wenn du das weiterverfolgst gibt es auch etwas für Zahlen.
-
#include <iostream> #include <limits> int main() { int zahl; std::cout << "Geben Sie eine Zahl ein:\n"; while(!(std::cin >> zahl)) { // clear hebt den "Fehlerzustand" wieder auf std::cin.clear(); // ignore verwirft die falsch eingegebenen Zeichen std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Fehlerhafte Eingabe, probieren Sie es noch einmal:\n"; } std::cout << "Eingegebene Zahl: " << zahl << "\n"; }
-
das ist ja einfach, danke, ich mach das grad noch fertig.
-

OhneName schrieb:
#include <iostream> #include <limits> int main() { int zahl; std::cout << "Geben Sie eine Zahl ein:\n"; while(!(std::cin >> zahl)) { // clear hebt den "Fehlerzustand" wieder auf std::cin.clear(); // ignore verwirft die falsch eingegebenen Zeichen std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Fehlerhafte Eingabe, probieren Sie es noch einmal:\n"; } std::cout << "Eingegebene Zahl: " << zahl << "\n"; }Das mit dem Ignore wird bei meinem VS als rot angestrichen.
Bist du sicher , dass das richtig ist? Ich habe limits included, keine Sorge^^.
-
Ich hätte noch eine Idee: ein Kartenspiel wie Hearts als Konsolenspiel. Lässt sich sicher auch in Textform gut spielen.
Edit: Auch wenn das rot angestrichen wird, kompiliert es denn? Wenn nicht, was ist die Fehlermeldung?