[gelöst]Schiffe versenken



  • Ich brach ja auch eine "KI" für den Computer, die erst setzt(random) und dann den ersten Schuss auch random abfeuert..
    Nachdem der Computer random abgeschossen hat, soll er wenn er was getroffen hat, wieder schießen(recht, link, oben oder unten von dem was er vorher ausgewählt hat) und falls er nichts getroffen hat, soll es ein Spieler wechsel geben...
    Bräuchte da ein paar Tipps wie ich das realisieren kann...


  • Mod

    meinhana schrieb:

    Bräuchte da ein paar Tipps wie ich das realisieren kann...

    Du hast doch schon sehr genau beschrieben, wie das Programm ablaufen soll. An welcher Stelle hast du denn Schwierigkeiten, dies in Code umzusetzen?



  • Also
    Sozusagen, soll der Computer ja das gleiche machen wie der Mensch, nur halt random sezten...
    Ich wollte jetzt eine neue Klasse Computer hinzufügen den Code von Menschen reinkopieren und alle die Eingaben des Menschens durch random ersetzen
    Aber das random müsste ja irgendwie einen Max wert haben, da ich nur begrenzte felder hab...

    Hier einmal der Code vom Menschen

    #include "Mensch.h"
    #include <iostream>
    #include <conio.h>
    
    Mensch::Mensch(Spielfeld *meinspielfeld)
    {
    	m_meinspielfeld= meinspielfeld;
    	m_schiffe = meinspielfeld->getschiffe();
    	z_uboot=0;
    	z_zerstoerer=0;
    	z_schlachtschiff=0;
    	z_kreuzer=0;
    }
    
    bool Mensch::GibZug()
    {
    	char auswahl; 
    	int zeile, spalte;
    	char richtung;
    	ende = false; 
    	cout << endl;
    	cout << "   Bitte waehlen Sie ein Schiff:" << endl;
    	cout << "1. U-Boot         (2 Kaestchen) (" << 4- z_uboot << "x)" << endl;
    	cout << "2. Zerstoerer     (3 Kaestchen) (" << 3- z_zerstoerer << "x)" <<endl;
    	cout << "3. Kreuzer        (4 Kaestchen) (" << 2- z_kreuzer << "x)"  <<endl;
    	cout << "4. Schlachtschiff (5 Kaestchen) (" << 1- z_schlachtschiff << "x)"  <<endl;
        cout << endl;
        cout << "!Schiffe duerfen nicht aneinander stossen!" <<endl <<endl;	
    	do
    	{
    		auswahl = getchar();
    		switch (auswahl)
    		{
    		case '1': if(z_uboot<4)
    				  {
    					  getkoord(&zeile, &spalte);
    					  richtung= getrichtung();
    					  bool ok= m_meinspielfeld->checkkoord(UBOOT, zeile, spalte, richtung);
    					  if(ok)
    					  {
    						  m_schiffe->schiffsetzen(UBOOT, z_uboot, zeile, spalte, richtung);
    						  z_uboot++;
    					  }
    						  ende=true;
    				  }
    				  else
    				  {
    					  cout << "Alle Uboote gesetzt!" << endl;
    					  cout << "Bitte Neues Schiff auswaehlen!" << endl;
    					  getch();
    					  ende=true;
    				  }
    						  break;
    		case '2': if(z_zerstoerer<3)
    				  {
    						getkoord(&zeile, &spalte);
    						richtung= getrichtung();
    						bool ok= m_meinspielfeld->checkkoord(ZERSTOERER, zeile, spalte, richtung);
    						if(ok)
    						{
    							m_schiffe->schiffsetzen(ZERSTOERER, z_zerstoerer, zeile, spalte, richtung);
    							z_zerstoerer++;
    						}
    						ende=true;
    				  }
    				  else
    				  {
    					  cout << "Alle Zerstoerer gesetzt!" << endl;
    					  cout << "Bitte Neues Schiff auswaehlen!" << endl;
    					  getch();
    					  ende=true;
    				  }
    		break;
    		case '3': if(z_kreuzer<2)
    				  {
    						getkoord(&zeile, &spalte);
    						richtung= getrichtung();
    						bool ok= m_meinspielfeld->checkkoord(KREUZER, zeile, spalte, richtung);
    						if(ok)
    						{
    							m_schiffe->schiffsetzen(KREUZER, z_kreuzer, zeile, spalte, richtung);
    							z_kreuzer++;
    						}
    						ende=true;
    				  }
    				  else
    				  {
    					  cout << "Alle Kreuzer gesetzt!" << endl;
    					  cout << "Bitte Neues Schiff auswaehlen!" << endl;
    					  getch();
    					  ende=true;
    				  }
    		break;
    		case '4': if(z_schlachtschiff<1)
    				  {
    						getkoord(&zeile, &spalte);
    						richtung= getrichtung();
    						bool ok= m_meinspielfeld->checkkoord(SCHLACHTSCHIFF, zeile, spalte, richtung);
    						if(ok)
    						{
    							m_schiffe->schiffsetzen(SCHLACHTSCHIFF, z_schlachtschiff, zeile, spalte, richtung);
    							z_schlachtschiff++;
    						}
    						ende=true;
    				  }
    				  else
    				  {
    					  cout << "Alle Schlachtschiffe gesetzt!" << endl;
    					  cout << "Bitte Neues Schiff auswaehlen!" << endl;
    					  getch();
    					  ende=true;
    				  }
    		break; 
    		case '\n': continue;
    		default: cout << "Fehler" << endl; 
    		}
    	}while (!ende);
    
    	bool allegesetzt= z_uboot==4 && z_zerstoerer==3 && z_kreuzer==2 && z_schlachtschiff==1;
    	return allegesetzt;
    }
    
    void Mensch::getkoord(int* zeile, int* spalte)
    {
    	string input;
    	cout <<"Bitte waehlen Sie die Anfangskoordinate"<<endl;
    	cin >> input;
    	*zeile = getzeile(input);
    	*spalte = getspalte(input);
    }
    
    char Mensch::getrichtung()
    {
    	string input;
    	cout <<"rechts, links, oben, unten"<<endl;
    	cin >> input;
    	return input[0];
    }
    
    int Mensch::getzeile(string input)
    {
    	if(input[0]<'a')
    	{
    	return input[0] - 'A';
    	}
    	else
    	{
    		return input[0] - 'a';
    	}
    }
    int Mensch::getspalte(string input)
    {
    	return input[1] - '0';
    }
    


  • Hab mir irgendwie sowas gedacht...

    void Computer::setrandom()
    {	
    		srand ( time(NULL) ); 
    
    		Spielfeld.feld[spalte];
    		Randspalte = rand()%9;
    		feld[randspalte];
    		Spielfeld.feld[zeile];
    		Randzeile = rand()%9;
    		feld[Ranzeile];
    
    }
    

    Aber er erkennt feld[spalte][zeile] nicht ... mhm



  • Soviel Zeilen Code für eine Frage? 😕 Schiffe versenkt man mit Torpedos
    abgeschossen von einem U-Boot oder mit einem Schuss aus der Bordkanone! 😃



  • Nach langem Quälen, hab ich die lösung

    void Computer::setrandom(int* Randzeile, int* Randspalte, char* richtung)
    {
    		*Randspalte = rand()%9;
    		*Randzeile = rand()%9;
    		int Randrichtung= rand()%4;
    		switch(Randrichtung)
    		{
    		case 0: *richtung= 'r';
    			break;
    		case 1: *richtung ='l';
    			break;
    		case 2: *richtung= 'o';
    			break;
    		case 3: *richtung= 'u';
    			break;
    		default:;
    		}
    }
    

    Und das wird dann so aufgerufen

    void Computer::schiffesetzten()
    {	
    		int Randspalte;
    		int Randzeile;
    		char richtung;
    		int i=0;
    
    	while(i<4)
    	{
    		setrandom(&Randzeile, &Randspalte, &richtung);
    		bool ok= m_compspielfeld->checkkoord(UBOOT, Randzeile, Randspalte, richtung);
    		if(ok)
    		{
    			m_schiffe->schiffsetzen(UBOOT, i, Randzeile, Randspalte, richtung);
    			m_compspielfeld->update();
    			i++;
    		}
    


  • So xD
    Und wie krieg ich jetzt einen Spielerwechsel hin?!



  • meinhana schrieb:

    So xD
    Und wie krieg ich jetzt einen Spielerwechsel hin?!

    Den ersten Zug machst du, danach rufst du die Funktion auf das der Computer einen Zug machen soll.

    Du,Computer,Du,Computer <-- Spielerwechsel



  • Ich war jetzt geschlagene zwei Wochen nicht mehr mit C++ beschäftigt und wundere mich darüber das ich nicht mehr rein komme....
    Ich wollte das programm erstmal so schreiben, dass nur der Mensch immer weider schießen darf...
    ungefähr so

    bool Spielfeld::getroffen(int zeile,int spalte)
    {
    	bool getroffen= false; 
    
    	Mensch.angriff;
    	angriff gegFeld->getroffen(zeile, spalte);
    
    	if(feld[zeile][spalte].inhalt =="ZZ" || feld[zeile][spalte].inhalt == "UU" ||
    	   feld[zeile][spalte].inhalt =="SC" || feld[zeile][spalte].inhalt == "KK")
    	{
    		feld[zeile][spalte].inhalt ="XX";
    		getroffen= true;
    
    	}
    
    	return getroffen;
    }
    

    Und so

    bool Mensch::angriff(Spielfeld* gegFeld)
    {
    	int zeile, spalte;
    	string input;
    	while(getroffen= true)
    	{
    	cout << "Nun duerfen Sie den Computer angreifen!" << endl;
    	cout << "Waehlen Sie dafür eine Koordinate!" <<endl;
    	cin >> input;
    	cout <<"Sie haben auf" << input << "geschossen"<< endl;
    
    	// koordinaten eingabe (zeile, spalte)
    	getkoord("Waehlen Sie dafür eine Koordinate", &zeile, &spalte);
    
    	// prüfe ob getroffen
    	bool getroffen = gegFeld->getroffen(zeile, spalte);
    
    	if (getroffen)
    	{
    		cout <<"Sie duerfen nochmal"<< endl;
    	}
    	else
    	{
    		cout <<"Sie haben nichts getroffen"<< endl;
    		//cout <<"Der Computer ist jetzt dran" <<endl;
    	}
    	}
    }
    

    NUR DAS WILL ALLES NICHT SO WIE ICH ES WILL



  • Habs doch hinbekommen ^^

    bool Spielfeld::getroffen(int zeile,int spalte)
    {
    	bool getroffen= false; 
    
    	if(feld[zeile][spalte].inhalt =="ZZ" || feld[zeile][spalte].inhalt == "UU" ||
    	   feld[zeile][spalte].inhalt =="SC" || feld[zeile][spalte].inhalt == "KK")
    	{
    		feld[zeile][spalte].inhalt ="XX";
    		getroffen= true;
    
    	}
    
    	return getroffen;
    }
    

    Und...

    bool Mensch::angriff(Spielfeld* gegFeld)
    {
    	int zeile, spalte;
    	string input;
    	bool getroffen = false;
    
    	do 
    	{
    	cout << "Nun duerfen Sie den Computer angreifen!" << endl;
    	// koordinaten eingabe (zeile, spalte)
    	getkoord("Waehlen Sie dafür eine Koordinate", &zeile, &spalte);
    
    	// prüfe ob getroffen
    	getroffen = gegFeld->getroffen(zeile, spalte);
    	gegFeld->draw();
    
    	if (getroffen)
    	{
    		cout <<"Sie duerfen nochmal"<< endl;
    	}
    	else
    	{
    		cout <<"Sie haben nichts getroffen"<< endl;
    		cout <<"Der Computer ist jetzt dran" <<endl;
    	}
    	}while(getroffen== true);
    
    	return false;
    }
    


  • Hallo,
    ich hoffe ihr hab nochmal zeit fürs Schiffe versenken 🙂
    Bin momentan dabei die KI für den Computer zu schreiben, hab schon einen Anfang, aber ich vermute das ich darin einen Gedankenfehler habe...

    Bitte um Tipp & Vorschläge

    void Computer::KI(Spielfeld* meinFeld)
    {
    	int zeile, spalte;
    	bool getroffen= false;
    	bool geschossen= false;
    	bool treffer= false;
    	bool links= false;
    	bool rechts= false;
    	bool oben= false;
    	bool unten= false;
    
    	while(angriff)
    	{
    		if(feld[zeile][spalte].inhalt == "UU" || // guckt ob random was getroffen hat
    			feld[zeile][spalte].inhalt == "ZZ"|| 
    			feld[zeile][spalte].inhalt == "SC"|| 
    			feld[zeile][spalte].inhalt == "KK")
    		{
    			feld[zeile][spalte].inhalt = "XX";
    			treffer= true;
    		}
    		else
    		{
    			treffer= false;
    		}
    		if(treffer)
    		{
    			if(feld[zeile][spalte+1].inhalt == "UU" || //Falls rechts was ist 
    			   feld[zeile][spalte+1].inhalt == "ZZ"|| 
    		   	   feld[zeile][spalte+1].inhalt == "SC"|| 
    			   feld[zeile][spalte+1].inhalt == "KK")
    			{
    
    				feld[zeile][spalte+1].inhalt = "XX";
    				rechts= true;
    				spalte++;
    
    				while(rechts)
    				{	
    					if(feld[zeile][spalte].inhalt == "ZZ" || 
    					   feld[zeile][spalte].inhalt == "SC" || 
    					   feld[zeile][spalte].inhalt == "KK")
    					{
    						feld[zeile][spalte].inhalt = "XX";
    						rechts=true;
    					}
    					if(rechts &&feld[zeile][spalte].inhalt == "SC" || 
    							feld[zeile][spalte].inhalt == "KK")
    					{
    						feld[zeile][spalte].inhalt = "XX";
    						rechts=true;
    					}
    					if(rechts &&feld[zeile][spalte].inhalt == "SC")
    					{
    						feld[zeile][spalte].inhalt = "XX";
    						rechts=false;
    					}
    					spalte++;
    				}
    			}
    
    		}
    		else
    		{
    			angriff= false;
    		}
    
    	}
    
    }
    
    void Computer::angriff(Spielfeld* meinFeld)// Random angriff
    {
    	int Randspalte;
    	int Randzeile;
    	int zeile, spalte;
    	char richtung;
    	bool getroffen= false;	
    	bool treffer= false;
    
    	if(ersterSchuss)
    	{
    		setrandom(&Randzeile, &Randspalte, &richtung);
    		getroffen = meinFeld->getroffen(zeile, spalte);
    		if(getroffen== true)
    		{
    			treffer= true;
    		}
    		meinFeld->update();
    		ersterSchuss= false; 
    	}
    	if(treffer)
    	{
    
    	}
    }
    
    Computer::Computer(Spielfeld *compspielfeld)
    {
    	srand ( time(NULL) ); 
    	m_compspielfeld= compspielfeld;
    	m_schiffe = compspielfeld->getschiffe();
    	ersterSchuss= true; 
    	angriff= true;
    }
    

    Die Schiffe setzten kann er schon ^^


Anmelden zum Antworten