Battleship
<< StoryTextApplet | FinalProjectsTrailIndex | SimpleGameTutorial >>
Cell.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
public class Cell
{
private Color color;
private Rectangle r;
private boolean hit,selected;
private String location;
public final String rows="ABCDEFGHIJ";
public Cell(int row, int col, int x, int y, int size){
r = new Rectangle(x,y,size, size);
setColor(Color.CYAN);
setLocation(rows.substring(row, row+1)+"-"+(col+1));
}
public void draw(Graphics g){
g.setColor(Color.BLACK);
if (isSelected())
g.setColor(Color.MAGENTA);
g.fillRect(r.x, r.y, r.width, r.height);
g.setColor(color);
g.fillRect(r.x+4, r.y+4, r.width-8, r.height-8);
if (isHit()){
g.setColor(Color.RED);
int s=r.width/4;
g.fillOval(r.x+s, r.y+s, 2*s, 2*s);
}
}
public boolean contains(int x, int y){
return r.contains(x, y);
}
public boolean isHit() {
return hit;
}
public void setHit(boolean hit) {
this.hit = hit;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Color getColor(){
return color;
}
public void setColor(Color c){
color=c;
}
}
Battleship.java
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class BattleShip extends Applet implements MouseListener, MouseMotionListener
{
private Cell[][] board;
private String message;
private Image screen2;
private Graphics g2;
public void init(){
addMouseListener(this);
addMouseMotionListener(this);
screen2 = createImage(800,600);
g2 = screen2.getGraphics();
message="Battleship";
board = new Cell[10][10];
for (int r=0; r<10;r++)
for (int c=0; c<10; c++){
board[r][c]=new Cell(r,c, 70+c*50, 80+r*50, 50);
}
}
public void paint(Graphics g){
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, 800, 600);
for (int r=0; r<10;r++)
for (int c=0; c<10; c++){
board[r][c].draw(g2);
}
g2.setColor(Color.BLACK);
g2.drawString(message, 20, 50);
g.drawImage(screen2, 0,0,this);
}
public void update(Graphics g){
paint(g); //get rid of flicker with this method
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {
int x=e.getX();
int y=e.getY();
for (int r=0; r<10;r++)
for (int c=0; c<10; c++){
if(board[r][c].contains(x, y)){
board[r][c].setColor(Color.BLUE);
//test if a hit
// if so, board[r][c].setHit(true);
}
}
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e) {
int x=e.getX();
int y=e.getY();
for (int r=0; r<10;r++)
for (int c=0; c<10; c++){
if(board[r][c].contains(x, y)){
board[r][c].setSelected(true);
message=board[r][c].getLocation();
}else{
board[r][c].setSelected(false);
}
}
repaint();
}
}
Ship.java
public class Ship
{
private String[] locs;
private boolean[] hits;
public final String rows="ABCDEFGHIJ";
public Ship(){
int size = randomInt(2,4);
locs = new String[size];
hits = new boolean[size];
for (int i=0;i<size;i++)
hits[i]=false;
int a= randomInt(0, 10-size);
int b= randomInt(0, 9);
if(Math.random()<.5){//vertical
for(int i=0;i<size;i++)
locs[i]=getLocation(a+1, b);
} else {//horiz
for(int i=0;i<size;i++)
locs[i]=getLocation(b, a+1);
}
}
public String getLocation(int row, int col){
return rows.substring(row, row+1)+"-"+(col+1);
}
public int randomInt(int min, int max){
min = Math.min(min, max);
max = Math.max(min, max);
return min+(int)((max-min)*Math.random());
}
public int size(){
return locs.length;
}
public boolean contains(String loc){
for(int i=0; i<size(); i++)
if (loc.equals(locs[i]))
return true;
return false;
}
public boolean overlaps(Ship other){
for(int i=0; i<size(); i++)
if (other.contains(locs[i]))
return true;
return false;
}
public void hit(String loc){
if (!this.contains(loc))
return;
for(int i=0; i<size(); i++)
if (loc.equals(locs[i]))
hits[i]=true;
}
public boolean isSunk(){
for (int i=0;i<size(); i++)
if (hits[i]==false)
return false;
return true;
}
}
