Pacman problem



  • Hi,

    weiß zwar nicht ob das hier reinpasst, aber ich hab mal ein kleines Spiel programmiert -> "pacman". Bei dem Spiel geht es darum "" einzusammeln und es gibt Wände wo man nicht durchgehen kann -> "X". Mein Prob. ist ich bin in C++ noch ein Anfänger und verstehe nicht warum er manchmal die Schleife, die beendet werden soll wenn alle "" weg sind schon vorher verlässt!??

    Hier der Code (Das mit der funkt. level1() ändere ich nochmal is nur zum testen):

    #include <windows.h>
    #include <iostream>
    #include <cstdlib>
    #include <conio.h>
    #include <time.h>
    
    using namespace std;
    
    void cursor(int x, int y);
    void draw_x(int x, int y);
    void draw_(int x, int y);
    void level1();
    void pacman(int cor[][7]);
    void drawpac(int x, int y, int taste);
    
    int main()
    {
    	int input;
    
    	SetConsoleTitle("Pacman");
    	level1();
    
    	cursor(0,11);
    	cout<<"Um das Spiel nochmal zu starten ENTER druecken!(Esc)"<<endl;
    
    	do
    	{
    		input = getch();
    		switch(input)
    		{
    			case 13:
    				system("cls");
    				level1();
    				break;
    			case 27:
    				break;
    		}
    	}while(input!=27);
    
    	return 0;
    }
    
    void level1()
    {
    	int cor[7][7]; //Felder für Level1
    
    	cor[0][0]=1;
    	cor[0][1]=1;
    	cor[0][2]=1;
    	cor[0][3]=1;
    	cor[0][4]=1;
    	cor[0][5]=1;
    	cor[0][6]=1;
    
    	cor[6][0]=1;
    	cor[6][1]=1;
    	cor[6][2]=1;
    	cor[6][3]=1;
    	cor[6][4]=1;
    	cor[6][5]=1;
    	cor[6][6]=1;
    
    	cor[0][0]=1;
    	cor[1][0]=1;
    	cor[2][0]=1;
    	cor[3][0]=1;
    	cor[4][0]=1;
    	cor[5][0]=1;
    	cor[6][0]=1;
    
    	cor[0][6]=1;
    	cor[1][6]=1;
    	cor[2][6]=1;
    	cor[3][6]=1;
    	cor[4][6]=1;
    	cor[5][6]=1;
    	cor[6][6]=1;
    
    	cor[2][1]=1;
    	cor[2][2]=1;
    	cor[2][3]=1;
    	cor[2][4]=1;
    
    	cor[3][2]=1;
    
    	cor[4][0]=1;
    	cor[4][2]=1;
    	cor[4][4]=1;
    
    	for(int x=0;x<=6;x++) //Level1 zeichnen
    	{
    		int y=0;
    		for(y;y<=6;y++)
    		{
    			if(cor[x][y]==1)
    			{
    				draw_x(x,y);
    			}
    			else
    			{
    				cor[x][y]=0;
    				draw_(x,y);	
    			}
    		}
    	}
    	pacman(cor);
    }
    
    void pacman(int cor[][7])
    {
    	int input;
    	int i;
    	int x, y;
    	enum key {UP = 72, DOWN = 80, LEFT = 75, RIGHT = 77, ENTER = 13};
    
    	int zeit = clock();
    
    	i=17;		//Anzahl der " * "
    	x=3; y=5;	//Startposition
    	cursor(x,y);	
    	cout<<"O";
    
    	do
    	{
    		cursor(x,y);
    
    		input = getch();		//Zeichen einlesen
    
    		if(input == 224)		//Sondertasten (224)
    		{
    			input = getch();	//Zeichencode holen
    
    			switch(input)
    			{
    				case UP:			//Pfeiltaste -> hoch(72)
    					if(cor[x][y-1]==2)
    					{
    						drawpac(x, y, 1);
    						y--;
    					}
    					else if(cor[x][y-1]==0)
    					{
    						i--;
    						cor[x][y]=2;
    						drawpac(x, y, 1);
    						y--;
    
    					}
    					break;
    				case DOWN:			//Pfeiltaste -> runter(80)
    					if(cor[x][y+1]==2)
    					{
    						drawpac(x, y, 2);
    						y++;
    					}
    					else if(cor[x][y+1]==0)
    					{
    						i--;
    						cor[x][y]=2;
    						drawpac(x, y, 2);
    						y++;
    
    					}
    					break;
    				case LEFT:			//Pfeiltaste -> links(75)
    					if(cor[x-1][y]==2)
    					{
    						drawpac(x, y, 3);
    						x--;
    					}
    					else if(cor[x-1][y]==0)
    					{
    						i--;
    						cor[x][y]=2;
    						drawpac(x, y, 3);
    						x--;
    
    					}
    					break;
    				case RIGHT:			//Pfeiltaste -> rechts(77)
    					if(cor[x+1][y]==2)
    					{
    						drawpac(x, y, 4);
    						x++;
    					}
    					else if(cor[x+1][y]==0)
    					{
    						i--;
    						cor[x][y]=2;
    						drawpac(x, y, 4);
    						x++;
    
    					}
    					break;
    			}
    		}
    	}while(i>0);
    
    	int ezeit=clock();
    	ezeit = ezeit - zeit;
    	cursor(0,10);
    	cout<<"Du hast "<<((ezeit/1000))<<" (sek) gebraucht!!"<<endl;
    }
    
    void drawpac(int x, int y, int taste)
    {
    	cout<<" ";
    	if(taste==4)
    	{
    		x++;
    	}
    	else if(taste==3)
    	{
    		x--;
    	}
    	else if(taste==2)
    	{
    		y++;
    	}
    	else if(taste==1)
    	{
    		y--;
    	}
    	cursor(x,y);
    	cout<<"O";
    }
    
    void draw_x(int x, int y)
    {
    	cursor(x,y);
    	cout<<"X";
    }
    
    void draw_(int x, int y)
    {
    	cursor(x,y);
    	cout<<"*";
    }
    
    void cursor(int x, int y)
    {
    	HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
    	COORD coordScreen = { x, y }; 
    	SetConsoleCursorPosition(hConsole, coordScreen);
    }
    

    Kritisiert ruhig und sagt mir woran das liegen könnte, DANKE! 😃

    GRuß
    pepper



  • Hi,

    zuersteinmal solltest du deinen Code aufräumen.
    Was soll das denn z.B. hier sein:

    for(int f=0; f<10000000;f++) 
            { 
            }
    

    ?

    Um so übersichtlicher der Code ist, desto schneller findet man auch Fehler.
    Ich überblicke das hier z.B. nicht genau, aber kann es sein,
    dass du i immer erniedrigst, wenn der Pac auf einem leeren Feld

    if(cor[x][y-1]==0)
    

    steht?

    Außerdem würde ich an deiner Stelle erst prüfen, ob da eine Wand kommt, und nicht den Pac im Nachhinein wieder zurücksetzen.



  • hi,

    das mit der for-Schleife war nur als pasue gedacht, weil ich etwas ausprobieren wollte, hatte nur vergessen sie wegzumachen.
    Außerdem wird überprüft ob da eine Wand kommt oder nicht... alle Wände ergeben ->
    cor[x][y]=1 -> also wenn der pacman jetzt auf feld 5 5 steht und ich drücke nach oben wird bei der überprüfung einfach cor[5][4] ? gemacht, der pacman geht ja nicht in diese richtung erst wenn die if abfrage ==0 oder ==2 erfüllt ist dann geht der pacman weiter. Die 2 hab ich für bereits eingesammelte "*" gemacht. um das mit i--; zu zählen.
    Hoffe es wird so klarer.

    gruß
    pepper



  • Pepper schrieb:

    Mein Prob. ist ich bin in C++ noch ein Anfänger und verstehe nicht warum er manchmal die Schleife, die beendet werden soll wenn alle "*" weg sind schon vorher verlässt!??

    Hallo, das passiert meist dann, wenn die Abbruchbedingung erfüllt ist!

    Bye, TGGC (Keine Macht den Dummen)



  • Danke, aber solche Antworten bringen mich nicht weiter, das das so ist weiß ich selber!! Diesen Post hättest du dir ruhig sparen können!!!

    Mfg
    PEpper



  • Hab ich doch gern gemacht! Konnt ja nicht ahnen, das du das schon wusstest. Problem ist damit ja geklärt. Wunderbar!

    Bye, TGGC (Keine Macht den Dummen)



  • 😃



  • ich hab dein spiel mal bei mir mit visual müllhaufen compiliert und es funzt einwandfrei!

    und was die qualität deines codes angeht da hab ich schon schlimmeres gesehen 😃



  • Bei mir läufts auch wunderbar. Keine Probleme gefunden!



  • Bei mir läufts auch wunderbar.



  • Zuviel des Lobes.

    Bye, TGGC (Wähle deine Helden)


Anmelden zum Antworten