Array kommt irgentwo durcheinander.



  • MNowo schrieb:

    Meinst du mein gesamtes Programm ist falsch [...] ?

    Wie wär's wenn du's mal posten würdest?



  • Okay das wäre das sieht folgendermaßen aus:

    // main.cpp
    #include "field.h"
    
    int main()
    {
        C_field Field;
        Field.show_menu();
    }
    
    //field.h
    
    #include <string>
    #include <iostream>
    #include <vector>
    #include <stdio.h>
    #include "player.h"
    #define clearscreen cout<<"\033[2J\033[1;1H";
    
    using namespace std;
    
    class C_field
    {
    	private:
    	vector<C_player>players;
    	char position;
    	char menu_choice;
    	char ground_player;
    	char ground_enemy;
    	char system_player[10][10];
    	char system_enemy[10][10];
    
    	public:
    	C_field();
    	string get_users_name();
    	void show_menu();
    	void show_battlefield();
    	void refill_system(string unit);
    	void show_option_menu();
    	void show_battlebeginUI();
    	void show_battleUI();
    	void show_shipsetUI();
    
    };
    
    //field.cpp
    
    #include "field.h"
    
    C_field::C_field()
    {
    	C_player enemy("Enemy");
    	players.push_back(enemy);
    	C_player player(get_users_name());
    	players.push_back(player);
    
    	ground_player = '.';
    	ground_enemy = '.';
    
    	for (int y = 10; y != -1; y--)
    	{
    		for (int x = 0; x != 11; x++)
    		{
    			system_player[x][y] = ground_player;
    			system_enemy[x][y] = ground_enemy;
    		}
    	}
    
    }
    
    string C_field::get_users_name()
    {
    	string user_name;
    	cout<<"Bitte Namen eingeben: ";
    	cin>>user_name;
    	return(user_name);
    }
    
    void C_field::show_menu()
    {
    	bool run = true;
    
    	while(run)
    	{
    
    		clearscreen;
    
    		cout<<"B + Enter: Spielen"<<endl
    			<<"O + Enter: Optionen"<<endl
    			<<"Q + Enter: Beenden"<<endl
    			<<">";
    			menu_choice = cin.get();
    
    			switch(menu_choice)
    			{
    				case 'b':
    				{
    					show_battlebeginUI();
    					break;
    				}
    				case 'o':
    				{
    					show_option_menu();
    					break;
    				}
    				case 'q':
    				{
    					run = false;
    					break;
    				}
    			}
    
    		}
    }
    
    void C_field::show_option_menu()
    {
    	bool run = true;
    
    	while(run)
    	{
    
    		clearscreen;
    
    		cout<<"P + Enter: Untergrund des Spielers aendern: "<<ground_player<<endl
    			<<"E + Enter: Untergrund des Gegners aendern: "<<ground_enemy<<endl
    			<<"N + Enter: Eigenen Namen aendern: "<<players[1].name<<endl
    			<<"G + Enter: Namen des Gegners aendern: "<<players[0].name<<endl
    			<<"Q + Enter: Zureuck"<<endl
    			<<">";
    			cin>>menu_choice;
    
    			switch(menu_choice)
    			{
    				case 'p':
    				{
    					cout<<"Gewuenschtes Zeichen eingeben: ";
    					cin>>ground_player;
    					refill_system("player");
    					break;
    				}
    				case 'e':
    				{
    					cout<<"Gewuenschtes Zeichen eingeben: ";
    					cin>>ground_enemy;
    					refill_system("enemy");
    					break;
    				}
    				case 'n':
    				{
    					cout<<"Neuen Namen fuer den Spieler eingeben: ";
    					cin>>players[1].name;
    					break;
    				}
    				case 'g':
    				{
    					cout<<"Neuen Namen fuer den Gegner eingeben: ";
    					cin>>players[0].name;
    					break;
    				}
    				case 'q':
    				{
    					run = false;
    					break;
    				}
    			}
    
    	}
    }
    
    void C_field::refill_system(string unit)
    {
    	if(unit == "player")
    	{
    		for (int y = 10; y != -1; y--)
    		{
    			for (int x = 0; x != 11; x++)
    			{
    				system_player[x][y] = ground_player;
    			}
    		}
    	}
    	else if(unit == "enemy")
    	{
    		for (int y = 10; y != -1; y--)
    		{
    			for (int x = 0; x != 11; x++)
    			{
    				system_enemy[x][y] = ground_enemy;
    			}
    		}
    	}
    }
    
    void C_field::show_battlebeginUI()
    {
    	bool run = true;
    
    	while (run)
    	{
    		clearscreen;
    		show_battlefield();
    		cout<<"B + Enter: Spiel Beginnen"<<endl
    			<<"O + Enter: Optionen"<<endl
    			<<"Q + Enter: Spiel Verlassen"<<endl
    			<<">";
    			cin>>menu_choice;
    
    			switch(menu_choice)
    			{
    				case 'b':
    				{
    					show_shipsetUI();
    					break;
    				}
    				case 'o':
    				{
    					show_option_menu();
    					break;
    				}
    				case 'q':
    				{
    					run = false;
    					refill_system("player");
    					refill_system("enemy");
    					break;
    				}
    				case '`':
    				{
    					int x,y;
    					cin>>x;
    					cin>>y;
    					system_enemy[x][y] = '*';
    					break;
    				}
    				default:
    				{
    					cout<<"Keine gueltige Eingabe!";
    					cin.ignore();
    					break;
    				}
    			}
    	}
    }
    
    void C_field::show_battlefield()
    {
    	clearscreen;
    	for(int y = 10; y != 0; y--)
    	{
    		cout<<y-1<<" ";
    
    		for (int x = 0; x != 10; x++)
    		{
    			cout<<system_player[x][y]<<" ";
    		}
    
    		cout<<"      ";
    
    		cout<<y-1<<" ";
    
    		for (int x = 0; x != 10; x++)
    		{
    			cout<<system_enemy[x][y]<<" ";
    		}
    		cout<<endl;
    	}
    
    	cout<<"  0 1 2 3 4 5 6 7 8 9         0 1 2 3 4 5 6 7 8 9 "<<endl;
    }
    
    void C_field::show_shipsetUI()
    {
    
    	bool run = true;
    	int x,y;
    
    	while(run)
    	{
    		show_battlefield();
    		cout<<"Bitte Schiffe platzieren dazu zuerst eine X- und dann eine Y-Koordinate eingeben"<<endl
    			<<"Tanker: "<<players[1].num_tanks<<endl
    			<<"Kriegsschiffe: "<<players[1].num_warships<<endl
    			<<"Rettungsboote: "<<players[1].num_savers<<endl
    			<<">X: ";
    			cin>>x;
    			cout<<endl<<">Y: ";
    			cin>>y;
    
    	}
    }
    
    //player.h
    
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    class C_player
    {
    	public:
    	string name;
    	int num_ships, num_tanks, num_warships, num_savers;
    	map<string, C_ship> ships;
    	C_player(string namee);
    };
    
    //player.cpp
    
    #include "player.h"
    
    C_player::C_player(string namee)
    {
    	name = namee;
    	num_ships = 0;
    	num_warships = 2;
    	num_tanks = 2;
    	num_savers = 2;
    }
    

    Ich möchte in diesem Zeitpunkt der Blöße darauf hinweisen das, ich weder beruflich, noch ausbildungs/studientechnisch mit C++ und Programmierung an sich
    zu tun habe sondern programmiere weil ich es liebe meine Ideen in Prorammen
    verwirklichen zu können und wirklich ALLES machen zu können von sinnlos bis
    tatsächlich nütlich. Es ist eine Beschäftigung für mich und die Eleganz meiner
    Programmierung und die sinnvolle ausführung liegen allein in meinem Ermessen und ich bin lediglich an der Lösung meines Problems interessiert.
    Ich hoffe ihr könnt mit dem obigen Code etwas anfangen und mir Helfen.
    Vielen Dank.



  • Da fehlt irgendwas:

    'C_ship': undeclared identifier
    


  • Oh ja tut mir leid einfach bei player.h

    map<string, c_ship>ships;
    

    rausnehmen ich hatte das jetzt schon gemacht tut mir Leid.



  • MNowo schrieb:

    C_field::C_field()
    {
        C_player enemy("Enemy");
        players.push_back(enemy);
        C_player player(get_users_name());
        players.push_back(player);  // einen vector fuer konstant 2 Spieler? rly?
     
     
        ground_player = '.';  // Initialisierungsliste
        ground_enemy = '.';   // verwenden!
     
        for (int y = 10; y != -1; y--)  // zählt von 10 bis 0 ... die Dimension geht aber nur von 0 bis 9
                                        // warum zählst du rückwärts?
        {
            for (int x = 0; x != 11; x++)  // zählt von 0 bis 10 ... die Dimension geht aber nur von 0 bis 9
            {
                system_player[x][y] = ground_player;
                system_enemy[x][y] = ground_enemy;
            }
        }
    
        // warum nicht gleich std::memset() ?
     
    }
    

    Gleiche Kacke in C_field::refill_system() , ähnliche Kacke in C_field::show_battlefield() .



  • Hey danke das du dich mit meinem Code beschäftigt hast,
    das mit dem Bedingungswert in der Zählschleife stimmt
    wieso ich rückwärts zähle habe ich oben schonmal erklärt.
    memset() habe ich nicht benutzt weil ich es nicht kenne.
    Deine ganzen Einwände bieten trotzdem keinen Lösungsansatz für
    mein Problem dar und ich wäre wirklich sehr dankbar wenn eher etwas in der
    Hinsicht käme.
    Ausserdem scheint die komplette Reihe im Spielfeld von Spieler und Gegner
    wo y = 9 sein sollte y = 0 zu sein x werte von -9 bis 10 zu besetzen und zum Gegnerischen Spielfeld zu gehören. Wie kann denn das alles sein?
    Edit: Ich habe jetzt nochmal vom Spieler Feld aus die Koordinaten besetzt
    und da geht die Reihe bis (20|0) das ist doch garnicht möglich alles ?!?



  • Swordfish schrieb:

    // warum nicht gleich std::memset() ?

    Warum ::memset wenn es std::fill gibt?



  • Hallo MNowo,

    du darfst auf Arrays nur innerhalb der Indexgrenzen zugreifen, d.h. wenn du ein Array mit 10 Elementen dafiniert hast, dann darfst du nur die Indizes 0 bis 9 benutzen:

    for (int y = 0; y < 10; ++y)
    {
        for (int x = 0; x < 10; ++x)
        {
            system_player[x][y] = ground_player;
            system_enemy[x][y] = ground_enemy;
        }
    }
    

    Deine Erklärung bzgl. "Rückwärtszählen" ist außerdem falsch (weil es hier doch gar nicht auf die Darstellung ankommt)!

    Und deine anderen Schleifen auch entsprechend anpassen!!!

    Und wenn du bei der Darstellung in show_battlefield() die Anzeige umdrehen willst (also oben die letzte Zeile des Arrays), dann entweder als Index '9-y' benutzen oder aber

    for (int y = 9; y >= 0; --y)
    

    verwenden.

    Außerdem als Tipp: keine Magic-Numbers verwenden, sondern definiere dir 2 Konstanten:

    const int MaxX = 10;
    const int MaxY = 10;
    

    und benutze diese überall in deinem Programmcode!



  • Hallo TH69,
    ich danke dir vielmals für diese Konstruktiven und
    gut hinterlegten Vorschläge.
    Ich habe alles gemacht was du geschrieben hast, geändert hat sich allerdings
    immer noch nichts und ich verstehe nicht wieso sich die arrays so merkwürdig
    verhalten wie sie es eigentlich ja garnicht KÖNNEN.
    EDIT: Ich habejetzt schonmal einen grossen Fehler gefunden dessen behebung
    mich schonmal einen grossen Schritt weiter bringt undzwar greife ich immer mit
    z.B. system_player[x][y] auf die arrays zu statt mit system_player[y][x]
    EDIT 2:SO ich habe mein Problem jetzt gelöst ich danke allen die sich die Zeit genommen haben und sich mit diesem Thema beschäftigt haben



  • std__upset schrieb:

    Swordfish schrieb:

    // warum nicht gleich std::memset() ?

    Warum ::memset wenn es std::fill gibt?

    Weil ich C-geschädigt bin.


Anmelden zum Antworten