C++ Eingabe in der Konsole zensieren

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
ich bin gerade dabei C++ zu lernen und ich programmiere Grad ein Schere, Stein, Papier spiel um meine bisherigen Kenntnisse zu festigen.

Aber ich habe nun ein Problem. Es geht darum, dass als Option folgendes zu Auswahl steht:

Player vs. Player
Player vs Computer
Highscore
Ende
About

Soweit funktioniert jetzt alles einwandfrei (außer Highscore, da ich noch nicht soweit bin, dass ich sowas proggen kann.), aber bei Player vs Player wenn man die Auswahl eintippt, dann kann man dass ja sehen.

Sowohl was der erste Spieler eingegeben hat (Schere, Stein, Papier) als auch was der zweite Spieler eingibt.

Meine Frage nun: Gibt es eine möglichkeit die Eingabe entweder schon während dem eintippen zu zensieren oder wenigstens nach dem Entertaste drücken?


Da ich gerade erst vor kurzem angefangen habe damit kenn ich mich da nicht so aus.
Bitte um Hilfe

Danke schon mal im Vorraus.
 
du kannst die Tasten für schere, stein, papier zuweisen... das wird im hintergrund abgespeichert und später verklichen.
Kannst A,B,C nehmen für S,S,P :D oder schrere = s, stein = n, papier = p
Wenn du übers netzwerk das ganze ja machst dann brauchst du nur die sache von den eigenen PC anzuzeigen.
 
Solltest du auf Windows programmieren kannst du die Funktion "_getch()" aus dem Header "conio.h" nehmen, diese Funktion liest ein Zeichen von der Tastatur ein, jedoch ohne dieses in der Konsole auszugeben.
Hier ein Beispiel:
Code:
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
	char cInput;

	cout << "Choose: ";
	cInput = _getch();
	cout << "*" << endl;

	if( cInput == 'R' || cInput == 'r' )
	{
		cout << "You have chosen \'Rock\'" << endl;
	}
	else if( cInput == 'P' || cInput == 'p' )
	{
		cout << "You have chosen \'Paper\'" << endl;
	}
	else if( cInput == 'S' || cInput == 's' )
	{
		cout << "You have chosen \'Scissors\'" << endl;
	}
	else
	{
		cout << "ERROR - Incorrect input!" << endl;
	}

	cout << endl << "Press any key to exit . . . ";
	_getch();
	return 0;
}

Gruß
BlackMark
 
Lies es dort nach, wo man bei Fragen zu C++ als erstes nachsieht.
Der definitiven Übersicht der wichtigsten Gründe, warum C++ so
gewaltig großer Mist ist. C++ Frequently questioned Answers, 15.18:
C++ FQA 15.18

[15.18] How can I make it so keys pressed by users are not echoed on the screen?
FAQ: You can't. See 15.17
Und bei 15.17 kann man lesen:
FAQ: The C++ standard doesn't even assume your system has a keyboard. So there's no portable way.

€:
Es lohnt sich außerdem, die ganze C++ FQA einmal zu lesen, vor allem,
wenn man C++ noch nicht lange benutzt -- also noch nicht von dieser
hirnverbrannten Sprache vollständig geistig verdreht ist. So kann man
dann einsehen, dass es ein Fehler war, auf C++ zu setzen und noch
eine andere Sprache lernen, bevor man allzu großen Schaden genommen
hat.

LINK
 
Zuletzt bearbeitet:
Was soll man solchen Menschen sagen?
 
Zuletzt bearbeitet: (Ich habe nachträglich beschlossen, mich nicht auf das Niveau von asdfman einzulassen.)
@asdfman: Hast du ein Kindheitstrauma durch C++ erlitten oder warum versuchst du mit aller Gewalt hier Anti-Werbung zu machen?
Der C++ Standard wäre auch etwas zu umfangreich, wenn man alle nur erdenklichen Funktionen mit einbaut, deshalb gibt es auch Bibliotheken und Header, die die benötigten Features liefern.
C++ ist gerade aus diesem Grund so vielseitig, weil man über den Standard viel mehr Möglichkeiten und Freiheit hat.

Natürlich muss nicht jedem diese Sprache liegen, es kommt auch immer auf das Anwendungsgebiet an, aber deine Anti-Werbung bringt den Thread-Ersteller sicher nicht weiter!

Gruß
BlackMark
 
@asdfman: Du hast wohl offensichtlich noch nicht den Unterschied zwischen der Sprache und Bibliotheken erkannt. Macht nix, kann man ja nachholen.
 
@asdfman: Du hast wohl offensichtlich noch nicht den Unterschied zwischen der Sprache und Bibliotheken erkannt. Macht nix, kann man ja nachholen.
Man möge den Post erneut lesen und erkennen, dass keinerlei Kritik an der Standardbibliothek geübt wird, sondern am Standard, der die Sprache definiert und somit ausschließlich an der Sprache an sich.

