Reputation: 1
I'm trying to program a battleship game, and using an if statement to call the class BatShip3, which will generate two JFrames with clickable grids for battleship placement. I've tried implementing my code two times in the method, generating new variables for each one, but I can't seem to figure out what's going wrong. When i select the game mode, it creates both windows, giving them both black backgrounds, but the second one doesn't have a grid on it. Any Pointers?
package batship2;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author William
*/
public class BatShip3 extends JFrame implements ActionListener{
public JButton buttons [][] = new JButton [100][100];
public JPanel panel;
public JButton clicks [][] = new JButton [100][100];
public JPanel canvas;
Container contentArea = getContentPane ();
Container contentArea2 = getContentPane ();
public void BatShip3(){
JFrame window1 = new JFrame("Window 1");{
setSize (800, 600);
setVisible (true);
setBackground (Color.black);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
GridLayout experimentLayout = new GridLayout(100, 100);
panel.setLayout (experimentLayout);
panel.setBackground(Color.black);
for(int rows = 0; rows <100 ; rows++){
for(int cols = 0; cols < 100 ; cols++){
buttons [rows][cols] = new JButton ();
buttons [rows][cols].setBackground(Color.blue);
buttons [rows][cols].addActionListener(this);
panel.add(buttons [rows][cols]);
}
}
contentArea.add(panel);
window1.setContentPane(contentArea);
}
JFrame window2 = new JFrame("Window 2");{
window2.setSize (800, 600);
window2.setVisible (true);
window2.setBackground (Color.black);
window2.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
canvas = new JPanel();
GridLayout experimentLayout2 = new GridLayout(100, 100);
canvas.setLayout (experimentLayout2);
canvas.setBackground(Color.black);
for(int rows1 = 0; rows1 <100 ; rows1++){
for(int cols1 = 0; cols1 < 100 ; cols1++){
clicks [rows1][cols1] = new JButton ();
clicks [rows1][cols1].setBackground(Color.blue);
clicks [rows1][cols1].addActionListener(this);
canvas.add(clicks [rows1][cols1]);
}
}
contentArea2.add(canvas);
window2.setContentPane(contentArea2);
}
}
public void actionPerformed(ActionEvent ev){
for(int rows = 0; rows < 100 ; rows++){
for(int cols = 0 ; cols < 100 ; cols++){
if(ev.getSource() == buttons [rows][cols]){
buttons[rows][cols].setBackground(Color.green);
}
}
}
for(int rows1 = 0; rows1 < 100 ; rows1++){
for(int cols1 = 0 ; cols1 < 100 ; cols1++){
if(ev.getSource() == clicks [rows1][cols1]){
clicks[rows1][cols1].setBackground(Color.green);
}
}
}
}}
Upvotes: 0
Views: 530
Reputation: 51553
Define model classes that describe a Battleship game. Here's what I thought of after a few minutes.
package com.ggl.battleship.model;
import java.util.List;
public class BattleshipGame {
private int numberOfPlayers;
private int widthOfBattleshipGrid;
private List<BattleshipGrid> grids;
}
.
package com.ggl.battleship.model;
import java.util.List;
public class BattleshipGrid {
private List<Ship> ships;
private Cell[][] grid;
}
.
package com.ggl.battleship.model;
import java.awt.Point;
import java.util.List;
public class Ship {
private int length;
private String name;
private List<Point> cellLocations;
}
.
package com.ggl.battleship.model;
import java.awt.Point;
public class Cell {
private boolean isHit;
private Point coordinates;
}
You can create all the appropriate getters, setters, and drawing methods.
Define one or more view classes that creates a JFrame and a JPanel. The JPanel draws the model classes.
Create one instance of the JFrame view class for player 1, and another instance for player 2.
Upvotes: 1