i have a code that runs but it only lets the player to guess
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<String> numList = new ArrayList<String>();
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 = 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();
}
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<Ship> 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<Ship>();
allShips.add(battleship);
allShips.add(cruiser1);
allShips.add(cruiser2);
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;
}
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()){
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;
}
}
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;
}
}
}
}
}
}
}
/**
* 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<Ship> 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 + \" \";
}
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;
}
}
}
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;
}
/**
* 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;
boolean[][] shadows = ocean.getShadow();
if (horizontal){
for (int i=0; i<this.getLength();i++){
if (column+i>9){okToPlace = false;}
else if (shadows[row][column+i]){okToPlace = false;}
}
}
else{
for (int i=0; i<this.getLength();i++){
if (row+i>9){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<this.getLength();i++){
ocean.placeShip(row+i, column, this);
}
}
else{
for (int i=0;i<this.getLength();i++){
ocean.placeShip(row, column+i, this);
}
}
}
/**
* returns true if the ship is hit and not sunk. marks that part of the ship as \"hit\"
* returns false otherwise
* //param row
* //param column
* //return shootAt as boolean
*/
public boolean shootAt(int row, int column){
if (this.isHorizontal()){
for (int i=0; i<this.getLength();i++){
if ((this.getBowRow() == row)&&(this.getBowColumn()+i==column)){
this.hit[i] = true;
return true;
}
}
}
else{
for (int i=0; i<this.getLength();i++){
if ((this.getBowRow()+i == row)&&(this.getBowColumn()==column)){
this.hit[i] = true;
return true;
}
}
}
return false;
}
/**
* returns the boolean[] that shows which part of the ship is hit
* //return this.hit
*/
public boolean[] getHitArray(){
return this.hit;
}
/**
* returns true if every part of the ship has been hit
* //return isSunk
*/
public boolean isSunk(){
boolean isSunk = true;
for (int i=0;i<this.getLength();i++){
isSunk = isSunk&&this.hit[i];
}
return isSunk;
}
/**
* returns a single-char String to be used in the class \'Ocean\'
* \"x\" if sunk, \"S\" if not sunk
*/
//Override
public String toString(){
if (this.isSunk()){
return \"x\";
}
return \"S\";
}
}
Battleship.java
package battleship;
public class Battleship extends Ship{
public Battleship() {
// TODO Auto-generated constructor stub
super();
this.length = 4;
}
//Override
public String getShipType(){
return \"battleship\";
}
}
Cruiser.java
package battleship;
public class Cruiser extends Ship{
public Cruiser() {
// TODO Auto-generated constructor stub
super();
this.length = 3;
}
//Override
public String getShipType(){
return \"cruiser\";
}
}
Destroyer.java
package battleship;
public class Destroyer extends Ship{
public Destroyer() {
// TODO Auto-generated constructor stub
this.length = 2;
}
//Override
public String getShipType(){
return \"destroyer\";
}
}
Submarine.java
package battleship;
public class Submarine extends Ship{
public Submarine() {
// TODO Auto-generated constructor stub
this.length = 1;
}
//Override
public String getShipType(){
return \"submarine\";
}
}
EmptySea.java
package battleship;
public class EmptySea extends Ship{
public EmptySea() {
// TODO Auto-generated constructor stub
super();
this.length = 1;
}
//Override
public boolean shootAt(int row, int column){
this.hit[0] = true;
return false;
}
//Override
public boolean isSunk(){
return false;
}
//Override
public String toString(){
return \"-\";
}
//Override
String getShipType(){
return \"empty\";
}
}
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 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; 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 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 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 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) 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; 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(); 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); } } 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.\"); 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(); } 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 JLabel(players[you].getAcc(),SwingConstants.CENTER); stats.add(data); data=new JLabel(players[enemy].getAcc(),SwingConstants.CENTER); stats.add(data); data=new JLabel(\"Ships Left\"); stats.add(data); data=new JLabel(Integer.toString(players[you].getShipsLeft()),SwingConstants.CENTER); stats.add(data); data=new JLabel(Integer.toString(players[enemy].getShipsLeft()),SwingConstants.CENTER); stats.add(data); } else { data=new JLabel(players[enemy].getUser(),SwingConstants.CENTER); stats.add(data); data=new JLabel(players[you].getUser(),SwingConstants.CENTER); stats.add(data); data=new JLabel(\"Shots Taken\"); stats.add(data); data=new JLabel(Integer.toString(players[enemy].getShots()),SwingConstants.CENTER); stats.add(data); data=new JLabel(Integer.toString(players[you].getShots()),SwingConstants.CENTER); stats.add(data); data=new JLabel(\"Hits\"); stats.add(data); data=new JLabel(Integer.toString(players[enemy].getHits()),SwingConstants.CENTER); stats.add(data); data=new JLabel(Integer.toString(players[you].getHits()),SwingConstants.CENTER); stats.add(data); data=new JLabel(\"Shot Accuracy\"); stats.add(data); data=new JLabel(players[enemy].getAcc(),SwingConstants.CENTER); stats.add(data); data=new JLabel(players[you].getAcc(),SwingConstants.CENTER); stats.add(data); data=new JLabel(\"Ships Left\"); stats.add(data); data=new JLabel(Integer.toString(players[enemy].getShipsLeft()),SwingConstants.CENTER); stats.add(data); data=new JLabel(Integer.toString(players[you].getShipsLeft()),SwingConstants.CENTER); stats.add(data); } statistics.getContentPane().add(stats); statistics.pack(); statistics.setVisible(true); } } //Listener for Deploy Button private class DeployListener implements ActionListener { public void actionPerformed(ActionEvent v) { int r= JOptionPane.showConfirmDialog(null,\"Are you sure you 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()]); 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(); } } else { b.removeAll(); c.removeAll(); d.removeAll(); players[you]=new Player (user); players[enemy]=new Player (\"Computer\"); b.add(gui.setBoard(you),BorderLayout.CENTER); inputpanel=gui.shipinput(); d.add(inputpanel,BorderLayout.NORTH); gui.pack(); gui.repaint(); } } catch (IOException e) { System.out.println(\"You Suck\"); } } } //System.out.println(\"okay\"); } } /*http://java.sun.com/docs/books/tutorial/uiswing/learn/example1.html http://java.sun.com/docs/books/tutorial/uiswing/events/actionlistener.html http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JMenuItem.html http://java.sun.com/j2se/1.4.2/docs/api/ http://www.cs.princeton.edu/introcs/home/ http://java.sun.com/docs/books/tutorial/networking/overview/index.html JLabels? http://www.hasbro.com/common/instruct/BattleshipAdvancedMission.pdf http://java.sun.com/docs/books/tutorial/uiswing/misc/dnd.html http://java.sun.com/docs/books/tutorial/essential/threads/lifecycle.html synchronization and threads.*/














