[gelöst]Schiffe versenken
-
Hallo Leute,
ich bins mal wieder
Hab ein Problem, ich bin dabei Schiffe versenken zu programmieren und weiß nicht weiter...
Das Problem : Er setzt zwar die Schiffe, aber er füllt das Spielfeld nicht mit den Buchstaben auf, nur den Anfangs und den Endwert.
Denkweise: Ich müsste wissen ob es nach rechts, links, oben und unten geht, und was das für ein Schiff ist...
Bitte um HilfeHier einmal der Quelltext
#include"Spielfeld.h" #include<iostream> #include<conio.h> #include<string> using namespace std; Spielfeld::Spielfeld(spiel *meinspiel) { m_meinspiel = meinspiel; init(); } void Spielfeld::draw() { cout <<"Schiffe versenken"<<endl; cout <<"Ihr Spielfeld:"<<endl; cout <<endl; if(m_meinspiel->uboot[0].hatkoord()) { int zeile = m_meinspiel->uboot[0].anfangszeile; int spalte = m_meinspiel->uboot[0].anfangsspalte; feld[zeile][spalte]="UU"; zeile = m_meinspiel->uboot[0].endezeile; spalte = m_meinspiel->uboot[0].endespalte; feld[zeile][spalte]="UU"; } else if(m_meinspiel->zerstoerer[0].hatkoord()) { int zeile = m_meinspiel->zerstoerer[0].anfangszeile; int spalte = m_meinspiel->zerstoerer[0].anfangsspalte; feld[zeile][spalte]="ZZ"; zeile = m_meinspiel->zerstoerer[0].endezeile; spalte = m_meinspiel->zerstoerer[0].endespalte; } else if (m_meinspiel->kreuzer[0].hatkoord()) { int zeile = m_meinspiel->kreuzer[0].anfangszeile; int spalte = m_meinspiel->kreuzer[0].anfangsspalte; feld[zeile][spalte]="KK"; // zeile = m_meinspiel->kreuzer[0].endezeile; spalte = m_meinspiel->kreuzer[0].endespalte; feld[zeile][spalte]="KK"; } else if (m_meinspiel->schlachtschiff[0].hatkoord()) { if() { } int zeile = m_meinspiel->schlachtschiff[0].anfangszeile; int spalte = m_meinspiel->schlachtschiff[0].anfangsspalte; feld[zeile][spalte]="SC"; zeile = m_meinspiel->schlachtschiff[0].endezeile; spalte = m_meinspiel->schlachtschiff[0].endespalte; feld[zeile][spalte]="SC"; } for(int i=0; i<10; i++) { for(int j=0; j<10;j++) { char zeilenende = (j==9) ? '\n': ' '; cout << "|" << feld[i][j] << "|" << zeilenende; } } } void Spielfeld::init() { for(int i=0; i<10; i++) { char z = 'A' + i; // 'A' .. 'J' for(int j=0; j<10;j++) { feld[i][j] = " "; char s = '0' + j; // '0'..'9' feld[i][j][0] = z; feld[i][j][1] = s; } } }
Und
#include "Mensch.h" #include "spiel.h" #include <iostream> #include <conio.h> Mensch::Mensch(spiel *meinspiel) { m_spiel = meinspiel; z_uboot=0; z_zerstoerer=0; z_schlachtschiff=0; z_kreuzer=0; } bool Mensch::GibZug() { char auswahl; 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; getch(); do { auswahl = getchar(); switch (auswahl) { case '1': if(z_uboot<4) { m_spiel->schiffsetzen(UBOOT, z_uboot);// ZÄHLER VON UBOOT z_uboot++; ende=true; } break; case '2': if(z_zerstoerer<3) { m_spiel->schiffsetzen(ZERSTOERER, z_zerstoerer); z_zerstoerer++; ende=true; } break; case '3': if(z_kreuzer<2) { m_spiel->schiffsetzen(KREUZER, z_kreuzer); z_kreuzer++; ende=true; } break; case '4': if(z_schlachtschiff<1) { m_spiel->schiffsetzen(SCHLACHTSCHIFF, z_schlachtschiff); z_schlachtschiff++; 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; }
und die Main
// Schiffe versenken.cpp #include <iostream> #include <conio.h> #include "Spieler.h" #include "Spielfeld.h" #include "Schiffe.h" #include "spiel.h" #include "Mensch.h" using namespace std; int main() { spiel meinspiel; Spielfeld meinspielfeld(&meinspiel); Mensch meins(&meinspiel); bool allegesetzt= false; while(!allegesetzt) { meinspielfeld.draw(); allegesetzt= meins.GibZug(); } return 0; }
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum Projekte verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hab schon eine Lösung gefunden ^^
void Spielfeld::draw() { cout <<"Schiffe versenken"<<endl; cout <<"Ihr Spielfeld:"<<endl; cout <<endl; for(int i=0;i<4;i++) { if(m_meinspiel->uboot[i].hatkoord()) { int zeile = m_meinspiel->uboot[i].anfangszeile; int spalte = m_meinspiel->uboot[i].anfangsspalte; feld[zeile][spalte]="UU"; zeile = m_meinspiel->uboot[i].endezeile; spalte = m_meinspiel->uboot[i].endespalte; feld[zeile][spalte]="UU"; } } for(int i=0;i<3;i++) { if(m_meinspiel->zerstoerer[i].hatkoord()) { schiff &meinschiff= m_meinspiel->zerstoerer[i]; int zeile = meinschiff.anfangszeile; int spalte = meinschiff.anfangsspalte; int deltaz = meinschiff.endezeile - meinschiff.anfangszeile +1; int deltas = meinschiff.endespalte - meinschiff.anfangsspalte +1; for(int spalte=meinschiff.anfangsspalte;spalte<meinschiff.anfangsspalte+deltas;spalte++) { feld[zeile][spalte]="ZZ"; } for(int zeile=meinschiff.anfangszeile;zeile<meinschiff.anfangszeile+deltaz;zeile++) { feld[zeile][spalte]="ZZ"; } } } for(int i=0;i<2;i++) { if (m_meinspiel->kreuzer[i].hatkoord()) { schiff &meinschiff= m_meinspiel->kreuzer[i]; int zeile = meinschiff.anfangszeile; int spalte = meinschiff.anfangsspalte; int deltaz = meinschiff.endezeile - meinschiff.anfangszeile +1; int deltas = meinschiff.endespalte - meinschiff.anfangsspalte +1; for(int spalte=meinschiff.anfangsspalte;spalte<meinschiff.anfangsspalte+deltas;spalte++) { feld[zeile][spalte]="KK"; } for(int zeile=meinschiff.anfangszeile;zeile<meinschiff.anfangszeile+deltaz;zeile++) { feld[zeile][spalte]="KK"; } } } if (m_meinspiel->schlachtschiff[0].hatkoord()) { schiff &meinschiff= m_meinspiel->schlachtschiff[0]; int zeile = meinschiff.anfangszeile; int spalte = meinschiff.anfangsspalte; int deltaz = meinschiff.endezeile - meinschiff.anfangszeile +1; int deltas = meinschiff.endespalte - meinschiff.anfangsspalte +1; for(int spalte=meinschiff.anfangsspalte;spalte<meinschiff.anfangsspalte+deltas;spalte++) { feld[zeile][spalte]="SC"; } for(int zeile=meinschiff.anfangszeile;zeile<meinschiff.anfangszeile+deltaz;zeile++) { feld[zeile][spalte]="SC"; } } for(int i=0; i<10; i++) { for(int j=0; j<10;j++) { char zeilenende = (j==9) ? '\n': ' '; cout << "|" << feld[i][j] << "|" << zeilenende; } } }
-
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...
-
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 sobool 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 ^^