none
Eingabe überprüfen RRS feed

  • Allgemeine Diskussion

  • Hallo!
    Ich, C++-Anfänger, schreibe gerade ein Spiel und habe folgendes Problem.
    Ich erwarte vom Spieler, dass er eine Eingabe tätigt.
    Zur Wahl stehen ihm die Integer 1, 2 oder 3.
    Mein Programm soll nun prüfen, ob die Eingabe gültig ist.
    Gültig sollen nur diese 3 Ziffern sein und alle anderen Zeichen (Buchstabe, Sonderzeichen, Zahlen) nicht.

    Für alle anderen Zahlen als 1, 2 und 3 habe ich folgenden Code:

    else if(level > 3 || level < 1)
    	{
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		goto Leveleingabe;
    	}

    und für fehlerhafte Eingabe folgenden Code:
    else if(cin.fail())
    	{
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		eingabeloeschen();
    		cin.clear();
    		cin.ignore(1000, '\n');
    		goto Leveleingabe;
    	}

    Beides löst mein Problem, ABER sobald ich beide Schleifen in meinen Code setze (ich blende immer die andere beim Testen aus, indem ich es als Kommentar zwischen "/* ... */" setze), habe ich ein Problem und zwar es entsteht eine Endlosschleife. Um es auszuprobieren kann ich Euch mal den ganzen Code hier zeigen (bin noch am Anfang - also Code noch unvollständig!):
    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <math.h>
    #include "ctime"
    
    using namespace std;
    
    int b,h,i,x,y,level; //global
    int feld [100][100];
    
    void gotoxy(int x,int y)
    {
    	HANDLE hConsole;
    	COORD cursorLoc;
    	std::cout.flush();
    	cursorLoc.X = x;
    	cursorLoc.Y = y;
    	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hConsole, cursorLoc);
    }
    
    void eingabeloeschen()
    {
    	int i = 0;
    
    	gotoxy(0,0);
    
    	do
    	{
    	std::cout << "                                                                               \n";
    	i++;
    	}
    	while(i<8);
    
    	gotoxy(0,0);
    }
    
    void felderstellen()
    {
    		for(y=0; y<b+2; y++)
    	{
    			gotoxy(0,y);
    			cout<<"#";
    			gotoxy(b+1,y);
    			cout<<"#";
    	}
    
    	for(x=0; x<h+2; x++)
    	{
    			gotoxy(x,0);
    			cout<<"#";
    			gotoxy(x,h+1);
    			cout<<"#";
    	}
    
    			for (x=1; x<b+1; x++) 
      { 
    		for (y=1; y<h+1; y++) 
        {
    			feld[x][y] = 0;  // Spielfeld = 0 -> Wasser
    			gotoxy(x,y);
    		  cout << "~"; // Wasser -> ~
    	}
      } 
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Leveleingabe:
    	cout << "Waehlen Sie eine Schwierigkeitsstufe aus:\n";
    	cout << "Einfach (1)\nMittel (2)\nSchwer (3)\n";
    	cin >> level;
    
    	eingabeloeschen(); // löscht (0,0) bis (80,0) und (0,7) bis (80,7) und kehrt auf (0,0) zurueck
    
    	if(level==1)
    	{
    		b = 5;
    		h = 5;
    	}
    	else if(level==2)
    	{
    		b = 8;
    		h = 8;
    	}
    	else if(level==3)
    	{
    		b = 12;
    		h = 12;
    	}
    	else if(level > 3 || level < 1)
    	{
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		goto Leveleingabe;
    	}
    	else if(cin.fail()) // http://www.tutorials.de/c-c/256971-pruefen-ob-eingabe-int-ist.html oder "c++ eingabe kein int" bei google
    	{
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		eingabeloeschen();
    		cin.clear();
    		cin.ignore(1000, '\n');
    		goto Leveleingabe;
    	}
    
    	felderstellen();
    
    	
    	_getch();
    	return 0;
    }

    Ich hoffe Ihr könnt mein Problem lösen!

    lg

    Donnerstag, 26. Dezember 2013 21:15

Alle Antworten

  • Hallo fener000,

    Erstens Du sollst GOTO nirgendwo in Deinem Code benutzen

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <math.h>
    #include "ctime"
    
    using namespace std;
    
    int b,h,i,x,y,level; //global
    int feld [100][100];
    
    void gotoxy(int x,int y)
    {
    	HANDLE hConsole;
    	COORD cursorLoc;
    	std::cout.flush();
    	cursorLoc.X = x;
    	cursorLoc.Y = y;
    	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hConsole, cursorLoc);
    }
    
    void eingabeloeschen()
    {
    	system("cls");
    }
    
    void felderstellen()
    {
    	for(y=0; y<b+2; y++)
    	{
    			gotoxy(0,y);
    			cout<<"#";
    			gotoxy(b+1,y);
    			cout<<"#";
    	}
    
    	for(x=0; x<h+2; x++)
    	{
    			gotoxy(x,0);
    			cout<<"#";
    			gotoxy(x,h+1);
    			cout<<"#";
    	}
    
    	for (x=1; x<b+1; x++) 	
    	for (y=1; y<h+1; y++) 
        {
    		feld[x][y] = 0;  // Spielfeld = 0 -> Wasser
    		gotoxy(x,y);
    		cout << "~"; // Wasser -> ~
    	}
    	
    }
    
    int main()
    {
    	bool ok = true;
    	while(ok)
    	{
    	cout << "Waehlen Sie eine Schwierigkeitsstufe aus:\n";
    	cout << "Einfach (1)\nMittel (2)\nSchwer (3)\n";
    	cin >> level;
    	ok = false;
    	eingabeloeschen(); // löscht (0,0) bis (80,0) und (0,7) bis (80,7) und kehrt auf (0,0) zurueck
    	switch (level) {
    	case 1:
    		b = 5;
    		h = 5;
    		break;
    	case 2:
    		b = 8;
    		h = 8;
    		break;
    	case 3:
    		b = 12;
    		h = 12;
    		break;
    	default:
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		eingabeloeschen();
    		ok = true;
    		break;
    	}
    
    	}
    	felderstellen();
    	
    	_getch();
    	return 0;
    }

    Gruss,

    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 6. Januar 2014 15:14
    Moderator
  • Es ist sehr fehleranfällig, die Variablen x und y einmal als global zu definieren und an anderer Stelle lokal in einer Funktion zu verwenden. 

    void gotoxy(int x,int y)
    {
    	HANDLE hConsole;
    	COORD cursorLoc;
    	std::cout.flush();
    	cursorLoc.X = x;
    	cursorLoc.Y = y;
    	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hConsole, cursorLoc);
    }

    In deinem Fall ist es zwar "unproblematisch" aber wenn du z.B. die Parameter "int x, int y" umbenennst, und vergisst, die Zuweisungen von cursorLoc.X bzw. cursorLoc.Y zu aktualisieren, lässt sich das Programm kompilieren und rechnet mit falschen Werten.

    Dienstag, 11. März 2014 16:51