Variable ändert sich



  • Hallo zusammen

    Ich bin neu hier, da ich mich für einen C++ Kurs angemeldet habe, möchte ich mich nun ein bisschen vorbereiten und bin daran ein Snake in C++ zu schreiben.
    Leider habe ich das Problem, dass eine Variable irgendwoher geändert wird, aber ich finde nicht heraus wieso dies passiert.
    Gibt es in Visual Studio 2008 eine möglichkeit einen Wert einer Variable zu überwachen und das Programm anzuhalten, sobald dies passiert ist?

    Es geht um die Variable PassCount vielleicht sieht ja irgendwer das Problem gleich.

    // Snake_2009-12-09.cpp : Definiert den Einstiegspunkt f r die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include "windows.h"
    #include <conio.h>
    
    using namespace std;
    
    int arrSpielfeld[80][24];
    int arrOldSpielfeld[80][24];
    //Breite	80 Spalten 0-79
    //Hoehe		25 Zeilen 0-24
    
    //Position der Schlange //maximale Länge = 50
    int PosSnakeX[50];
    int PosSnakeY[50];
    //Richtung der Schlange --> Siehe Tasten
    int SnakeDirection = 75;
    //Anzahl Durchläufe
    int PassCount = 0;
    //Fehlercode 0 = OK / 1 = in Wand gefahren oder in die schlange selbst
    int ErrorCode = 0;
    //Spielgeschwindigkeit
    int GameSpeed = 1;
    
    //Drckbare Tasten als Konstanten definieren.
    #define KEY_UP 72
    #define KEY_DOWN 80
    #define KEY_LEFT 75
    #define KEY_RIGHT 77
    #define KEY_Q 113
    #define KEY_P 112
    
    //Wert 0 = Leeres Feld
    //Wert 1 = Kopf der Schlange
    //Wert 2 = Nachfolgende Segmente der Schlange
    //Wert 50 = Frucht
    //Wert 90 = Rand
    
    void PrintAtPosition(const char *c, int x, int y)
    {
    	COORD Koordinaten;
    	Koordinaten.X=x; //koordinaten x
    	Koordinaten.Y=y; //koordinaten y
    	//jetz position setzen
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Koordinaten );
    	cout << c;
    }
    
    void SyncField()
    {
    	for (int i = 0; i < 80; i++)
    	{
    		for (int ii = 0; ii < 25; ii++)
    		{
    		arrOldSpielfeld[i][ii] = arrSpielfeld[i][ii];
    		}
    
    }
    }
    
    void DrawField()
    {
    
    	char chr[] = " ";
    
    	for (int i = 0; i < 80; i++)
    	{
    		for (int ii = 0; ii < 25; ii++)
    		{
    			if (arrSpielfeld[i][ii] != arrOldSpielfeld[i][ii]){
    
    				if (arrSpielfeld[i][ii] == 0){
    						chr[0] = ' ';
    					}
    				if (arrSpielfeld[i][ii] == 1){
    						chr[0] = 'Û';
    					}
    				if (arrSpielfeld[i][ii] == 2){
    						chr[0] = '²';
    					}
    				if (arrSpielfeld[i][ii] == 50){
    						chr[0] = '@';
    					}
    				if (arrSpielfeld[i][ii] == 90){
    						chr[0] = 'Û';
    					}
    			PrintAtPosition(&chr[0], i, ii);
    			}
    
    		}
    
    	}
    
    }
    
    void InitFieldAndSnake()
    {
    
    	//Ganzes Feld leeren
    	char chr[] = " ";
    
    	for (int i = 0; i < 80; i++)
    	{
    		for (int ii = 0; ii < 25; ii++)
    		{
    			arrSpielfeld[i][ii] = 0;
    		}
    	}
    	//Oberer Balken
    	for (int i = 0; i < 80; i++)
    		{
    			arrSpielfeld[i][0] = 90;
    		}
    
    	//Unterer Balken
    	for (int i = 0; i < 80; i++)
    		{
    			arrSpielfeld[i][24] = 90;
    		}
    
    	//Linker Balken
    	for (int ii = 0; ii < 25; ii++)
    		{
    			arrSpielfeld[0][ii] = 90;
    		}
    
    	//Rechter Balken
    	for (int ii = 0; ii < 25; ii++)
    		{
    			arrSpielfeld[79][ii] = 90;
    		}
    
    	//Schlange initialisieren l„nge auf Zwei festsetzen
    	PosSnakeX[0] = 40;
    	PosSnakeY[0] = 10;
    	for (int i = 1; i <  sizeof(PosSnakeX) / sizeof(PosSnakeX[0]) ; i++)
    	{
    		PosSnakeX[i] = 0; 
    		PosSnakeY[i] = 0;
    	}
    	//Schlange im Spielfeld einsetzen
    	arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] = 1;
    
    }
    void Move_Up()
    	{
    
    		for (int i = 0; i > sizeof(PosSnakeY) / sizeof(PosSnakeY[0]); i++ )
    			{
    			PosSnakeY[i+1] = PosSnakeY[i];
    			}
    		--PosSnakeY[0];
    		SyncField();
    		if (arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] == 0)
    			{
    				arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] = 1;
    			}
    		else
    			{
    				ErrorCode = 1;
    			}
    		DrawField();
    		SnakeDirection = KEY_UP;
    	}
    void Move_Down()
    	{
    		for (int i = 0; i > sizeof(PosSnakeY) / sizeof(PosSnakeY[0]); i++ )
    			{
    			PosSnakeY[i+1] = PosSnakeY[i];
    			}
    		++PosSnakeY[0];
    		SyncField();
    		if (arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] == 0)
    			{
    			arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] = 1;
    			}
    		else
    		{
    			ErrorCode = 1;
    		}
    		DrawField();
    		SnakeDirection = KEY_DOWN;
    	}
    void Move_Left()
    	{
    		for (int i = 0; i > sizeof(PosSnakeX) / sizeof(PosSnakeX[0]); i++ )
    			{
    			PosSnakeX[i+1] = PosSnakeX[i];
    			}
    		--PosSnakeX[0];
    		SyncField();
    		if (arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] == 0)
    			{
    				arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] = 1;
    			}
    		else
    			{
    				ErrorCode = 1;
    			}
    		DrawField();
    		SnakeDirection = KEY_LEFT;
    	}
    void Move_Right()
    	{
    		for (int i = 0; i > sizeof(PosSnakeX) / sizeof(PosSnakeX[0]); i++ )
    			{
    			PosSnakeX[i+1] = PosSnakeX[i];
    			}
    		++PosSnakeX[0];
    		SyncField();
    		if (arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] == 0)
    			{
    				arrSpielfeld[PosSnakeX[0]][PosSnakeY[0]] = 1;
    			}
    		else
    			{
    				ErrorCode = 1;	
    			}
    		DrawField();
    		SnakeDirection = KEY_RIGHT;
    		}	
    //Main
    int _tmain(int argc, _TCHAR* argv[])
    {
    	PassCount = 0;
    	//_setcursortype(_NOCURSOR);
    	//Array bef llen
    	for (int i = 0; i < 80; i++)
    	{
    		for (int ii = 0; ii < 25; ii++)
    		{
    		arrSpielfeld[i][ii] = 1;
    		}
    	}
    	//Array old mit anderen Werten bef llen
    	for (int i = 0; i < 80; i++)
    	{
    		for (int ii = 0; ii < 25; ii++)
    		{
    		arrOldSpielfeld[i][ii] = arrSpielfeld[i][ii]+1;
    		}
    	}
    
    	char chrArr[] = "1";
    	PrintAtPosition(chrArr , 12, 10);
    
    	InitFieldAndSnake();
    
    	DrawField();
    	int i1 = 0;
    	while(ErrorCode == 0)
    	{
    
    		PassCount++;
    		switch(PassCount)
    		{
    		case 10:
    			GameSpeed++;
    			break;
    		case 20:
    			GameSpeed++;
    			break;
    		case 30:
    			GameSpeed++;
    			break;
    		case 40:
    			GameSpeed++;
    			break;
    		case 50:
    			GameSpeed++;
    			break;
    		   }
    
    		/*
    		PassCount++;
    		if (PassCount == 10) 
    			{
    				GameSpeed++;
    			}
    		*/
    		if (_kbhit())
    			{
    				i1 = _getch();
    				if (i1 != 224)
    					{
    
    						if (i1 == KEY_UP){
    						//cout << "KEY_UP" << endl;
    						Move_Up();
    						}
    						if (i1 == KEY_RIGHT){
    						Move_Right();
    						}
    						if (i1 == KEY_LEFT){
    						Move_Left();
    						}
    						if (i1 == KEY_DOWN){
    						Move_Down();
    						}
    						if (i1 == KEY_Q){
    						cout << "KEY_Q" << endl;
    						}
    						if (i1 == KEY_P){
    						cout << "KEY_P" << endl;
    						}
    						Sleep( 1000/GameSpeed );
    
    					}
    
    				continue;
    			}
    		else
    		{
    
    						if (SnakeDirection == KEY_UP){
    						//cout << "KEY_UP" << endl;
    						Move_Up();
    						}
    						if (SnakeDirection == KEY_RIGHT){
    						Move_Right();
    						}
    						if (SnakeDirection == KEY_LEFT){
    						Move_Left();
    						}
    						if (SnakeDirection == KEY_DOWN){
    						Move_Down();
    						}
    						Sleep( 1000/GameSpeed );
    		}
    		//gewisse Zeit Warten
    
    	}
    
    		//PrintAtPosition(chrArr , 12, 10);
    	string Ausgabe = "Ups, das ging wohl zu schnell";
    
    	COORD Koordinaten;
    	Koordinaten.X=10; //koordinaten x
    	Koordinaten.Y=12; //koordinaten y
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Koordinaten );
    	cout << Ausgabe;
    	system("PAUSE > NUL");
    
    	return 0;
    }
    

    Gruss Pardalis



  • Debugger(F5) + Breakpoint(F9) auf die Stelle setzen wo du den RAM-Wert der Variable haben möchtest,



  • Hallo

    Danke für die Antwort, dies ist mir schon klar, aber gibt es keine Möglichkeit einen Wert einer Variable zu überwachen und bei einer Änderung zu stoppen?
    Es geht mir darum die Variable PassCount zu überwachen, leider hat diese auf einmal den Wert 90 und nicht mehr 1 wie die Variable ursprünglich gesetzt wurde.

    Gruss Pardalis



  • if(PassCount != 1) std::cout<< "|Funktions- oder Blockname]" <<std::endl;



  • for (int i = 0; i < 80; i++)
        {
            for (int ii = 0; ii < 25; ii++)
            {
                arrSpielfeld[i][ii] = 0;
            }
        }
    

    Und wie gross war arrSpielfeld doch gleich?

    Und verwende nicht so viele globale Variablen! Gerade diese sorgen dafür, dass Änderungen und Zugriffe von überall her erfolgen können und nur sehr schwer nachvollziehbar sind. Arbeite lieber mehr mit Funktionsparametern, dann kannst du Fehler lokal halten.



  • Besten Dank, werde mir das mit den Variablen zu Herzen nehmen 🙂
    Nun funktionierts



  • Besten Dank, werde mir das mit den Variablen zu Herzen nehmen 🙂
    Nun funktionierts


Anmelden zum Antworten