Außerdem wurde dem Threadersteller geholfen. Ich habe ihm als einziger der vielen Leute hier gesagt, dass es mit C++ keine portable Möglichkeit gibt, das zu machen was er will.
 
Zuletzt bearbeitet:
Deine Pauschalkritik ist einfach unangemessen. Begründe deine Kritik und zeige Alternativen auf. Welche Sprache entspricht denn deinen Anforderungen?
hirnverbrannten Sprache
Warum ist sie denn "hirnverbrannt"?
sondern am Standard
Vielleicht solltest du den Menschen, die den Standard beschlossen haben mal deine tolle Kritik vortragen, das würde sicher zu einer filigranen Aufheiterung füheren...

Abgesehen davon: Wie hast du dich denn schon mit C++ beschäftigt? Hast du Sachen nicht verstanden? Ich halte die Sprache absolut nicht für Hirnverbrannt sondern kann sie sehr gut nachvollziehen.

Um auch die Hintergründe der Sprache nachvollziehen zu können, empfehle ich dir: http://www2.research.att.com/~bs/dne.html

Um die Sprache insgesamt zu lernen: http://www2.research.att.com/~bs/bs_faq.html#best-book

Warum die nur alle die "hirnverbrannte" Sprache benutzen? http://www2.research.att.com/~bs/applications.html
 
Zuletzt bearbeitet:
asdfman schrieb:
Außerdem wurde dem Threadersteller geholfen. Ich habe ihm als einziger der vielen Leute hier gesagt, dass es mit C++ keine portable Möglichkeit gibt, das zu machen was er will.
Er wird deine Hilfe, welche darin besteht zu sagen "es geht nicht", sicher sehr wertschätzen, aber auch wenn es keine portable Lösung gibt, so gibt es doch eine Lösung.
Diese würdest du ihm aber nicht verraten, oder?

Gruß
BlackMark
 
So viele Details.
Beispielsweise das nicht halb und nicht ganz umgesetzte Paradigma der Objektorientierung, bedingt durch das festhalten an C und all seinen eigenen Problemen, ohne mit diesem kompatibel zu sein.

Inkonsistenzen, beispielsweise in der Überladung der Shiftoperatoren für Streams.
Bei Streams die extreme Umständlichkeit, einfache Dinge auszugeben (Sachen, die man mit einem einfachen printf() in ein paar Zeichen hat, brauchen in C++ gerne mal ein paar Zeilen)
Bei Operatorüberladung die mangelnde intuitivität des Ergebnisses.
Keine einheitliche ABI, so dass Verwendung von Bibliotheken, die mit anderen Compilern erstellt wurden schwer bis unmöglich ist.

Was meine Sprache der Wahl angeht, ist sie auch alles andere als perfekt. Ich habe leider viel zu lange C gelernt, um es jetzt einfach zu vergessen.

Eine wirklich schöne Sprache ist dagegen Scheme. Sie ist in extrem kurzer Zeit zu lernen, weil sie sehr minimalistisch ist, trotzdem ist sie dadurch, dass sie auf dem Lambdakalkül basiert unheimlich mächtig. Sie erlaub eine große Anzahl von Paradigmen, vor allem funktionale Programmierung, aber auch, wenn es denn sein muss, beispielsweise objektorientierte Programmierung. Scheme wird garbage collected und ist sicher, was bspw Buffer overflows angeht. Rundum eine wunderschöne Sprache und ich finde es schade, dass ich erst so spät von ihr erfahren habe, so dass es mir nicht einfach fällt, mich richtig in sie zu vertiefen.

Links mögen wir ja Alle. Also hier zu Scheme:
Structure and interpretation of computer programs
Ein Lehrbuch um Programmierung an sich zu lernen. Als Sprache wird Scheme verwendet

SICP Lectures
Die zum Buch gehörende Vorlesungsreihe. Sehr sehenswert.

edit:
Diese würdest du ihm aber nicht verraten, oder?
Wenn ich es wollte, ich wäre dazu einfach nicht in der Lage. Um ihm eine Lösung zu nennen, gibt er nicht genug Informationen her. Wenn man nun wüsste, auf welcher Plattform er entwickelt und mit welcher Entwicklungsumgebung, bzw mit welchem Compiler und welche Bibliotheken ihm zur Verfügung stehen, würde das zumindest einmal weiterhelfen. Eine allgemeine Lösung, die immer gilt, gibt es nun einmal nicht. Das sagte ich ihm dann auch.
 
