385 lines
8.2 KiB
Java
385 lines
8.2 KiB
Java
import java.util.Random;
|
|
public class Battleship{
|
|
/************************
|
|
y UND Y SIND LOGISCH VERTAUSCHT
|
|
************************/
|
|
public Battleship(){
|
|
|
|
//Spielfeld Speiler
|
|
|
|
char x = 97;
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
//Kopfzeile
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.print("\t\t");
|
|
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.println();
|
|
|
|
|
|
//Spiefeld
|
|
for (i = 0; i < spielfeld.length; i++) {
|
|
|
|
//Ausgabe 1. Spielfeld
|
|
for ( j = 0; j < spielfeld[i].length; j++) {
|
|
|
|
spielfeld[i][j] = '~';
|
|
if ((j == 0 || j == 11) && i < 10){
|
|
spielfeld[i][j] = x;
|
|
|
|
}
|
|
|
|
|
|
System.out.print(spielfeld[i][j] + " ");
|
|
}
|
|
// Computerfeld
|
|
System.out.print("\t\t");
|
|
for ( j = 0; j < cspielfeld[i].length; j++) {
|
|
|
|
cspielfeld[i][j] = '~';
|
|
|
|
// Seitenspalten
|
|
if ((j == 0 || j == 11) && i < 10){
|
|
cspielfeld[i][j] = x;
|
|
}
|
|
|
|
System.out.print(cspielfeld[i][j] + " ");
|
|
}
|
|
|
|
System.out.println();
|
|
x++;
|
|
}
|
|
//Fußzeile
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
|
|
System.out.print("\t\t");
|
|
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.println("\n");}
|
|
public enum Ship{
|
|
Speedboat(1,4),
|
|
Yacht(2,3),
|
|
Fregatte(3,2),
|
|
Kreuzer(4,1);
|
|
|
|
private final int size;
|
|
private int count;
|
|
private int lives;
|
|
|
|
|
|
Ship(int size, int count){
|
|
this.size = size;
|
|
this.lives = size;
|
|
this.count = count;
|
|
}
|
|
|
|
public void hit() {this.lives--;}
|
|
public int getCount() {return count;}
|
|
public void redCount() {this.count-- ;}
|
|
public int getSize() { return size; }
|
|
public void sink(){
|
|
if (this.lives == 0){
|
|
System.out.println("Schiff versenkt!");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
Ship [][] ankert = new Ship[10][12];
|
|
|
|
//Zeile Spalte
|
|
char [][] spielfeld = new char [10][12];
|
|
char [][] cspielfeld = new char [10][12];
|
|
|
|
String[] kopfzeile = {" ", "1","2","3","4","5","6","7","8","9","10"," "};
|
|
|
|
public void ausgabe(){
|
|
|
|
char x = 97;
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
//Kopfzeile
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.print("\t\t");
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.println();
|
|
//Spielfeld mit Rand
|
|
|
|
//Spiefeld
|
|
for (i = 0; i < spielfeld.length; i++) {
|
|
|
|
//Ausgabe 1. Spielfeld
|
|
for ( j = 0; j < spielfeld[i].length; j++) {
|
|
|
|
//spielfeld[i][j] = '~';
|
|
if ((j == 0 || j == 11) && i < 10){
|
|
spielfeld[i][j] = x;
|
|
|
|
}
|
|
|
|
|
|
System.out.print(spielfeld[i][j] + " ");
|
|
}
|
|
//Ausgabe 2. Spiefeld
|
|
System.out.print("\t\t");
|
|
for ( j = 0; j < cspielfeld[i].length; j++) {
|
|
|
|
//cspielfeld[i][j] = '~';
|
|
|
|
// Seitenspalten
|
|
if ((j == 0 || j == 11) && i < 10){
|
|
cspielfeld[i][j] = x;
|
|
}
|
|
|
|
System.out.print(cspielfeld[i][j] + " ");
|
|
}
|
|
System.out.println();
|
|
x++;
|
|
}
|
|
|
|
//Fußzeile
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
|
|
System.out.print("\t\t");
|
|
|
|
for (j = 0; j < kopfzeile.length; j++){
|
|
System.out.print(kopfzeile[j] + " ");
|
|
}
|
|
System.out.println("\n");
|
|
}
|
|
|
|
|
|
public void place(Ship s, char a, int x, boolean horiz){
|
|
int i = 0;
|
|
int y = (int) a - 97;
|
|
|
|
|
|
if (!canPlace( s, a, x, horiz)){System.out.print("Platzieren nicht möglich\n ");}
|
|
|
|
else{
|
|
|
|
// Schiff platzieren
|
|
if (horiz){
|
|
for (i = 0; i < s.getSize(); i++){
|
|
spielfeld[y][x+i] = '<';
|
|
ankert[y][x+i] = s;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; i < s.getSize(); i++){
|
|
spielfeld[y+i][x] = 'V';
|
|
ankert[y][x+i] = s;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*public boolean canPlace(Ship s, char a, int x, boolean horiz){
|
|
|
|
|
|
int y = (int) a - 97;
|
|
|
|
|
|
for (int i = y - 1; i <= y +s.getSize(); i++){ // -1 +1 wegen Rand
|
|
for (int j = x - 1; j <= x + 1; j++){
|
|
|
|
//Checken ob rand
|
|
if (i < 0 || i >= spielfeld.length ||
|
|
j < 0 || j >= spielfeld[i].length) {
|
|
continue;
|
|
}
|
|
|
|
if (spielfeld[i][j] != '~'){return false;}
|
|
}
|
|
}
|
|
|
|
if (!horiz && y + s.getSize()-1 <= spielfeld.length) // vertikal
|
|
{
|
|
for (int i = y - 1; i <= y +s.getSize(); i++){ // -1 +1 wegen Rand
|
|
for (int j = x - 1; j <= x + 1; j++){
|
|
|
|
//Checken ob rand
|
|
if (i < 0 || i >= spielfeld.length ||
|
|
j < 0 || j >= spielfeld[i].length) {
|
|
continue;
|
|
}
|
|
|
|
if (spielfeld[i][j] != '~'){return false;}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < s.getSize(); i++)
|
|
{
|
|
if(spielfeld[y+i][x] != '~')
|
|
{
|
|
System.out.println("Passd Ned");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (horiz && x + s.getSize()-1 <= spielfeld[0].length-2) //horizontal
|
|
{
|
|
for (int i = y - 1; i <= y +1; i++){ // -1 +1 wegen Rand
|
|
for (int j = x - 1; j <= x + s.getSize(); j++){
|
|
|
|
//Checken ob Rand
|
|
if (i < 0 || i >= spielfeld.length ||
|
|
j < 0 || j >= spielfeld[i].length) {
|
|
continue;
|
|
}
|
|
//Checken ob Schiff
|
|
if (spielfeld[i][j] != '~'){return false;}
|
|
}
|
|
}
|
|
//Checken ob Wasser
|
|
for (int i = 0; i < s.getSize(); i++)
|
|
{
|
|
if(spielfeld[y][x+i] != '~')
|
|
{
|
|
System.out.println("Passd Ned");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|
|
s.redCount();
|
|
return true;
|
|
}
|
|
*/
|
|
/*
|
|
public boolean canPlace(Ship s, char a, int x, boolean horiz) {
|
|
int y = (int) a - 96;
|
|
|
|
if (!horiz) { // vertikal
|
|
if (y + s.getSize() - 1 >= spielfeld.length) return false;
|
|
|
|
for (int i = y - 1; i <= y + s.getSize(); i++) {
|
|
for (int j = x - 1; j <= x + 1; j++) {
|
|
if (i < 0 || i >= spielfeld.length ||
|
|
j < 0 || j >= spielfeld[i].length) {
|
|
continue;
|
|
}
|
|
|
|
if (spielfeld[i][j] != '~') return false;
|
|
}
|
|
}
|
|
} else { // horizontal
|
|
if (x + s.getSize() - 1 >= spielfeld[0].length) return false;
|
|
|
|
for (int i = y - 1; i <= y + 1; i++) {
|
|
for (int j = x; j <= x + s.getSize(); j++) {
|
|
if (i < 0 || i >= spielfeld.length ||
|
|
j < 0 || j >= spielfeld[i].length-2) continue;
|
|
|
|
if (spielfeld[i][j] != '~') return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
*/
|
|
|
|
public boolean canPlace(Ship s, char a, int x, boolean horiz) {
|
|
int y = (int) a - 96; // a→0, b→1, ...
|
|
|
|
if (horiz) {
|
|
//passt ins Feld?
|
|
System.out.println("311");
|
|
if (x + s.getSize() - 1 >= spielfeld[0].length) return false;
|
|
|
|
/// Nachbarfelder
|
|
//if (a == 'a') ehemalig for (int i = y - 1; i <= y + 1; i++)
|
|
System.out.println("316");
|
|
if (y == 0){
|
|
for (int i = y; i <= y +1; i++) {
|
|
for (int j = x - 1; j <= x + s.getSize(); j++) {
|
|
if(spielfeld[i][j] == 'V') return false;
|
|
if(spielfeld[i][j] == '<') return false;
|
|
|
|
}
|
|
}
|
|
}
|
|
else if (y == 9){
|
|
for (int i = y - 1; i <= y; i++) {
|
|
for (int j = x - 1; j <= x + s.getSize(); j++) {
|
|
if(spielfeld[i][j] == 'V') return false;
|
|
if(spielfeld[i][j] == '<') return false;
|
|
|
|
else { i=0;
|
|
j=0;
|
|
for ( i = y - 1; i <= y + 1; i++) {
|
|
for ( j = x - 1; j <= x + s.getSize(); j++) {
|
|
if(spielfeld[i][j] == 'V') return false;
|
|
if(spielfeld[i][j] == '<') return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(!horiz) { // vertikal
|
|
System.out.println("326");
|
|
if (y + s.getSize() - 1 >= spielfeld.length) return false;
|
|
|
|
// Nachbarbereich: Zeilen y-1..y+size, Spalten x-1..x+1
|
|
|
|
for (int i = y - 1; i <= y + s.getSize(); i++) {
|
|
for (int j = x - 1; j <= x + 1; j++) {
|
|
|
|
if (spielfeld[i][j] == 'V') return false;
|
|
if(spielfeld[i][j] == '<') return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
public void shoot(char a, int x){
|
|
|
|
int y = (int) a - 97;
|
|
|
|
if (cspielfeld[y][x] == '~'){ //Miss
|
|
cspielfeld[y][x] = '0';
|
|
}
|
|
|
|
else if (cspielfeld[y][x] != 'y'){ // Hit
|
|
cspielfeld[y][x] = 'y';
|
|
ankert[y][x].hit();
|
|
ankert[y][x].sink();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|