Schiffer versenken Strategie

Hallo,
Ich bin grad dabei ein Spiel in Java zu programieren, es ist ein ganz einfaches, nichts aufwendiges. Mein Spiel ist Schiffe versenken, Ich habe eine Matrix 10x10 und ich habe
1 Flugzeugträger mit größe 4
2 Zerstörer mit größe 3
3 U-Bote mit größe 2
4 Transporter mit größ 1
Regeln:
Die Schiffe dürfen sich nicht berühren. Auch nicht über Eck.

Mein Spiel ist so gut wie Fertig, das einzige was mir noch fählt, ist eine Funktion, die mir ermöglicht, auf die Schiffe vom gegner zu schiessen, in form Random. Aber wenn ich ein Schiff getroffen habe, das er mir dann nicht in Random weiterschiesst, sonder versucht herrauszufinden ob das Schiff horizonal oder vertikal ist und es dann zerstören. Danach kann er in Random weiter schiessen. Aber was er sich merken soll ist auch, das um dieses Schiff herum keine anderen Schiffe sein können. Und er soll diese Felder dann auch nicht beschiessen.

Kann mir da bitte jemand helfen?
Das Problem ist, ich muss das Spiel bis nächste Woche Mittwoch fertig haben.
Danke schon mal im Voraus.

vielleicht hilft dir das

fehlt einiges und ist nur eine Hilfe von vielen

pseudocode
shiffe[1er] = ({1,1})
shiffe[2er] = ({3,1},{4,1})
// hit prüft ob eine koordinate in shiffen getroffen wurde
// mittels broken wird geprüft ob alle koordinaten tupel eines shiffes auf myshots ein treffer haben .

myshots[10][10] = {}
// wird durch setblockhit , setblockwater , setblockbroken modifiziert
// durch hit geprüft

lastshot = {} // letzter treffer
thisshot = {} // dieser schuss
dirshot = {} // schusswinkel nach treffer bekannt
nextshot = {} // nächster schuss

// haben wir ein nächsten shot so ist das dieser shuss
if (nextshot) {thisshot = nextshot)
if (thisshot) {
// prüfen ob getroffen
hit = shipopponent(thisshot)
if (hit) {
// wenn getroffen prüfen ob zerstört
broken = ship(thisshot)
}
else
{
// wenn nicht ist der gegner drann
shotende = true
}
}

// wenn getroffen, aber noch keine richtung gibt und auch nicht zerstört
if (hit AND NOT dirshot AND NOT broken) {
// solange neues shussfeld suchen bis was drum herum frei ist
while (blocked(newshot)) {
newshot = randomshot(thisshot)
}
// nächsten shuss festlegen
nextshot = newshot
// diesen schuss speichern
lastshot = thisshot
}

// wenn letzter und dieser schuss ein hit
if (lastshot AND hit) {
// schussrichtung ermitteln
dirshot = steigung(lasthot,thisshot)
// letzten schuss block (seiten) und treffer setzen
setblockhit(lastshot,dirshot)
// diesen schuss block (seiten) und treffer setzen
setblockhit(thisshot,dirshot)
// shiff zerstört
if (broken) {
// diesen schuss block (alle seiten schiff) setzen
setblockbroken(thisshot,dirshot)
} else {
// nächste vermutetes schussziel für nächsten schuss wählen
nextshot = walkshot(dirshot)
}
// sichern dieses schusses
lastshot = thisshot
}
// wenn letzter schuss ein hit aber dieser wasser
if (lastshot AND NOT hit) {
// letzten schuss wasser setzen
setblocknohit(thisshot)
// richtung umdrehen
dirshot = steigung(lasthot,thisshot) * (-1)
// nächsten schuss finden
nextshot = walkshot(dirshot)
// sichern dieses schusses
lastshot = thisshot
}

Vielen vielen Dank, das hilft mir schon sehr weiter. Ich werde versuchen das in mein Programm zu übertragen, wenn es funktioniert, meld ich es dir.

Hallo Leute ich habe ein neues Problem. Wie Speicher ich meine Randomschüsse in einer ArrayList, damit for dem nächsten random schuss nicht nochmal gebraucht wird… Irgenwie bekomm ich das noch nicht richtig hin…

wieso die schüsse in eine liste ??

mach dir eine 10x10 map und trag dort die sachen ein
http://www.leepoint.net/notes-java/data/arrays/array…

und dann eine 1 für wasser , 2 für getroffen, 3 für abstand

und dann mit x und y arbeiten für jeweilige zelle