Zuletzt bearbeitet:
ohne mit diesem kompatibel zu sein.
Es ist nicht vollständig kompatibel, dass ist richtig. Allerdings gab es hier auch einige Gründe (siehe "The Design and Evolution of C++").
sie auf dem Lambdakalkül basiert unheimlich mächtig.
Das ist richtig (wohl mit Compilerbau und Typtheorie zu tun (gehabt)?).
Scheme wird garbage collected
Wenn ich das als implizit so auffasse, dass es für C++ keine garbage collection gebe, siehe: http://www2.research.att.com/~bs/bs_faq.html#garbage-collection

Ich möchte folgendes Bemerken: Das es bei der Wahl einer Programmiersprache verschiedene Präferenzen gibt oder unterschiedliche Anforderungen, bedingt durch die Frage ob es sich um eine nur im akademischen Umfeld genutzte Programmiersprache handelt oder nicht, will ich nicht bestreiten. Auch das C++ nicht perfekt ist (wie wohl jede Programmiersprache), habe ich nicht bestritten.
Aber die Sprache als "hirnverbrannt" zu bezeichnen ist schlicht lächerlich.

Zum anderen ist wohl keine "general purpose"-Programmiersprache häufig erste Wahl bei speziellen Anforderungen. Und dass bei Programmiersprachen, die Millionen von Nutzer haben, Kompromisse eingegangen werden müssen, ist auch klar. Selbst bei den Leuten, die den Standard festlegen. Im Übrigen halte ich die Tatsache, dass C++ ein Standardkonsortium hat, für sehr positiv.
also noch nicht von dieser
hirnverbrannten Sprache vollständig geistig verdreht ist.
So etwas ist weder sinnvoll, noch richtig.

Sicher, es gibt unterschiedliche Ansichten, wie eine Programmiersprache sein soll. Und wenn einem eine nicht gefällt -> "Don't use it".
Aber hier einfach in einer diesem Forum unangemessenen Sprache und völlig undifferenzierten Weise eine Programmiersprache so sinnlos anzugreifen ist einfach falsch.

Kannst du dem zustimmen?

Gruß,

badday
 
Zuletzt bearbeitet:
asdfman schrieb:
Wenn man nun wüsste, auf welcher Plattform er entwickelt und mit welcher Entwicklungsumgebung, bzw mit welchem Compiler und welche Bibliotheken ihm zur Verfügung stehen, würde das zumindest einmal weiterhelfen. Eine allgemeine Lösung, die immer gilt, gibt es nun einmal nicht. Das sagte ich ihm dann auch.
Seltsamerweise hast du aber auch nicht nach diesen Informationen gefragt, dass es keine allgemeine Lösung gibt ist eine Sache, aber eine Lösung für ihn zu finden eine Andere.
Es wäre vielleicht hilfreicher gewesen, wenn du nach diesen Informationen gefragt hättest, anstatt nur zu sagen, dass es keine allgemeine Lösung gibt.

Gruß
BlackMark
 
Hm Leute...

Hab die Nacht von Do auf Fr durchgemacht und war ein wenig wirr :(
Jetzt bin ich etwas ausgeschlafener und mir kommen meine Posts etwas daneben vor.
Sorry dafür.

Mögen tu ich C++ aber nun auch nicht.
 
Hallo Leute,
sorry dass ich so spät antworte.

Also ich entwickle mit Dev C++ und der Compiler ist mingw soweit ich weiß. Das OS ist natürlich Windows, aber wäre cool, wenns für andere OS auch eine Lösung gebe.

Eine Netzwerkfunktion gibt es derzeit nicht. Wie gesagt hab ja grad erst angefangen mit C++, aber wenn ich irgendwann mal soweit bin, dann ist sowas sehr gut denkbar. Will später mal den Highscore auch mal netzwerkfähig machen ;-) :D

PS: das mit _getch() werd ich mal ausprobieren und gebe dann bescheid obs funktioniert hat und sowas. Wäre aber trotzdem dankbar, wenn jemand doch noch eine Lösung auch für andere OS kennen würde.
 
ok also das funktioniert nicht so ganz.

was ich jetzt gelesen habe, liefert das _getch nur einen integer zurück, also kann ich den doch gar nicht für eine char variable verwenden oder?

der debugger gibt mir auch einen fehler zurück: incopatible types in assignment of int to char[10]

und wer sich den fehler ansieht bemerkt sicher auch schon, dass meine absicht war nicht nur einen buchstaben einzugeben, sondern ein wort ^^

gibt es da ne möglichkeit das ganze wort unsichtbar oder zensiert zu machen? wenn nicht, dann werde ichs wohl umändern müssen in buchstaben. =(
 
int zu char* geht natürlich nicht, weil char* ein Zeiger ist. Wander die einzelnen Offsets des Arrays ab und weise jeweils einmal die Rückgabe der Funktion zu. Das sollte gehen.
 
Zurück
Oben