(Gelöst) Zahl soll in Schleife von 2 zu 0 nach Tastendruck werden...



  • Edit: Problem gelöst.

    Hi,

    bin Anfänger in C++ und wollte ein bisschen coden lernen und komm jetzt nicht weiter. Das Problem ist, dass ich die Zahl 2, die als einzigstes ausgegeben wird, nach Drücken der Taste "w" bzw. "s" zu 0 werden soll und die obere oder untere Zahl davon zu einer 2 werden soll. Leider bleibt die frühere 2 noch stehen. Und die soll zu einer 0 umgewandelt werden, was nicht gelingt.

    Hier mal ein Ausschnitt des Quellcodes:

    #include <iostream>
    #include <windows.h>
    #include <cstdlib>
    using namespace std;
    
    enum
    {
    HEIGHT = 10,
    WIDTH = 20
    };
    
    int gameboard[100][100];
    int substraction(0);
    int addition(0);
    
    void game_board(int x, int y);
    void making_board(int x, int y);
    void making_new_board(int x, int y);
    
    int main()
    {
    	game_board(HEIGHT, WIDTH);
    	making_board(HEIGHT, WIDTH);
    
    	return 0;
    }
    
    // Interne Berechnung der Spielfeldgröße
    
    void game_board(int x, int y)
    {
    	for (int i = 0; i < x; i++)
    	{
    		for (int j = 0; j < y; j++)
    		{
    
    			if ((i != 0) && (j != 0))
    			{
    				gameboard[i][j] = 0;
    			}
    			else
    			{
    				gameboard[i][j] = 1;
    			}
    
    			if ((i == (x - 1)) || (j == (y - 1)))
    			{
    				gameboard[i][j] = 1;
    			}
    
    		}
    	}
    }
    
    // Erstellen des Spielfeldes auf der Konsole
    
    void making_board(int x, int y)
    {
    	for (int i = 0; i < x; i++)
    	{
    		for (int j = 0; j < y; j++)
    		{
    			if ((i == (4 - addition)) && (j == (3 - substraction)))
    			{
    				gameboard[i][j] = gameboard[i][j] = 2;
    				cout << gameboard[i][j];
    				continue;
    			}
    			cout << gameboard[i][j];
    		}
    		cout << "\n";
    	}
    	making_new_board(HEIGHT, WIDTH);
    }
    
    // Neuberechnung des Spielfeldes
    
    void making_new_board(int x, int y)
    {
    	char tastatur;
    	cin >> tastatur;
    
    	if (tastatur != 'y')
    	{
    		for (int i = 0; i < x; i++)
    		{
    			for (int j = 0; j < y; j++)
    			{
    				if ((i == (4 - addition)) && (j == (3 - substraction)))
    				{
    
    					if (tastatur == 'w')
    					{
    						addition++;
    						gameboard[i][j] = 0;
    						making_board(HEIGHT, WIDTH);
    					}
    					if (tastatur == 's')
    					{
    						addition--;
    						gameboard[i][j] = 0;
    						making_board(HEIGHT, WIDTH);
    					}
    					if (tastatur == 'a')
    					{
    						substraction++;
    						gameboard[i][j] = 0;
    						making_board(HEIGHT, WIDTH);
    					}
    					if (tastatur == 'd')
    					{
    						substraction--;
    						gameboard[i][j] = 0;
    						making_board(HEIGHT, WIDTH);
    					}
    				}
    			}
    		}
    	}
    }
    


  • der code sieht für mich eher nach C als C++ aus^^

    #define HEIGHT        10
    #define WEIGHT        20
    

    hat extrem viele nachteile, nimm stattdessen

    enum {
     HEIGHT = 10,
     WEIGHT = 20
    };
    
    //oder
    
    const std::size_t HEIGHT = 10;
    const std::size_t WEIGHT = 20;
    

    Benutzung bleibt wie gehabt...

    btw:
    WEIGHT-Übersetzungen

    meintest du evtl WIDTH?!

    zu den Fkt an sich:
    Wieso ruft making_board making_new_board auf?
    Wieso muss man beide nacheinander aufrufen?

    zu globalen Variablen:
    Das Array Global zu machen, ist vll gerade noch so ok - aber addition und erst recht tastatur ist... bäh xP

    bb



  • Wenn ich es richtig mit Google Suche gelesen habe, ist enum sicherer als define, und deshalb sollte ich es lieber so schreiben, oder?

    unskilled schrieb:

    meintest du evtl WIDTH?!

    Klar meinte ich WIDTH und nicht WEIGHT, aber das war mir auch jetzt nicht so wichtig, genauso wie addition, etc. Da gibt es bestimmt bessere variablennamen... 🙄

    unskilled schrieb:

    zu den Fkt an sich:
    Wieso ruft making_board making_new_board auf?
    Wieso muss man beide nacheinander aufrufen?

    Ja, das ist ein Fehler von mir. Am Anfang brauchte ich es noch, um den Code auszuführen und hab es nicht bemerkt und dann einfach stehen gelassen.

    unskilled schrieb:

    zu globalen Variablen:
    Das Array Global zu machen, ist vll gerade noch so ok - aber addition und erst recht tastatur ist... bäh xP

    das mit tastatur kann ich ins making_new_board machen, aber wenn ich addition lokal in eine Funktion schreibe, funktioniert es nicht, in der anderen funktion.
    Und wieso ist es schlimm, wenn ich es global deklariere? Welche Nachteile entstehen dadurch?

    // Edit: Hab mal den Code verbessert...



  • Shen schrieb:

    Wenn ich es richtig mit Google Suche gelesen habe, ist enum sicherer als define, und deshalb sollte ich es lieber so schreiben, oder?

    Jopp - define ist eben einfach eine (stumpfe) Ersetzung, die der Präprozessor durchführt. Für so etwas nimmt man Konstanten. Mit enum kann man sich sparen, den richtigen Typen hinzuschreiben, weil automatisch ein passender genommen wird...

    Shen schrieb:

    unskilled schrieb:

    zu globalen Variablen:
    Das Array Global zu machen, ist vll gerade noch so ok - aber addition und erst recht tastatur ist... bäh xP

    das mit tastatur kann ich ins making_new_board machen, aber wenn ich addition lokal in eine Funktion schreibe, funktioniert es nicht, in der anderen funktion.
    Und wieso ist es schlimm, wenn ich es global deklariere? Welche Nachteile entstehen dadurch?

    Man versteckt sie besser mit static in den Funktionen, wo sie gebraucht werden - sonst wird es sehr schnell sehr unübersichtlich und vor allem hast du keinerlei Kapselung - jeder, der deine Fkt. später mal verwendet, kann deine Variablen nach Lust und Laune verändern...

    Die "richtigen" Code-Tags sind übrigens in dem Fall die "C/C++" und nichts mit CLI^^

    Ich hab mich mal versucht:

    #include <iostream>
    #include <windows.h> //brauchst du btw nicht...
    #include <cstdlib> //brauchst du btw nicht...
    using namespace std;
    
    enum
    {
    	HEIGHT = 10,
    	WIDTH = 20
    };
    
    int gameboard[HEIGHT][WIDTH];
    
    void set_game_board_values(int x, int y);
    void making_board(int x, int y);
    
    int main()
    {
        set_game_board_values(HEIGHT, WIDTH);
        making_board(HEIGHT, WIDTH);
    }
    
    // Interne Berechnung der Spielfeldgröße
    void set_game_board_values(int x, int y)
    {	//sieht nen bissl umständlich aus, was du hier machst - vll sagst du mal, was du bezwecken willst - geht bestimmt einfacher!?
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                if ((i != 0) && (j != 0))
                    gameboard[i][j] = 0;
                else
                    gameboard[i][j] = 1;
    
                if ((i == (x - 1)) || (j == (y - 1)))
                {
                    gameboard[i][j] = 1;
                }
    
            }
        }
    }
    
    // Neuberechnung des Spielfeldes
    void making_new_board(int x, int y, int addition, int substraction)
    {
        char tastatur;
        cin >> tastatur;
    
        if (tastatur == 'y')
    		return; //funktion verlassen
    
    	for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                if ((i == (4 - addition)) && (j == (3 - substraction)))
                {
    				switch(tastatur)
    				{
    				case 'w':
    				case 'W':
                        addition++;
                        gameboard[i][j] = 0;
                        making_board(HEIGHT, WIDTH);
    					break;
    
    				case 's':
    				case 'S':
                        addition--;
                        gameboard[i][j] = 0;
                        making_board(HEIGHT, WIDTH);
    					break;
    
    				case 'a':
    				case 'A':
                        substraction++;
                        gameboard[i][j] = 0;
                        making_board(HEIGHT, WIDTH);
    					break;
    
    				case 'd':
    				case 'D':
                        substraction--;
                        gameboard[i][j] = 0;
                        making_board(HEIGHT, WIDTH);
    					break;
    				}
                }
            }
        }
    }
    
    // Erstellen des Spielfeldes auf der Konsole
    void making_board(int x, int y)
    {
    	static int addition = 0;
    	static int substraction = 0;
    
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                if ((i == (4 - addition)) && (j == (3 - substraction)))
                {
                    gameboard[i][j] = gameboard[i][j] = 2;	//???
    //                cout << gameboard[i][j];
    //                continue;
                }
                cout << gameboard[i][j];
            }
            cout << "\n";
        }
        making_new_board(HEIGHT, WIDTH, addition, substraction); //versteh ich noch immer nicht.. du malst das board und direkt danach willst du es neu erstellen?!
    }
    

    allerdings verstehe ich bei vielen Dingen in deinem Quelltext den Sinn nicht...

    Wie man schon sieht, könnte man auch das Array noch in der Main-Fkt erstellen und immer mit übergeben - globale Variablen sind also mal wieder absolut unnötig...

    bb


Log in to reply