Boa tarde.
Tenho que fazer o seguinte jogo mais estou com umas pequenas complicações que vou passar a explicar mais à frente:
[list]O Utilizador joga contra o Computador.
O objectivo é apenas afundar os barcos do computador no menor número de tentativas.
Ao contrário de um jogo real de Batalha Naval, o utilizador não coloca os seus barcos.
O computador coloca aleatoriamente 3 barcos de 3 numa grelha 7x7.
O computador pede uma tentativa e o utilizador digita “B3”, “F6”, etc.
O computador responde “Acertou”, “Falhou”, ou “Afundou”.
O jogo termina quando afunda os três barcos.
O utilizador é classificado através do número de tentativas gastas.
Pense que tipos de objectos o programa necessita para realizar o jogo.
Construa um programa usando interacção com o utilizador em modo de texto.
Como melhoramentos pode não contar tentativas em células já atingidas e usar nomes para os barcos.
[/list]
Eu utilizei 3 Classes: Barco, Grelha e a Classe Main TesteBatalhaNaval
Não faço a menor ideia como irei fazer os 3 barcos ocuparem 3 posições cada um na grelha (matriz [7][7]).
Utilizei um código para me gerar aleatoriamente as posições dos 3 barcos nas grelha, mas o problema é que cada barco só ocupa uma coordenada da grelha em vez de ocupar 3 coordenadas como me pede o exercício.
Para já são essas as minhas dúvidas.
Vou deixar aqui o código referente a cada classe que eu criei.
Gostava que me pudessem ajudar.
Obrigado.
Cumprimentos
public class Grelha {
//instância da Classe Grelha
private Object [][]mat = new Object[7][7];
//método para colocar barcos
public Object[][] colocarBarcos(Barco b[]) {
int lin;
int col;
//atribuir aleatoriamente as coordenadas dos barcos
for (int i = 0; i < b.length; i++) {
lin = 0 + (int) (6*Math.random());
col = 0 + (int) (6*Math.random());
mat[lin][col]=b[i];//o mapa recebe um barco aletoriamente colocado
}
return mat;
}
}
public class Barco {
//váriável de classe
//instãncias da Classe Barco
private String nome;
private boolean acerto;
private String coordenadas;
private int estadoDoBarco;
private boolean afundou;
//construtores
public Barco(String nome) {
this.nome = nome;
this.acerto = false;
this.coordenadas = "";
this.estadoDoBarco = 3;
this.afundou = false;
}
//Getter && Setter
public boolean getAcerto() {
return acerto;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCoordenadas(Object[][] mat) {
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[i].length; j++) {
if (mat[i][j] != null) {
coordenadas = converterCoordenadas(i) + j;
}
}
}
return coordenadas;
}
public int getEstadoDoBarco() {
return estadoDoBarco;
}
//métodos
//método para disparar
public String disparar(String coord, Object[][] mapa) {
coord.toUpperCase();//coordenadas por parâmetro
char coord1 = coord.charAt(0);
//conversão das coordenadas para int
switch (coord1) {
case 'A':
coord1 = 0;
break;
case 'B':
coord1 = 1;
break;
case 'C':
coord1 = 2;
break;
case 'D':
coord1 = 3;
break;
case 'E':
coord1 = 4;
break;
case 'F':
coord1 = 5;
break;
case 'G':
coord1 = 6;
break;
default:
String.format("Erro! Coordenada inválida. Coordenada 0 colocada por omissão");
coord1 = 0;
}
int lin = (int)coord1;
int col = (int) coord.charAt(1);
String txt = "";
acerto = verificarDisparo(lin, col, mapa);
if (acerto == true) {
estadoDoBarco--;
txt = String.format("ACERTOU!");
if (estadoDoBarco == 0) {
afundou = true;
txt = String.format("AFUNDOU!");
}
} else {
txt = String.format("FALHOU!");
}
return txt;
}
//método para verificar o disparo
private boolean verificarDisparo(int lin, int col, Object mapa[][]) {
boolean flag = false;
if (mapa[lin][col] != null) {
flag = true;
}
return flag;
}
//método para converter as coordenadas
private String converterCoordenadas(int i) {
String txt="";
switch (i) {
case 0:
txt = "A";
break;
case 1:
txt = "B";
break;
case 2:
txt = "C";
break;
case 3:
txt = "D";
break;
case 4:
txt = "E";
break;
case 5:
txt = "F";
break;
case 6:
txt = "G";
break;
}
return txt;
}
}
import javax.swing.JOptionPane;
public class TesteBatalhaNaval {
public static void main(String[] args) {
//instância de um vector de três barcos
Barco vec[] = new Barco[3];
//instância da Classe Grelha
Grelha g1 = new Grelha();
//mapa onde serão colocados os barcos aleatóriamente
Object mapa[][] = new Object[7][7];
//instânciação de 3 barcos da Classe Barco
Barco b1 = new Barco("E.U.A.");
Barco b2 = new Barco("AFEGANISTÃO");
Barco b3 = new Barco("VENEZUELA");
vec[0] = b1;
vec[1] = b2;
vec[2] = b3;
int numTentativas = 0;
mapa = g1.colocarBarcos(vec);//mapa com os barcos colocados aleatóriamente
String finalizar = "";
while ((vec[0].getEstadoDoBarco() > 0 && vec[1].getEstadoDoBarco() > 0 && vec[2].getEstadoDoBarco() > 0) || finalizar.equalsIgnoreCase("F")) {
String coordenadas = JOptionPane.showInputDialog("Digite as coordenadas do alvo a abater: ");
numTentativas++;
for (int i = 0; i < mapa.length; i++) {
if (vec[i].getEstadoDoBarco() > 0) {
JOptionPane.showMessageDialog(null, vec[i].disparar(coordenadas, mapa), "\nNúmero de tentativas utilizadas: %d", numTentativas);
}
}
finalizar = JOptionPane.showInputDialog("Deseja tentar novamente ou continuar a jogar?\nT - Tentar Novamente\nF - Finalizar Jogo");
if (finalizar.equalsIgnoreCase("F")) {
JOptionPane.showMessageDialog(null, "Jogo finalizado!\n"
+ "Coordenadas dos barcos: "
+ vec[0].getNome() + " Coordenadas: " + vec[0].getCoordenadas(mapa)
+ vec[2].getNome() + " Coordenadas: " + vec[1].getCoordenadas(mapa)
+ vec[2].getNome() + " Coordenadas: " + vec[2].getCoordenadas(mapa));
}
}
}
}
Quase me esquecia, quando mando correr o programa ele pede para eu inserir uma coordenada e eu insiro por exemplo A1 e ele gera o seguinte erro:
[list]run:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 49
at Barco.verificarDisparo(Barco.java:102)
at Barco.disparar(Barco.java:85)
at TesteBatalhaNaval.main(TesteBatalhaNaval.java:35)
Java Result: 1
BUILD SUCCESSFUL (total time: 6 seconds)[/list]


