i have a code that runs, but it only lets the player to guess where the ships are(which is a one
player game with one board). is there a way some one can help turn this game into a player vs
computer game (with two boards one for player and one for computer) Please help me.
BattleShipGame.java
package battleship;
import java.util.ArrayList;
import java.util.Scanner;
public class BattleshipGame {
private Ocean ocean;
private boolean[][] availableSpot;
private Scanner sc;
public BattleshipGame() {
// define a new ocean and a new 2D array to store available coordinates
ocean = new Ocean();
availableSpot = new boolean[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++){
availableSpot[i][j] = true;
}
}
}
/**
* prints the game menu and info
* //param select
*/
public void print(int select){
String info;
switch (select) {
case 1: info = \"Welcome to the World of Battleship!\";
break;
case 2: info = \"Enter coordinates to fire: \";
break;
case 3: info = \"Shots fired: \"+ocean.getShotsFired()+\", Ships sunk:
\"+ocean.getShipsSunk();
break;
case 4: info = \"Congratulations! You win!\";
break;
case 99: info = \"Invalid input. Please re-enter:\";
break;
case 100: info = \"--------------------------------------------\";
break;
case 101: info = \"\ ============================================\";
break;
default: info = \"Error selection\";
break;
}
System.out.println(info);
}
/**
* check if the input is valid
* //param input
* //return boolean
*/
public boolean checkValidInput(String input){
ArrayList numList = new ArrayList();
for (int i=0;i<10;i++){
numList.add(\"\"+i);
}
String[] coordinates = input.split(\" \");
//returns false if there are not 2 strings
if (coordinates.length!=2){
return false;
}
//returns false if any of the strings is not a single digit number
for (String str: coordinates){
if (numList.contains(str)==false){
return false;
}
}
//returns false if the coordinates have already been shot at
int row = Integer.parseInt(coordinates[0]);
int column = Integer.parseInt(coordinates[1]);
if (this.availableSpot[row][column]==false){
return false;
}
return true;
}
/**
* get the coordinates to shoot at from the String input
* //param input
* //return int[] coordinates
*/
public int[] getCoordinates(String input){
int[] coordinates = new int[2];
String[] strList = input.split(\" \");
int row = Integer.parseInt(strList[0]);
int column = Integer.parseInt(strList[1]);
coordinates[0] = row;
coordinates[1] = column;
return coordinates;
}
/**
* play the battleship game
*/
public void play(){
print(101);
print(1);
ocean.placeAllShipsRandomly();
boolean isGameOver = ocean.isGameOver();
sc = new Scanner(System.in);
//print the ocean and start the game
ocean.print();
print(3);
while (!isGameOver){
print(2);
String input = sc.nextLine();
//check if input is valid
while (!checkValidInput(input)){
print(99);
input = sc.nextLine();
}
//get coordinates and fire
int[] coordinates = getCoordinates(input);
int row = coordinates[0];
int column = coord.
i have a code that runs, but it only lets the player to guess where .pdf
1. i have a code that runs, but it only lets the player to guess where the ships are(which is a one
player game with one board). is there a way some one can help turn this game into a player vs
computer game (with two boards one for player and one for computer) Please help me.
BattleShipGame.java
package battleship;
import java.util.ArrayList;
import java.util.Scanner;
public class BattleshipGame {
private Ocean ocean;
private boolean[][] availableSpot;
private Scanner sc;
public BattleshipGame() {
// define a new ocean and a new 2D array to store available coordinates
ocean = new Ocean();
availableSpot = new boolean[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++){
availableSpot[i][j] = true;
}
}
}
/**
* prints the game menu and info
* //param select
*/
public void print(int select){
String info;
switch (select) {
case 1: info = "Welcome to the World of Battleship!";
break;
case 2: info = "Enter coordinates to fire: ";
break;
case 3: info = "Shots fired: "+ocean.getShotsFired()+", Ships sunk:
"+ocean.getShipsSunk();
break;
2. case 4: info = "Congratulations! You win!";
break;
case 99: info = "Invalid input. Please re-enter:";
break;
case 100: info = "--------------------------------------------";
break;
case 101: info = " ============================================";
break;
default: info = "Error selection";
break;
}
System.out.println(info);
}
/**
* check if the input is valid
* //param input
* //return boolean
*/
public boolean checkValidInput(String input){
ArrayList numList = new ArrayList();
for (int i=0;i<10;i++){
numList.add(""+i);
}
String[] coordinates = input.split(" ");
//returns false if there are not 2 strings
if (coordinates.length!=2){
return false;
}
//returns false if any of the strings is not a single digit number
for (String str: coordinates){
if (numList.contains(str)==false){
return false;
}
}
//returns false if the coordinates have already been shot at
int row = Integer.parseInt(coordinates[0]);
3. int column = Integer.parseInt(coordinates[1]);
if (this.availableSpot[row][column]==false){
return false;
}
return true;
}
/**
* get the coordinates to shoot at from the String input
* //param input
* //return int[] coordinates
*/
public int[] getCoordinates(String input){
int[] coordinates = new int[2];
String[] strList = input.split(" ");
int row = Integer.parseInt(strList[0]);
int column = Integer.parseInt(strList[1]);
coordinates[0] = row;
coordinates[1] = column;
return coordinates;
}
/**
* play the battleship game
*/
public void play(){
print(101);
print(1);
ocean.placeAllShipsRandomly();
boolean isGameOver = ocean.isGameOver();
sc = new Scanner(System.in);
//print the ocean and start the game
ocean.print();
print(3);
while (!isGameOver){
4. print(2);
String input = sc.nextLine();
//check if input is valid
while (!checkValidInput(input)){
print(99);
input = sc.nextLine();
}
//get coordinates and fire
int[] coordinates = getCoordinates(input);
int row = coordinates[0];
int column = coordinates[1];
ocean.shootAt(row, column);
availableSpot[row][column] = false;
isGameOver = ocean.isGameOver();
ocean.print();
print(3);
print(100);
}
//print info saying you win
print(4);
}
public static void main(String[] args) {
BattleshipGame battleshipGame = new BattleshipGame();
battleshipGame.play();
System.out.println("Continue? y/n");
Scanner sc = new Scanner(System.in);
String isPlay = sc.next();
while (isPlay.equals("y")){
battleshipGame = new BattleshipGame();
battleshipGame.play();
System.out.println("Continue? y/n");
isPlay = sc.next();
}
5. sc.close();
}
}
Ocean.java
package battleship;
import java.util.*;
public class Ocean {
private Ship[][] ships;
private int shotsFired;
private int hitCount;
private int shipsSunk;
Random random = new Random();
private boolean[][] shadow;
private Ship battleship;
private Ship cruiser1, cruiser2;
private Ship destroyer1, destroyer2, destroyer3;
private Ship submarine1, submarine2, submarine3, submarine4;
private ArrayList allShips;
//private boolean[][] shotLocations;
public Ocean() {
// TODO Auto-generated constructor stub
battleship = new Battleship();
cruiser1 = new Cruiser();
cruiser2 = new Cruiser();
destroyer1 = new Destroyer();
destroyer2 = new Destroyer();
destroyer3 = new Destroyer();
submarine1 = new Submarine();
submarine2 = new Submarine();
submarine3 = new Submarine();
submarine4 = new Submarine();
allShips = new ArrayList();
allShips.add(battleship);
allShips.add(cruiser1);
allShips.add(cruiser2);
6. allShips.add(destroyer1);
allShips.add(destroyer2);
allShips.add(destroyer3);
allShips.add(submarine1);
allShips.add(submarine2);
allShips.add(submarine3);
allShips.add(submarine4);
ships = new Ship[10][10];
shadow = new boolean[10][10];
//shotLocations = new boolean[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
this.ships[i][j] = new EmptySea();
this.ships[i][j].setBowRow(i);
this.ships[i][j].setBowColumn(j);
this.ships[i][j].setHorizontal(true);
this.shadow[i][j] = false;
//this.shotLocations[i][j] = false;
}
}
this.shotsFired = 0;
this.hitCount = 0;
this.shipsSunk = 0;
}
public void placeAllShipsRandomly() {
int row;
int column;
int trueOrFalse;
for (Ship ship: allShips){
row = (int) (Math.random() * 10);
column = (int) (Math.random() * 10);
trueOrFalse = (int) (Math.random() * 2);
boolean horizontal = false;
if (trueOrFalse == 1) {
horizontal = true;
7. }
else {
horizontal = false;
}
while (!ship.okToPlaceShipAt(row, column, horizontal, this)) {
row = (int) (Math.random() * 10);
column = (int) (Math.random() * 10);
trueOrFalse = (int) (Math.random() * 2);
if (trueOrFalse == 1) {
horizontal = true;
}
else {
horizontal = false;
}
}
ship.placeShipAt(row, column, horizontal, this);
}
}
public boolean isOccupied(int row, int column) {
if (this.ships [row][column].getShipType().equals("empty")) {
return false;
}
return true;
}
public boolean shootAt(int row, int column) {
int hit = 0;
int sunkNum = 0;
if (isOccupied(row, column) && !ships[row][column].isSunk()) {
this.hitCount += 1;
hit = 1;
}
this.shotsFired += 1;
//this.shotLocations[row][column] = true;
this.ships[row][column].shootAt(row, column);
for (Ship ship: this.allShips) {
if (ship.isSunk()){
8. sunkNum += 1;
}
}
this.shipsSunk = sunkNum;
if (hit == 1) {
return true;
}
return false;
}
public int getShotsFired() {
return this.shotsFired;
}
public int getHitCount() {
return this.hitCount;
}
public int getShipsSunk() {
return this.shipsSunk;
}
public boolean isGameOver() {
if (this.shipsSunk == 10) {
return true;
}
return false;
}
public Ship[][] getShipArray() {
return this.ships;
}
public void print() {
String s = " ";
int i;
int j;
for (i = -1; i < 10; i++) {
for (j = -1; j < 10; j++) {
if (i == -1){
if (j > -1){
s += " " + j;
9. }
}
else if (j == -1) {
s += i + " ";
}
else if (!this.isHit(i, j)) {
s += "." + " ";
}
else {
s += ships[i][j].toString() + " ";
}
}
s += " ";
}
System.out.println(s);
}
////////////////////////////////////////////////additional helper functions//////////////////////////
public boolean[][] getShadow() {
return this.shadow;
}
/**
* when put in one ship, shadow all its adjacent sea. Then the okToPrint function can make
judgment and forbid ships to place on the shadow.
*/
public void setShadow() {
for (int i = 0; i < 10 ; i++){
for (int j = 0; j < 10; j++) {
if (this.isOccupied(i,j)) {
for (int k = -1; k < 2; k++) {
for (int l = -1; l <2; l++ ) {
if ((i+k>=0) && (i+k<=9) && (j+l>=0) && (j+l <=9)) {
shadow[i+k][j+l] = true;
}
}
}
10. }
}
}
}
/**
* setter for ship class to place ship in the ocean
* //param row
* //param column
* //param ship
*/
public void placeShip(int row, int column, Ship ship) {
this.ships[row][column] = ship;
//update the shadow(places which don't allow ship to be placed)
this.setShadow();
}
/**
* all ships list getter for testing
* //return
*/
public ArrayList getAllShips() {
return this.allShips;
}
public void printTest() {
String s = " ";
int i;
int j;
for (i = -1; i < 10; i++) {
for (j = -1; j < 10; j++) {
if (i == -1){
if (j > -1){
s += " " + j;
}
}
else if (j == -1) {
s += i + " ";
}
11. else if (!isOccupied(i,j)) {
s += "." + " ";
}
else {
s += ships[i][j].toString() + " ";
}
}
s += " ";
}
System.out.println(s);
}
public boolean isHit(int row, int column) {
Ship ship = this.ships[row][column];
int bowRow = ship.getBowRow();
int bowColumn = ship.getBowColumn();
//System.out.println(row + " " + column + " " + ship + " " + bowRow + " " +
bowColumn + ship.isHorizontal());
if (ship.getShipType().equals("empty")) {
return (ship.getHitArray()[0]);
}
else if (ship.isHorizontal()) {
if (ship.getHitArray()[column - bowColumn]) {
return true;
}
return false;
}
else {
if (ship.getHitArray()[row - bowRow]) {
return true;
}
return false;
}
}
}
12. Ship.java
package battleship;
public abstract class Ship {
private int bowRow;
private int bowColumn;
protected int length;
private boolean horizontal;
protected boolean[] hit = new boolean[4];
public Ship() {
// TODO Auto-generated constructor stub
super();
}
/**
* returns bowRow
* //return bowRow
*/
public int getBowRow() {
return bowRow;
}
public void setBowRow(int bowRow) {
this.bowRow = bowRow;
}
/**
* returns bowColumn
* //return bowColumn
*/
public int getBowColumn() {
return bowColumn;
}
/**
* sets the value of bowColumn
* //param bowColumn
*/
public void setBowColumn(int bowColumn) {
this.bowColumn = bowColumn;
}
13. /**
* returns the length of this particular ship
* //return length of the ship
*/
public int getLength() {
return length;
}
/**
* returns horizontal as boolean
* //return isHorizontal
*/
public boolean isHorizontal() {
return horizontal;
}
/**
* sets the value of instance variable horizontal
* //param horizontal
*/
public void setHorizontal(boolean horizontal) {
this.horizontal = horizontal;
}
abstract String getShipType();
/**
* returns true if it is okay to put a ship of certain length with its bow in this location, with the
given orientation
* returns false otherwise
* //param row
* //param column
* //param horizontal
* //param ocean
* //return okToPlaceShipAt as boolean
*/
public boolean okToPlaceShipAt(int row, int column, boolean horizontal, Ocean ocean){
boolean okToPlace = true;
14. boolean[][] shadows = ocean.getShadow();
if (horizontal){
for (int i=0; i9){okToPlace = false;}
else if (shadows[row][column+i]){okToPlace = false;}
}
}
else{
for (int i=0; i9){okToPlace = false;}
else if (shadows[row+i][column]){okToPlace = false;}
}
}
return okToPlace;
}
/**
* puts the ship on a certain spot in the ocean
* //param row
* //param column
* //param horizontal
* //param ocean
*/
public void placeShipAt(int row, int column, boolean horizontal, Ocean ocean){
this.setHorizontal(horizontal);
this.setBowRow(row);
this.setBowColumn(column);
if (!this.isHorizontal()){
for (int i=0;i
Solution
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*;
import java.io.*; import java.lang.Integer; import java.util.Vector; import java.net.*; public class
Battleship extends JFrame { private static JButton ok = new
JButton("OK"),//closes stats menu done =new
JButton("Done");//closes options menu private static JFrame statistics= new
JFrame("Statistics"),//holds stats options=new
JFrame("Options");//holds opts private static JLabel data,//used for stats menu
title;//used for options menu private static JPanel stats=new
JPanel(),//used for stats menu opts,//used for options menu
15. inputpanel;//for manually inputting ships private static Container
b,c,d;//board and input panel private JPanel input;//input bar private static
JMenuItem m,pvp,pvc,cvc;//menu items private static String[] cletters = {"
","A","B","C","D","E","F","G","H","I","J"}, //array of letters used for combo
boxes cnumbers = {"
","1","2","3","4","5","6","7","8","9","10"}, //array of numbers used for
combo boxes ships =
{"Carrier","Battleship","Submarine","Destroyer", "Patrol
Boat"},//strings used for ship combo box direction =
{"Horizontal","Vertical"},//directions level={"Normal",
"Ridiculously Hard"}, layout={"Manual","Automatic"},
colors={"Cyan", "Green", "Yellow", "Magenta", "Pink", "Red",
"White"}, first={"Player 1", "Player 2",
"Random"};//used for options private JComboBox cshi = new JComboBox(ships),//ships
cdir = new JComboBox(direction);//directions private static
JComboBox aiLevel=new JComboBox(level), shipLayout=new
JComboBox(layout), shipColor=new JComboBox(colors),
playsFirst=new JComboBox(first);//used
//for options menu private JTextField mbar = new JTextField();//message bar
private static int enemy=1, i,j,//counters
length=5, you=0,
prevcolor=0,//index of previous color prevFirst=0,
prevLayout=0, prevLevel=0,//tracks changes in corresponding comboboxes
ready=0, sindex=0,//stores index of array
dindex=0;//direction private static Player players[]=new Player[2]; private static
JButton deploy=new JButton("DEPLOY"); private static int
w=0,a=0,s=0,t=0,e=0;//counters to track the use of all ships private static String[][]
shiphit=new String[10][10]; private static String user,user2; private static Color[]
color={Color.cyan,Color.green,Color.yellow,Color.magenta,
Color.pink, Color.red, Color.white}; private static Object
selectedValue=" ", gametype; private static
BattleshipClient me; private static boolean gameover=false; public Battleship()
{ setTitle("Battleship");
setDefaultCloseOperation(EXIT_ON_CLOSE); setJMenuBar(createMenuBar());
setResizable(false); //gets user to input name
user=JOptionPane.showInputDialog("Enter your name."); int dummy=0;
16. while (((user==null)||(user.equals("")))&&(dummy<3)) {
user=JOptionPane.showInputDialog("You have to input something."); if
((user!=null)&&(!user.equals(""))) dummy=4; else
dummy++; } if (dummy==3) {
JOptionPane.showMessageDialog(null,"Since you're having trouble inp"
+"utting your name, I'll just call you stupid.","",JOptionPane.INFORMATION_MESSAGE);
user="Stupid"; } players[you]=new Player (user);
players[enemy]=new Player ("Computer");
b=getContentPane(); b.add(setBoard(you),BorderLayout.CENTER);
c=getContentPane(); d = getContentPane();
inputpanel=shipinput(); d.add(inputpanel,BorderLayout.NORTH);
pack(); setVisible(true); } public static boolean
getGameOver() { return gameover; } public static void
setGameOver(boolean b) { gameover=b; } //method to
determine who plays first public void whoGoesFirst() { int x=0; if
(playsFirst.getSelectedIndex()!=2) { if
(playsFirst.getSelectedIndex()!=you) flipYou();
players[playsFirst.getSelectedIndex()].getTimer().start();
x=playsFirst.getSelectedIndex(); } else {
int rand=(int)(Math.random()*2);
JOptionPane.showMessageDialog(null,players[rand].getUser()+" will " +"go
first.","",JOptionPane.PLAIN_MESSAGE); if (rand!=you)
flipYou(); players[rand].getTimer().start(); x=rand; }
if
((!players[x].getUser().equals("Computer"))||(!players[x].getUser().equals("CPU1"))||(!players
[x].getUser().equals("CPU2"))) players[x].setMove(true); }
//returns ship color, as selected by the user public static Color getColor() {
return (color[shipColor.getSelectedIndex()]); } //asks if two players
are playing on the same computer or over the web public static boolean isLocal() {
if ((gametype==pvp)&&(selectedValue.equals("Local"))) return true;
else return false; } public static void flipYou() {
if (you==1) { you=0; enemy=1; }
else { you=1; enemy=0; } }
//determines whether or not is shipLayout is set to automatic public static boolean
isAutoSet() { if (shipLayout.getSelectedIndex()==0) return false;
else return true; } //variable that determines whether
17. or not a carrier has been placed public static int getW() { return w;
} //variable that determines whether or not a battleship has been placed public
static int getA() { return a; } //variable that determines
whether or not a submarine has been placed public static int getS() { return s;
} //variable that determines whether or not a destroyer has been placed
public static int getT() { return t; } //variable that determines
whether or not a patrol boat has been placed public static int getE() { return
e; } public static int getReady() { return ready;
} public static JFrame getStatistics() { return statistics; }
public static void setData(JLabel x) { data=x; } public static
JLabel getData() { return data; } public static JPanel getStats()
{ return stats; } public static void setDeploy(boolean k) {
deploy.setEnabled(k); } public static Player getPlayers(int x)
{ return players[x]; } public static String getDirection(int i) {
return direction[i]; } public static String getCletters(int i) {
return cletters[i]; } public static String getShips(int i) {
return ships[i]; } public static String getCnumbers(int i) {
return cnumbers[i]; } public static int getSIndex() { return
sindex; } public static int getDIndex() { return dindex; }
public static int getYou() { return you; } public
static int getEnemy() { return enemy; } public static void
setYou(int x) { you=x; } public static void setEnemy(int x)
{ enemy=x; } //creates Game menu and submenus public
JMenuBar createMenuBar() { JMenu menu;//menu // create the
menu bar JMenuBar menuBar = new JMenuBar(); // build the Game menu
menu = new JMenu("Game"); menuBar.add(menu); m = new
JMenu("New Game"); menu.add(m); //submenu of New
Game GameListener stuff = new GameListener(); pvp = new
JMenuItem("Player vs. Player"); pvp.addActionListener(stuff);
m.add(pvp); pvc = new JMenuItem("Player vs. Computer");
pvc.addActionListener(stuff); m.add(pvc); cvc = new
JMenuItem("Computer vs. Computer"); cvc.addActionListener(stuff);
m.add(cvc); m = new JMenuItem("Rules");
m.addActionListener(new RulesListener()); menu.add(m); m = new
JMenuItem("Statistics"); m.addActionListener(new StatsListener());
menu.add(m); m = new JMenuItem("Options"); m.addActionListener(new
18. OptionsListener()); menu.add(m); m = new JMenuItem("Exit");
m.addActionListener(new ExitListener()); menu.add(m); return
menuBar; } //creates panels that used to place ships public JPanel
shipinput() { input= new JPanel(); mbar.setText("Select a ship, its front
position and direction."); mbar.setFont(new Font("Courier New", Font.BOLD, 14));
mbar.setEditable(false); //input.add(mbar); cshi.setSelectedIndex(0);
cshi.addActionListener(new ShipsListener()); TitledBorder title;//used for
titles around combo boxes title = BorderFactory.createTitledBorder("Ships");
cshi.setBorder(title); input.add(cshi); cdir.setSelectedIndex(0);
cdir.addActionListener(new DirectListener()); input.add(cdir);
title = BorderFactory.createTitledBorder("Direction"); cdir.setBorder(title);
deploy.setEnabled(false); deploy.addActionListener(new DeployListener());
input.add(deploy); return input; } //creates board for manual
ship placement public JPanel setBoard(int n) { players[n].setMyBoard(new
JPanel(new GridLayout(11,11)));//panel to store board JTextField k;
for (i=0;i<11;i++) { for (j=0;j<11;j++)
{ if ((j!=0)&&(i!=0)) {
players[n].getBboard(i-1,j-1).addActionListener(new BoardListener());
players[n].getMyBoard().add(players[n].getBboard(i-1,j-1)); }
if (i==0) {
if (j!=0) { //used to
display row of numbers k= new
JTextField(Battleship.getCnumbers(j)); k.setEditable(false);
k.setHorizontalAlignment((int)JFrame.CENTER_ALIGNMENT);
} else
{ //used to display column of numbers
k= new JTextField(); k.setEditable(false);
}
players[n].getMyBoard().add(k); } else if (j==0)
{ k= new
JTextField(Battleship.getCletters(i)); k.setEditable(false);
k.setHorizontalAlignment((int)JFrame.CENTER_ALIGNMENT);
players[n].getMyBoard().add(k); } }
} return players[n].getMyBoard(); } //creates board and
automatically places ship public JPanel autoBoard(int u,int t) {
players[u].setGBoard(new JPanel(new GridLayout(11,11)));//panel to store board
19. JTextField k; if (!players[u].getUser().equals("Unknown")) for
(i=0;i<5;i++) {
players[u].setBoats(i,players[u].getBoats(i).compinput(i,u)); }
for (i=0;i<11;i++) { for (j=0;j<11;j++) {
if ((j!=0)&&(i!=0)) {
if ((players[u].getUser().equals("Computer"))||(isLocal()))
{
players[u].getBboard(i-1,j-1).addActionListener(new AttackListener());
}
else if
((players[t].getUser().equals("Computer"))||(players[t].getUser().equals("CPU1"))||(players[t].
getUser().equals("CPU2"))||(players[t].getUser().equals("Unknown")))
{ if (players[u].getHitOrMiss(i-1,j-1))
players[u].setBboard(i-1,j-1,getColor());
} else {
players[u].getBboard(i-1,j-1).addActionListener(new InternetListener());
} players[u].getGBoard().add(players[u].getBboard(i-
1,j-1)); } if (i==0)
{ if (j!=0) {
//used to display row of numbers k= new
JTextField(Battleship.getCnumbers(j)); k.setEditable(false);
k.setHorizontalAlignment((int)JFrame.CENTER_ALIGNMENT);
} else
{ //used to display column of numbers
k= new JTextField(); k.setEditable(false);
}
players[u].getGBoard().add(k); } else if (j==0)
{ k= new
JTextField(Battleship.getCletters(i)); k.setEditable(false);
k.setHorizontalAlignment((int)JFrame.CENTER_ALIGNMENT);
players[u].getGBoard().add(k); } }
} return players[u].getGBoard(); }
//Listener for combo boxes used to layout ships private class ShipsListener implements
ActionListener { public void actionPerformed(ActionEvent v) {
sindex=cshi.getSelectedIndex(); if
(players[you].getBoats(sindex)!=null)
20. cdir.setSelectedIndex(players[you].getBoats(sindex).getDirect()); switch (sindex)
{ case 0: length=5; break;
case 1: length=4; break; case 2:
length=3; break; case 3: length=3;
break; case 4: length=2; break;
} if (players[you].getBoats(sindex) != null)
{ Ship boat=new
Ship(ships[sindex],players[you].getBoats(sindex).getDirect()
,length,players[you].getBoats(sindex).getX(),players[you].getBoats(sindex).getY());
players[you].getBoats(sindex).clearship();
players[you].setBoats(sindex,boat);
players[you].getBoats(sindex).placeship(); }
} } //Listener for the Direction
combo box private class DirectListener implements ActionListener {
public void actionPerformed(ActionEvent v) {
dindex = cdir.getSelectedIndex(); if
(players[you].getBoats(sindex) != null) { Ship boat=new
Ship(ships[sindex],dindex,players[you].getBoats(sindex).getLength(),
players[you].getBoats(sindex).getX(),players[you].getBoats(sindex).getY());
players[you].getBoats(sindex).clearship();
players[you].setBoats(sindex,boat);
players[you].getBoats(sindex).placeship(); }
} } //Listener for the buttons on the board
private class BoardListener implements ActionListener { public void
actionPerformed(ActionEvent v) { if (ready==0)
{ if (players[you].getBoats(sindex)!=null)
players[you].getBoats(sindex).clearship(); Object source = v.getSource();
outer: for (i=0;i<10;i++)
{ for (j=0;j<10;j++)
{ if (source==players[you].getBboard(i,j))
{ switch (sindex)
{ case 0: {
if (w==0)
w++;
}
break;
21. case 1: {
if (a==0) a++;
} break;
case 2: {
if (s==0)
s++; }
break; case 3: {
if (t==0)
t++;
}
break; case 4: {
if (e==0)
e++;
} break;
}
players[you].setBoats(sindex,new Ship(ships[sindex],dindex,length,i,j));
break outer;
} } }
players[you].getBoats(sindex).placeship(); }
} } //creates a panel that tells whose board is which private JPanel
whoseBoard() { JPanel panel=new JPanel(new BorderLayout());
panel.add(new JLabel(players[you].getUser()+"'s
Board",SwingConstants.LEFT),BorderLayout.WEST); panel.add(new
JLabel(players[enemy].getUser()+"'s Board",SwingConstants.RIGHT),BorderLayout.EAST);
return panel; } //Listener for exit choice on Game menu private
class ExitListener implements ActionListener { public void
actionPerformed(ActionEvent e) { int r=
JOptionPane.showConfirmDialog(null,"Are you sure you would l" +"ike to exit
Battleship?", "Exit?", JOptionPane.YES_NO_OPTION); if (r==0)
System.exit(0); } } //listener for New Game submenu
private class GameListener implements ActionListener { public void
actionPerformed(ActionEvent e) { int q=
JOptionPane.showConfirmDialog(null,"Are you sure you would l" +"ike to
start a new game?", "New Game?", JOptionPane.YES_NO_OPTION); if
(q==0) { //resets variables
b.removeAll(); c.removeAll(); d.removeAll();
22. you=0; enemy=1;
ready=0; if (players[you].getTimer()!=null)
if (players[you].getTimer().isRunning())
players[you].getTimer().stop(); if (players[enemy].getTimer()!=null)
if (players[enemy].getTimer().isRunning())
players[enemy].getTimer().stop();
gametype = e.getSource();
if (gametype==pvp) { if (!selectedValue.equals("no
server")) { String[] possibleValues = {
"Local", "Online"}; selectedValue =
JOptionPane.showInputDialog(null, "Choose one", "Input",
JOptionPane.INFORMATION_MESSAGE, null, possibleValues,
possibleValues[0]); } if
(!players[you].getUser().equals("CPU1")) {
if (players[you].getUser().equals("Stupid")) {
int w=JOptionPane.showConfirmDialog(null,"Would you"
+" like to try inputting your name again?","",
JOptionPane.YES_NO_OPTION); if
(w==JOptionPane.YES_OPTION) {
user=JOptionPane.showInputDialog("Enter your name.");
int dummy=0; while
(((user==null)||(user.equals("")))&&(dummy<3)) {
user=JOptionPane.showInputDialog("You have to input something.");
if ((user!=null)&&(!user.equals("")))
dummy=4; else
dummy++; }
if (dummy==3) {
JOptionPane.showMessageDialog(null,"Still a"
+"cting stupid. Oh well, we'll run with it."
,"",JOptionPane.INFORMATION_MESSAGE);
user="Stupid"; }
else
JOptionPane.showMessageDialog(null,"That wasn't"
+" so hard now, was it?","YEAH!",
JOptionPane.INFORMATION_MESSAGE);
} }
23. players[you]=new Player (players[you].getUser());
} else
players[you]=new Player (user);
if (selectedValue.equals("Online")) {
players[enemy]=new Player ("Unknown"); if (!isAutoSet())
{
b.add(setBoard(you),BorderLayout.CENTER);
deploy.setEnabled(false);
d.add(inputpanel,BorderLayout.NORTH); }
else {
b.add(autoBoard(you,enemy),BorderLayout.WEST);
c.add(autoBoard(enemy,you),BorderLayout.EAST); ready=1;
} } else
{ //gets user to input name
if((players[enemy].getUser().equals("Computer"))||(players[enemy].getUser().equals("CPU2")
)||(players[enemy].getUser().equals("Unknown"))) {
user2=JOptionPane.showInputDialog("Enter your name.");
while ((user2==null)||(user2.equals("")))
{
user2=JOptionPane.showInputDialog("You have to input something.");
}
} else
user2=players[enemy].getUser(); players[enemy]=new Player
(user2); b.add(autoBoard(you,enemy),BorderLayout.WEST);
c.add(autoBoard(enemy,you),BorderLayout.EAST);
d.add(whoseBoard(),BorderLayout.NORTH);
whoGoesFirst(); ready=1;
} //ready=1; } else if
(gametype==pvc)//Player vs Computer {
if (!players[you].getUser().equals("CPU1")) {
if (players[you].getUser().equals("Stupid"))
{ int w=JOptionPane.showConfirmDialog(null,"Would you"
+" like to try inputting your name again?","",
JOptionPane.YES_NO_OPTION); if
(w==JOptionPane.YES_OPTION) {
user=JOptionPane.showInputDialog("Enter your name.");
24. int dummy=0; while
(((user==null)||(user.equals("")))&&(dummy<3)) {
user=JOptionPane.showInputDialog("You have to input something.");
if ((user!=null)&&(!user.equals("")))
dummy=4; else
dummy++; }
if (dummy==3) {
JOptionPane.showMessageDialog(null,"Still a"
+"cting stupid. Oh well, we'll run with it."
,"",JOptionPane.INFORMATION_MESSAGE);
user="Stupid"; }
else
JOptionPane.showMessageDialog(null,"That wasn't"
+" so hard now, was it?","YEAH!",
JOptionPane.INFORMATION_MESSAGE);
} }
players[you]=new Player (players[you].getUser());
} else
players[you]=new Player (user);
players[enemy]=new Player ("Computer"); if
(!isAutoSet()) {
b.add(setBoard(you),BorderLayout.CENTER);
deploy.setEnabled(false);
d.add(inputpanel,BorderLayout.NORTH); }
else {
b.add(autoBoard(you,enemy),BorderLayout.WEST);
c.add(autoBoard(enemy,you),BorderLayout.EAST); whoGoesFirst
(); } } else if
(gametype==cvc)//Computer vs Computer {
mbar.setText("Battleship Demo");
mbar.setEditable(false);
d.add(mbar,BorderLayout.NORTH); players[you]=new Player
("CPU1"); players[enemy]=new Player ("CPU2");
b.add(autoBoard(you,enemy),BorderLayout.WEST);
c.add(autoBoard(enemy,you),BorderLayout.EAST);
whoGoesFirst(); }
25. pack(); repaint(); }
} } //Listener for Rules menu private class
RulesListener implements ActionListener { public void
actionPerformed(ActionEvent e) { } }
//Listener for ok button in statistics menu private class OkListener implements
ActionListener { public void actionPerformed(ActionEvent e) {
statistics.dispose(); } } //Listener for Stats menu
private class StatsListener implements ActionListener { // public
void setup() { stats=new JPanel();
ok.addActionListener(new OkListener()); statistics.setSize(300,300);
statistics.setResizable(false);
statistics.getContentPane().add(ok,BorderLayout.SOUTH);
//statistics.setLocation(700,200); } public
void actionPerformed(ActionEvent e) { if
(data==null) setup(); else
stats.removeAll(); stats.setLayout(new GridLayout(6,3));
data=new JLabel(""); stats.add(data); data=new
JLabel("Player 1",SwingConstants.CENTER); stats.add(data);
data=new JLabel("Player 2",SwingConstants.CENTER); stats.add(data);
data=new JLabel("Names"); stats.add(data);
if (you == 0) {
data=new JLabel(players[you].getUser(),SwingConstants.CENTER);
stats.add(data); data=new
JLabel(players[enemy].getUser(),SwingConstants.CENTER);
stats.add(data); data=new JLabel("Shots Taken");
stats.add(data); data=new
JLabel(Integer.toString(players[you].getShots()),SwingConstants.CENTER);
stats.add(data); data=new
JLabel(Integer.toString(players[enemy].getShots()),SwingConstants.CENTER);
stats.add(data); data=new JLabel("Hits");
stats.add(data); data=new
JLabel(Integer.toString(players[you].getHits()),SwingConstants.CENTER);
stats.add(data); data=new
JLabel(Integer.toString(players[enemy].getHits()),SwingConstants.CENTER);
stats.add(data); data=new JLabel("Shot Accuracy");
stats.add(data); data=new
27. would l" +"ike to deploy your ships?", "Deploy Ships?",
JOptionPane.YES_NO_OPTION); if (r==0) {
w=0; a=0; s=0; t=0;
e=0; d.remove(input);
b.add(players[you].getMyBoard(),BorderLayout.WEST); ready=1;
c.add(autoBoard(enemy,you),BorderLayout.EAST);
d.add(new JPanel(),BorderLayout.CENTER);
if (!selectedValue.equals("Online"))
whoGoesFirst(); pack();
repaint(); } }
} //Listener for Options menu public class OptionsListener implements ActionListener
{ public void actionPerformed(ActionEvent e) {
if (opts==null) setup(); else
options.setVisible(true); } public
void setup() { opts=new JPanel(new GridLayout(4,2));
title=new JLabel("Computer AI"); opts.add(title);
aiLevel.setSelectedIndex(0); opts.add(aiLevel);
title=new JLabel("Ship Layout"); opts.add(title);
shipLayout.setSelectedIndex(0); opts.add(shipLayout);
title=new JLabel("Ship Color"); opts.add(title);
shipColor.addActionListener(new SColorListener());
shipColor.setSelectedIndex(0); opts.add(shipColor); title=new
JLabel("Who Plays First?"); opts.add(title);
playsFirst.setSelectedIndex(0); opts.add(playsFirst);
options.getContentPane().add(opts,BorderLayout.CENTER);
//options.setSize(600,800); options.setResizable(false);
done.addActionListener(new DoneListener());
options.getContentPane().add(done,BorderLayout.SOUTH);
options.setLocation(200,200); options.pack();
options.setVisible(true); } //Listener for the Colors
combo box private class SColorListener implements ActionListener
{ public void actionPerformed(ActionEvent v) {
for (i=0;i<10;i++) for (j=0;j<10;j++)
{ if
(players[you].getBboard(i,j).getBackground()==color[prevcolor])
players[you].setBboard(i,j,color[shipColor.getSelectedIndex()]);
28. if (players[enemy].getBboard(i,j).getBackground()
==color[prevcolor])
players[enemy].setBboard(i,j,color[shipColor.getSelectedIndex()]);
} prevcolor=shipColor.getSelectedIndex(); } }
//Listener for ok button in statistics menu private class
DoneListener implements ActionListener { public void
actionPerformed(ActionEvent e) { if
((shipLayout.getSelectedIndex()!=prevLayout)||
(aiLevel.getSelectedIndex()!=prevLevel)||
(playsFirst.getSelectedIndex()!=prevFirst)) {
JOptionPane.showMessageDialog(null,"Changes will take"+ " place
at the start of a new game.","" ,JOptionPane.PLAIN_MESSAGE);
if (shipLayout.getSelectedIndex()!=prevLayout)
prevLayout=shipLayout.getSelectedIndex(); if
(playsFirst.getSelectedIndex()!=prevFirst)
prevFirst=playsFirst.getSelectedIndex(); if
(aiLevel.getSelectedIndex()!=prevLevel)
prevLevel=aiLevel.getSelectedIndex(); }
options.dispose(); } } } public static
BattleshipClient getClient() { return me; } public static
void main(String[] args){ Battleship gui= new Battleship();
while (gui.isActive()) { while (selectedValue.equals(" "))
{ } System.out.println("xenophobia");
System.out.println("Object = "+selectedValue); if
(selectedValue.equals("Online")) { selectedValue=" ";
while (ready!=1) { }
try { me=new BattleshipClient();
if (!me.getServerName().equals("invalid")) {
me.sendShips(); while (!gameover)
{ if (!players[you].getMove())
{ try
{ me.listen();
} catch
(IOException e){ System.out.println("Aw naw."); }
} while (players[you].getMove())
{ } me.results();