Schiffe versenken



  • Hallo Leute,

    Ich versuche gerade ein Spiel zu entwickeln, wie Ihr es vom Betreff entnehmen könnt, handelt es sich um das Spiel Schiffe versenken! Aber leider tauchen da einige Fehler auf die ich selber nicht beseitigen konnte. Kurz zum Programm: Habe 2 Klassen eingebaut (Spieler und Spielfeld)! Vielleicht könnt ihr mir helfen!

    Hier ist der Code zu der Klasse Spielfeld, wo im Prinzip nur gezeichnet und die schiffe gesetzt werden!

    #include <iostream>
    #include <time.h>
    
    #define breite 5
    #define hoehe 5
    
    using namespace std;
    
    class Spielfeld{
    
    	public: 
    		bool besetzt[breite][hoehe];
    		bool feld_offen[breite][hoehe];
    
    		void Spielfeld_leeren()
    		{
    			besetzt[breite][hoehe] = false;
    			feld_offen[breite][hoehe] = false;
    		}
    
    		void Spielfeld_anzeigen()
    		{
    
    			cout << "Das Spielfeld:\n ";
    			cout << " 1  2  3  4  5";
    
    			for(int y = 0; y < hoehe; y++)
    			{
    				cout << "\n" << y+1 << " ";
    
    				for(int x = 0; x < breite; x++)
    				{
    
    					if(besetzt[x][y] == false)
    					{
    						if(feld_offen[x][y] == true) cout << "[-]";
    						else if(feld_offen[x][y] == false) cout << "[ ]";
    					}
    
    					else if(besetzt[x][y] == true)
    					{
    						if(feld_offen[x][y] == true) cout << "[X]";
    						else if(feld_offen[x][y] == false) cout << "[ ]";
    					}	
    				}								
    			}
    		}
    
    		void Spielfeld_besetzen()
    		{
    			for(int i = 0; i < 5; i++)
    			{
    				int x, y;
    				srand(time(NULL));
    				x = (rand() % 5);
    				y = (rand() % 5);	
    
    				if(besetzt[x][y] == false) besetzt[x][y] = true;
    				else if(besetzt[x][y] == true) i--;
    			}
    		}	
    };
    

    Hier ist die Klasse für den Spieler:

    #include <iostream>
    #include "Spielfeld.h"
    
    using namespace std;
    
    Spielfeld _spielfeld;
    
    class Spieler{
    
    	public: 
    		int zahler;
    		void Schiff_schiessen()
    		{
    			int xs, ys;
    
    			cout << "Feld absuchen(x): ";
    			cin >> xs;
    
    			cout << "\nFeld absuchen(y): ";
    			cin >> ys;
    
    			if(_spielfeld.besetzt[xs][ys] == true) 
    			{
    				_spielfeld.feld_offen[xs][ys] = true;
    				zahler++;
    			}
    
    			else if(_spielfeld.besetzt[xs][ys] == false)
    			{
    				_spielfeld.feld_offen[xs][ys] = true;		
    			}
    
    		}
    
    		void Spieler_Hilfe()
    		{
    			cout << "Schiff getroffen:  [X]" << endl;
    			cout << "Feld abgesucht aber nicht getroffen: [-]" << endl;
    			cout << "Noch nicht abgesucht: [ ]" << endl;
    		}
    };
    

    Und hier ist das Main-Programm:

    #include <iostream>
    #include <conio.h>
    #include "Spielfeld.h"
    #include "Spieler.h"
    
    using namespace std;
    
    Spielfeld _spielfeld;
    Spieler _spieler;
    
    int main()
    {
    
    	_spielfeld.Spielfeld_leeren();
    	_spielfeld.Spielfeld_anzeigen();
    	_spielfeld.Spielfeld_besetzen();
    
    	_spieler.zahler = 0;
    
    	do
    	{
    		_spieler.Schiff_schiessen();
    
    	}while(_spieler.zahler!=5);
    
    	cout << "!!!!!!Yippi yeah!!!!!!" << endl;
    	getch();
    	return 0;
    }
    

    Hier sind die Fehler:

    Warnung 1 warning C4244: 'Argument': Konvertierung von 'time_t' in 'unsigned int', möglicher Datenverlust c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spielfeld.h 57 1 Sschiffe_versenken_own
    Fehler 2 error C2011: 'Spielfeld': 'class' Typneudefinition c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spielfeld.h 11 1 Sschiffe_versenken_own
    Fehler 3 error C2079: '_spielfeld' verwendet undefiniertes class 'Spielfeld' c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spieler.h 6 1 Sschiffe_versenken_own
    Fehler 4 error C2228: Links von ".besetzt" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spieler.h 22 1 Sschiffe_versenken_own
    Fehler 5 error C2228: Links von ".feld_offen" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spieler.h 24 1 Sschiffe_versenken_own
    Fehler 6 error C2228: Links von ".besetzt" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spieler.h 28 1 Sschiffe_versenken_own
    Fehler 7 error C2228: Links von ".feld_offen" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\spieler.h 30 1 Sschiffe_versenken_own
    Fehler 8 error C2079: '_spielfeld' verwendet undefiniertes class 'Spielfeld' c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\schiffe_versenken_own.cpp 7 1 Sschiffe_versenken_own
    Fehler 9 error C2086: 'int _spielfeld': Neudefinition c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\schiffe_versenken_own.cpp 7 1 Sschiffe_versenken_own
    Fehler 10 error C2228: Links von ".Spielfeld_leeren" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\schiffe_versenken_own.cpp 13 1 Sschiffe_versenken_own
    Fehler 11 error C2228: Links von ".Spielfeld_anzeigen" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\schiffe_versenken_own.cpp 14 1 Sschiffe_versenken_own
    Fehler 12 error C2228: Links von ".Spielfeld_besetzen" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\sschiffe_versenken_own\sschiffe_versenken_own\schiffe_versenken_own.cpp 15 1 Sschiffe_versenken_own

    Danke für die Hilfe!



  • Was mir do beim drüberschauen auffällt sind sie variablen-Namen _spielfeld und _spieler, sowas sollte man in C/C++ vermeiden da diese Unterstrich Form für den Compiler reserviert sind und dadurch alleine schon undefiniertes Verhalten hervorbringen können.

    Dann noch

    srand(time(NULL));
    

    muss nur einmal initialisiert werden und nicht in einer Schleife immerwieder. (spielfeld.h Zeile 57)



  • Danke für deine Antwort!

    Ich habe die Lösung schon gefunden:

    1. die Spielfeld Headerdatei war falsch belegt
    2. Weil ich die Klasse Spielfeld 2x deklariert habe (musste einfach eines mit extern deklarieren dann hat es prima geklappt)!

    Jetzt hab ich aber leider ein anderes Problem, nämlich das das Programm am Anfang langsam ist und ich wüsste gern warum dies so ist.



  • Videonauth schrieb:

    Was mir do beim drüberhscuen auffällt sind sie variablen-Namen _spielfeld und _spieler, sowas sollte man in C/C++ vermeiden da diese Unterstrich Form für den Compiler reserviert sind und dadurch alleine schon undefiniertes Verhalten hervorbringen können.

    Dann noch

    srand(time(NULL));
    

    muss nur einmal initialisiert werden und nicht in einer Schleife immerwieder. (spielfeld.h Zeile 57)

    ach danke deswegen ging das Problem auch langsamer!

    Jetzt läufts genau so wie ich es haben wollte!

    Vielen Dank!



  • Close



  • Videonauth schrieb:

    Was mir do beim drüberschauen auffällt sind sie variablen-Namen _spielfeld und _spieler, sowas sollte man in C/C++ vermeiden da diese Unterstrich Form für den Compiler reserviert sind und dadurch alleine schon undefiniertes Verhalten hervorbringen können.

    Solche Bezeichner sind in C++ üblich und nicht generell ein Problem. Man sollte höchstens schauen, dass man sowas nicht im globalen Scope verwendet.



  • Hallo wieder einmal 🙂

    Ich bin grad dabei mein Spiel zu erweitern, indem ich gegen den Computer spiele!

    Also habe ich 2 Klassen rein gebaut, eines für den Computer(Player2.h) und eines für den Spieler(Player.h) aber aus es tauchen einige fehler auf, die ich leider nicht beheben kann. Ich glaube, es hat irgendwas mit den Headerdateien zutun aber ich habe keinen blassen Schimmer wie ich die fehler beheben kann!

    Hier ist der Code für den Computer-SPieler(Player.h):

    #ifndef Player2_h
    #define Player2_h
    
    #include <iostream>
    #include <time.h>
    #include "Player.h"
    
    using namespace std;
    
    #define breite 7
    #define hoehe 7
    
    Player _player;
    
    class Player2{
    
    public:
    
    	bool besetzt[breite][hoehe];
    	bool open[breite][hoehe];	
    	int c_zahler;
    
    	void Computer_Init()
    	{
    		besetzt[breite][hoehe] = false;
    		open[breite][hoehe] = false;
    		c_zahler = 0;		
    	}
    
    	void Computer_Area()
    	{
    		cout << "\n\nGegner Spielfeld:\n\n";
    		cout << "  1  2  3  4  5  6  7\n"; 
    
    		for(int y = 0; y < hoehe; y++)
    		{
    			cout << "\n" << y+1 << " ";
    			for(int x = 0; x < breite; x++)
    			{
    				if(besetzt[x][y] == true) 
    				{
    					if(open[x][y] == true) 
    					{
    						cout << "[X]";
    						_player.p_zahler++;
    					}
    					else if(open[x][y] == false) cout << "[ ]"; 	
    				}
    				else if(besetzt[x][y] == false) 
    				{
    					if(open[x][y] == true) cout << "[-]";
    					else if(open[x][y] == false) cout << "[ ]";
    				}
    			}
    		}
    	}
    
    	void Computer_Area_Ships()
    	{
    		int xc, yc;
    		srand(time(NULL));
    
    		for(int i = 0; i < 5; i++)
    		{
    			xc = (rand() % 7);
    			yc = (rand() % 7);
    
    			if(besetzt[xc][yc] = false) besetzt[xc][yc] = true;
    			else if(besetzt[xc][yc] = true) i--;
    		}
    	}
    
    	void Computer_Shoot()
    	{
    		int xc, yc;
    		srand(time(NULL));
    
    		xc = (rand() % 7);
    		yc = (rand() % 7);
    
    		if(_player.besetzt[xc][yc] == true) _player.open[xc][yc] = true;	
    		else if(_player.besetzt[xc][yc] == false) _player.open[xc][yc] = true;			
    	}
    };
    
    #endif
    

    Hier ist der Code für den Spieler(Player.h):

    #ifndef Player_h
    #define Player_h
    
    #include <iostream>
    #include "Player2.h"
    
    #define breite 7
    #define hoehe 7
    
    using namespace std;
    
    Player2 _computer;
    
    class Player{
    
    public:
    	bool besetzt[breite][hoehe];
    	bool open[breite][hoehe];
    	int p_zahler;
    
    	void Player_Init()
    	{
    		besetzt[breite][hoehe] = false;
    		open[breite][hoehe] = false;
    		p_zahler = 0;		
    	}
    
    	void Draw_Player_Area()
    	{
    		cout << "Ihr Spielfeld:\n";
    		cout << "  1  2  3  4  5  6  7\n"; 
    
    		for(int y = 0; y < hoehe; y++)
    		{
    			cout << "\n" << y+1 << " ";
    			for(int x = 0; x < breite; x++)
    			{
    				if(besetzt[x][y] == true) 
    				{
    					if(open[x][y] == true)
    					{
    						cout << "[X]";
    						_computer.c_zahler++;
    					}
    					else if(open[x][y] == false) cout << "[S]";
    				}
    				else if(besetzt[x][y] == false)
    				{
    					if(open[x][y] == true) cout << "[-]";
    					else if(open[x][y] == false) cout << "[ ]";
    				}
    			}
    		}
    	}
    
    	void Draw_Player_Ships(int xp, int yp, int& i)
    	{
    		if(besetzt[xp][yp] == true) i--;
    		if(besetzt[xp][yp] == false) besetzt[xp][yp] = true;	
    	}
    
    	void Player_Shoot(int xs, int ys)
    	{
    		if(_computer.besetzt[xs][ys] == true) _computer.open[xs][ys] = true;
    		else if(_computer.besetzt[xs][ys] == false) _computer.open[xs][ys] = true;
    	}
    };
    
    #endif
    

    Und hier der Main-Code:

    #include <iostream>
    #include <conio.h>
    #include "Player2.h"
    #include "Player.h"
    
    using namespace std;
    
    Player2 _computer;
    Player _player;
    
    int main()
    {
    
    	cout << "***************Schiffe versenken!!!****************\n";
    	cout << "Besetzen Sie 5 Felder:\n";
    
    	_player.Player_Init();
    	_computer.Computer_Init();	
    
    	for(int i = 0; i < 5; i++)
    	{
    		int xp, yp;
    		cout << "Feld" << i+1 << "besetzen(x): ";
    		cin >> xp;
    		cout << "Feld" << i+1 << "besetzen(y): ";
    		cin >> yp;
    		if(xp > 5 || xp < 0 || yp > 5 || yp < 0) i--;
    		else _player.Draw_Player_Ships(xp,yp,i);		
    	}
    
    	_player.Draw_Player_Area();
    
    	_computer.Computer_Area();
    	_computer.Computer_Area_Ships();
    
    	do
    	{
    		int xs, ys;
    		cout << "Feld absuchen(x): ";
    		cin >> xs;
    		cout << "Feld absuchen(y): ";
    		cin >> ys;
    		_player.Player_Shoot(xs,ys);
    		_computer.Computer_Shoot();
    
    	}while(_player.p_zahler!=5 || _computer.c_zahler!=5);
    
    	cout << "\n\n*************Es funzt************";
    
    	getch();
    	return 0;
    }
    

    Hier die Fehlermeldungen:

    Fehler 1 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner '_computer' c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 12 1 perfect_game
    Fehler 2 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 12 1 perfect_game
    Fehler 3 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 12 1 perfect_game
    Fehler 4 error C2228: Links von ".c_zahler" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 43 1 perfect_game
    Fehler 5 error C2228: Links von ".besetzt" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 64 1 perfect_game
    Fehler 6 error C2228: Links von ".open" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 64 1 perfect_game
    Fehler 7 error C2228: Links von ".besetzt" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 65 1 perfect_game
    Fehler 8 error C2228: Links von ".open" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\player.h 65 1 perfect_game
    Fehler 11 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner '_computer' c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 8 1 perfect_game
    Fehler 12 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 8 1 perfect_game
    Fehler 13 error C2086: 'int Player2': Neudefinition c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 8 1 perfect_game
    Fehler 14 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 8 1 perfect_game
    Fehler 15 error C2086: 'int _computer': Neudefinition c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 8 1 perfect_game
    Fehler 16 error C2086: 'Player _player': Neudefinition c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 9 1 perfect_game
    Fehler 17 error C2228: Links von ".Computer_Init" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 19 1 perfect_game
    Fehler 18 error C2228: Links von ".Computer_Area" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 34 1 perfect_game
    Fehler 19 error C2228: Links von ".Computer_Area_Ships" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 35 1 perfect_game
    Fehler 20 error C2228: Links von ".Computer_Shoot" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 45 1 perfect_game
    Fehler 21 error C2228: Links von ".c_zahler" muss sich eine Klasse/Struktur/Union befinden. c:\users\mod\documents\visual studio 2010\projects\perfect_game\perfect_game\game.cpp 47 1 perfect_game

    Ich weiß, es ist umsändlich aber es wäre sehr nett wenn ihr mir helfen könnt!

    Mfg kemal



  • header-dateien, die sich gegenseitig inkludieren, ist aua. So richtig.

    Nutz Forward Declaration



  • zwutz schrieb:

    header-dateien, die sich gegenseitig inkludieren, ist aua. So richtig.

    Nutz Forward Declaration

    Weil ich ein Anfänger bin, weiß ich ehrlich gesagt nicht was du meinst.
    Könntest du es mir bitte erklären und eventuell mit einem beispiel?

    mfg



  • a.h inkludiert b.h und b.h inkludiert a.h.

    Die globalen Player und Player2 Objekte sorgen dann für das nächste Problem. Am besten direkt auf globale Variablen verzichten.


Anmelden zum Antworten