Hallo leute.
leider muss i das spiel schiffe versenken in C nachproggen. das ganze ist ungefähr so aufgebaut.
/**************/
1. Schiffe setzen
2. Spielfeld zeigen
3. Spielfeld speichern
4. ..................
.
.
.
/**********************/
das ganze ist also ziemlich textbasiert.
das spielfeld wird mit blanks (freier Platz) und X (wo ein Schiff steht). also irgendwie eine mischung zwischen textbasiert und grafisch.
so, und jetzt meine fragen.
wie kann ich die schiffe am besten setzen so dass es zu keinen fehlern kommt. es soll einen kreuzer mit 5 punkten, begleitschiff mit 4 punkten,........ geben.
wie soll der computergegner am besten spielen? sodass er z.b. bei einem treffer die umliegenden felder bevorzugt... weiß jemand eine bessere strategie?.
mfg stefan1568
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
# Schiffe kannst du ja in ein 2 Dimensionales bool array packen.
bool ships[50][50]={
{
{0,0,0,0,1,0.....}
{0,0,0,0,1,0.....}
{0,0,0,0,1,0.....}
{1,1,1,0,1,0.....}
{0,0,0,0,1,0.....}
.
.
.
}
# zum eingeben brauchst do logischerweise x/y anfangs endkoordinaten,
# die solltest du erstmal prüfen damit keine diagonalen möglich sind:
x1==x2 || y1==y2
x1-x2 == shiptype[gewählt] || y1-y2 == shiptype[gewählt] //siehe weiter unten
# dann machst du ne verschachtelte Schleife die y und y läuft
für x = x1 zu x2
_für y = y1 zu y2
__wenn: ships[y][x] dann: Fehler = True
# und dann nochmal läuft, (kannst schleifenkörper ruhig 2x schreiben)
wenn: Fehler = False dann:
_für x = x1 zu x2
__für y = y1 zu y2
___ships[y][x] = 1
sonst:
_Ausgabe: "Fehler"
# Noch dazu ein Schifferegister
int shiptype[4]={5,4,3,2}
string shipname[4]={"Kreuzer", "Begleitschiff"....}
# Schiffsmenü dann so:
für i = 1 zu 4
_wenn: shiptype[i] dann: Ausgabe: i + "r " + shipname {}
Eingabe: gewählt
# Ich schätze ihr sollt zufallszahlen nehmen.
# Naja man könnte mit einer Formel den Zufallsbereich ja beschränken:
zX = rand(zXalt-3 bis zXalt+3)
zY = rand(zXalt-3 bis zXalt+3)
# bzw mit den vorangegangenen werten eine Zeile oder Spalte ermitteln:
Wenn: zXalt == zXälter dann: zX = zXalt
Wenn: zYalt == zYälter dann: zY = zYalt
# natürlich muss das dann auch "weiterrutschen" also zX zu zXalt zu zXälter
# Die ausgabe des Spielfelds ist wieder unsere doppelschleife:
für x = 0 zu 50
_für y = 0 zu 50
__Wenn: ships[y][x] dann: Ausgabe: "X"
# Wenn: wert (bedeutet alles was nicht 0 ist also buchstaben Zahlen usw. ;) kleiner Trick)
# Viel Spaß!
Was meinst Du mit Fehlern? Das weder zwei Schiffe über noch direkt (ohne ein Feld Abstand) nebeneinander liegen?
Am bequemsten dürfte es sein die Schiffe mit absteigender Größe zu plazieren. Also erst mal das 5er Schiff, anschließend die kleineren (wobei hier jeweils vorher geprüft werdem muß ob an der gewünschten Position der nötige Platz ist (die Schiffe dazu am besten in einem Array speichern und von Schiffen belegte Plätze sowie direkt benachbarte "färben")...
wie soll der computergegner am besten spielen? sodass er z.b. bei einem treffer die umliegenden felder bevorzugt... weiß jemand eine bessere strategie?.
Würde ich spontan auch so machen, wobei das Zielen auf umliegende Feler nur so lange sinnvoll ist solange noch nicht Schiffe >1 entdeckt wurden...
Gruß
Borlander
das mein ich so: ich könnte ja theoretisch schreiben dass der 1.punkt vom schiff 3 auf [3][2] ist und der zweite auf [6][6]. dann könnte ich ja ein schiff "teilen" und die punkte willkürlich setzen.
mfg stefan
Hallo Stefan,
was meinst du mit schiff "teilen" und die punkte willkürlich setzen? Ich kann dem nicht ganz entnehmen was Du eigentlich wissen möchtest...
Die Schiffe müssen natürlich in jedem Fall zufällig plaziert werden, sonst würde es schnell langweilig ;-)
Gruß
Borlander
Schau nochmal in meinen Fetzen... da hab ich schon einen Test gemacht ob y1=y2 oder x1=x2 sprich das Schiff grade auf einer horizontale oder vertikale liegt.