Ok und wie lese ich diese dann wieder aus? weil ich muss ja meinem Randomschuss sagen welche Felder der nicht besschiessen darf.

import java.util.ArrayList;

import java.util.Random;

// NOTA: En su archivo, debe agregar esta línea.
// De esa forma se importa la librería para poder jugar.
import batallaNaval.BatallaNaval;

// El nombre de la clase puede ser cualquiera
public class Neu {

public static void main(String[] args) {

// Distrobución de Barcos
// 1 barco de 4
// 2 barcos de 3
// 3 barcos de 2
// 4 barcos de 1

// =============== Definir el tablero con sus barcos
// Referencias
// Agua es 0
// Barco es 1
// Mi tablero de barcos
// NOTA: Es necesario tener una función que permita
// cargar los barcos

int[][] tableroMio = { { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, };
System.out.println(" PHILIP");
for (int i = 0; i < 10; i++) {
System.out.print(i + " | „);
for (int j = 0; j < 10; j++) {
System.out.print(tableroMio[i][j] + " „);
}
System.out.print(“ | „);
System.out.println(“ „);
}
System.out.println(“\n\n“);
System.out.println(" COMPUTADORA");
int tableroCompu[][] = { { 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, },
{ 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, },
{ 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, },
{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, }, };

for (int i = 0; i < 10; i++) {
System.out.print(i + " | ");
for (int j = 0; j < 10; j++) {
System.out.print(tableroCompu[i][j] + " „);
}
System.out.print(“ | „);
System.out.println(“ ");
}

BatallaNaval.IniciarJuego(„Philip“, tableroMio, true);
ArrayList<int[]> listaTotal = new ArrayList<int[]>();
ArrayList<Integer> listaHay = new ArrayList<Integer>();
Random rand = new Random();

for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {
int[] hit = new int[2];
hit[0] = x;
hit[1] = y;
listaTotal.add(hit);
}
}

while (BatallaNaval.HayUnGanador() == false) {
int[] ubicacion = new int[2];
int[] posi = new int[2];
int strategia = 0;
listaHay.add(0);

for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {

ubicacion[0] = x;
ubicacion[1] = y;

posi[0] = x;
posi[1] = y;
/*
* if (BatallaNaval.HayUnGanador() == true) {
* System.out.println(„Hay un ganador“); } else { System.out
* .println(„Aún no gano ninguno, seguir jugando“); }
*/
BatallaNaval.ProximoTurno();

ubicacion = random(listaTotal, ubicacion);
strategia = strategia + 1;

estrategia(listaTotal, listaHay, rand, strategia, ubicacion, posi);

int hay = BatallaNaval.QueHayEn(ubicacion[0], ubicacion[1]);
listaHay.add(hay);

int[] pos = BatallaNaval.PreguntarPosicion();

BatallaNaval.RespuestaPosicion(pos, hay);

// BatallaNaval.ImprimirResultado();
}
}
}

BatallaNaval.ImprimirResultado();

}

public static int[] random(ArrayList<int[]> listaTotal, int[] ubicacion) {

Random rnd = new Random();
int k = rnd.nextInt(listaTotal.size());
ubicacion = listaTotal.get(k);
System.out.println("----- " + listaTotal.size());
System.out.println("----random eliminar (" + ubicacion[0] + „,“

  • ubicacion[1] + „)“);
    listaTotal.remove(k);
    return ubicacion;

}

private static int[] estrategia(ArrayList<int[]> listaTotal,
ArrayList<Integer> listaHay, Random rand, int strategia,
int[] ubicacion, int[] posi) {
ArrayList<int[]> listaHit = new ArrayList<int[]>();

ArrayList<int[]> listaRandHit = new ArrayList<int[]>();

for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {
int[] hit = new int[2];

// strategia = 0;

if (strategia == 1) {// Strategia 1
if ((listaHay.get(listaHay.size() - 1)) == 1) {
listaHit.get(listaHit.size() - 1);
listaHit.add(hit);
listaRandHit.add(hit);
strategia = 1;
for (int i = 0; i < listaTotal.size(); i++) {
if (ubicacion[0] == listaTotal.get(i)[0]
&& ubicacion[1] == listaTotal.get(i)[1]) {
System.out.println("----" + strategia

  • " eliminar (" + ubicacion[0] + „,“
  • ubicacion[1] + „)“);
    listaTotal.remove(i);
    }
    }
    if (ubicacion[0] > 9) {
    listaHit.get(listaHit.size() - 1);
    ubicacion[0] = ubicacion[0] + 1;
    strategia = 2;

for (int i = 0; i < listaTotal.size(); i++) {
if (posi[0] == listaTotal.get(i)[0]
&& posi[1] == listaTotal.get(i)[1] + 1) {
listaTotal.remove(i);
System.out.println("----" + strategia

  • " eliminar (" + ubicacion[0]
  • „,“ + ubicacion[1] + „)“);

if (posi[0] == listaTotal.get(i)[0]
&& posi[1] == listaTotal.get(i)[1] - 1) {
System.out.println("----" + strategia

  • " eliminar (" + ubicacion[0]
  • „,“ + ubicacion[1] + „)“);
    listaTotal.remove(i);
    }
    }
    }
    } else {
    strategia = 1;
    }
    } else {
    random(listaTotal, ubicacion);
    }
    }
    if (strategia == 2) {
    if ((listaHay.get(listaHay.size() - 1)) == 1) {
    listaHit.get(listaHit.size() - 1);
    listaHit.add(hit);
    strategia = 2;
    for (int i = 0; i < listaTotal.size(); i++) {
    if (ubicacion[0] == listaTotal.get(i)[0]
    && ubicacion[1] == listaTotal.get(i)[1]) {
    listaTotal.remove(i);
    System.out.println("----" + strategia
  • " eliminar (" + ubicacion[0] + „,“
  • ubicacion[1] + „)“);
    }

}

if (ubicacion[0] < 0) {
listaHit.get(listaHit.size() - 1);
ubicacion[0] = ubicacion[0] - 1;
strategia = 3;
} else {
strategia = 2;
}

} else {
strategia = 3;
}
}

if (strategia == 3) {
if ((listaHay.get(listaHay.size() - 1)) == 1) {
listaHit.get(listaHit.size() - 1);
listaHit.add(hit);
strategia = 3;
for (int i = 0; i < listaTotal.size(); i++) {
if (ubicacion[0] == listaTotal.get(i)[0]
&& ubicacion[1] == listaTotal.get(i)[1]) {
listaTotal.remove(i);
System.out.println("----" + strategia

  • " eliminar (" + ubicacion[0] + „,“
  • ubicacion[1] + „)“);
    }
    }
    if (ubicacion[1] > 10) {
    listaHit.get(listaHit.size() - 1);
    ubicacion[1] = ubicacion[1] + 1;
    strategia = 4;
    } else {
    strategia = 3;
    }
    } else {
    strategia = 4;
    }
    }

if (strategia == 4) {
if ((listaHay.get(listaHay.size() - 1)) == 1) {
listaHit.get(listaHit.size() - 1);
listaHit.add(hit);
strategia = 4;
for (int i = 0; i < listaTotal.size(); i++) {
if (ubicacion[0] == listaTotal.get(i)[0]
&& ubicacion[1] == listaTotal.get(i)[1]) {
listaTotal.remove(i);
System.out.println("----" + strategia

  • " eliminar (" + ubicacion[0] + „,“
  • ubicacion[1] + „)“);
    }
    }

if (ubicacion[1] < 0) {
listaHit.get(listaHit.size() - 1);
ubicacion[1] = ubicacion[1] - 1;
strategia = 4;
} else {
strategia = 3;
}
} else {
random(listaTotal, ubicacion);
}
}
}
}
return ubicacion;
}
}

Dies ist mein Programm, aber irgendwie funktioniert das nicht.
Das was in Fett ist zeigt mein Programm an das da was nicht stimmt
und es sagt „bound must be positive“ was heisst das genau?
Könnt ihr mir bitte helfen?

kannst du das ganze irgendwo hinpacken, das man sich das als datei runter laden kann ,
so ist mir da viel zu viel arbeit :frowning:(

https://www.dropbox.com/sh/vjyrk2k6ezwxxkr/AAAnSBTpL…

Das ist das ganze Projekt. Unter „lip“ ist das das Programm vom Prof. Kann sein, das du das zuerst importieren musst, wenn du mit Eclipse arbeitest.

Hab das einiges verändert und dies ist die neue DropBox.
https://www.dropbox.com/sh/vjyrk2k6ezwxxkr/AAAnSBTpL…
Und ich hab das problem, das meiner zwei mal hintereinander schiesst.
wie umgehe ich das??

ich bin da doch eher für dokumentation , so
hab ich echt keine ahnung was wo abläuft ,
und mein spanish ist auch nicht das beste .

ich würde dir echt empfehlen dem Grundsatz zu folgen .
Ein Programm ist nur so gut wie seine Dokumentation :smile: !