Bat


//This program was completely written by Peter Wetsel.
//If there are any questions about this code you
//can email me at phwetsel@eos.ncsu.edu
//To get it to compile using jdk type "javac -nowarn battle.java".
//
//
//




import java.util.*;
import java.lang.*;
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.lang.*;

public class battle extends java.applet.Applet implements Runnable {
	Color col;
	String message= new String("");//holds the message placed in the upper left
	String Status = new String("");
	String message2[]= new String[5];//holds the destroyed messages in order for repainting.
	int hits=0;//the total number of hits by the player
	int numDestroyed=0;//the number of ships destroyed by the player
	int battlepos[]=new int[4];//the 4 positions of the battleship
    int carrierpos[]=new int[5];//the 5 positions of the carrier
	int subpos[]=new int[3];//the 3 positions of the submarine
	int patrolpos[]=new int[2];//the 2 positions of the patrol boat
	int destroyerpos[]=new int[3]; //the 3 positions of the destroyer
	int guesses=0;// the number of guesses by the player
	int player[][]=new int[10][10]; //to hold the positions of the player.(not until version 2)
	int guessed[][]=new int[10][10]; //hold the places that have been guessed by the player
	int computer[][]=new int[10][10]; //holds where the computers ships are
	int battleshipHitCt, destroyerHitCt, subHitCt, patrolHitCt, carrierHitCt;//keeps the hit count for each of the ships
	boolean init=false;//false until play is pushed.
	boolean ok=false;//boolean that is true if current boat position chosen by random is ok(getcarrier(), etc.)
	boolean battleOK=true;//false when the type of ship is destroyed
	boolean patrolOK=true;//...
	boolean subOK=true;//...
	boolean destroyerOK=true;//...
	boolean carrierOK=true;//...
	boolean won=false;//true when the player has won
	int o;

	public void getCarrier(){
		int x, y, dir;  //will hold a random x & y coordinate(0-9), and a random direction(0-1)(N,E,S,W)
		x=(int)(10*Math.random());
		y=(int)(10*Math.random());
		dir=(int)(100*Math.random()/25);
		if(dir==0)
		{
			while(y<4){
				y=(int)(10*Math.random());
			}
			for (int i=0; i<5; i++){
				computer[x][y-i]=1;
				carrierpos[i]=x*10+y-i;
			}
		}
		if (dir==1)
		{
			while(x>5){
				x=(int)(10*Math.random());
			}
			for (int i=0; i<5; i++){
				computer[x+i][y]=1;
				carrierpos[i]=(x+i)*10+y;
			}
		}
		if (dir==2)
		{
			while(y>5){
				y=(int)(10*Math.random());
			}
			for (int i=0; i<5; i++){
				computer[x][y+i]=1;
				carrierpos[i]=x*10+y+i;
			}
		}
		if (dir==3)
		{
			while(x<4){
				x=(int)(10*Math.random());
			}
			for (int i=0; i<5; i++){
				computer[x-i][y]=1;
				carrierpos[i]=(x-i)*10+y;
			}
		}
	}

	public void getBattle(){
		int x, y, dir;
		x=(int)(10*Math.random());
		y=(int)(10*Math.random());
		dir=(int)(100*Math.random()/25);
		while(!ok){
			ok=true;
			x=(int)(10*Math.random());
			y=(int)(10*Math.random());
			dir=(int)(100*Math.random()/25);
			if(dir==0)
			{
				while(y<3){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<4; i++){
					o=computer[x][y-i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==1)
			{
				while(x>6){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<4; i++){
					o=computer[x+i][y];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==2)
			{
				while(y>6){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<4; i++){
					o=computer[x][y+i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==3)
			{
				while(x<3){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<4; i++){
					o=computer[x-i][y];
					if (o==1){
						ok=false;
					}
				}

			}
		}

		if(dir==0)
		{
			for (int i=0; i<4; i++){
				computer[x][y-i]=1;
				battlepos[i]=x*10+y-i;
			}
		}
		if (dir==1)
		{
			for (int i=0; i<4; i++){
				computer[x+i][y]=1;
				battlepos[i]=(x+i)*10+y;
			}
		}
		if (dir==2)
		{
			for (int i=0; i<4; i++){
				computer[x][y+i]=1;
				battlepos[i]=x*10+y+i;
			}
		}
		if (dir==3)
		{
			for (int i=0; i<4; i++){
				computer[x-i][y]=1;
				battlepos[i]=(x-i)*10+y;
			}
		}

	}

	public void getSub(){
		int x, y, dir;
		x=(int)(10*Math.random());
		y=(int)(10*Math.random());
		dir=(int)(100*Math.random()/25);
		while(!ok){
			ok=true;
			x=(int)(10*Math.random());
			y=(int)(10*Math.random());
			dir=(int)(100*Math.random()/25);
			if(dir==0)
			{
				while(y<2){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x][y-i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==1)
			{
				while(x>7){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x+i][y];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==2)
			{
				while(y>7){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x][y+i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==3)
			{
				while(x<2){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x-i][y];
					if (o==1){
						ok=false;
					}
				}

			}
		}

		if(dir==0)
		{
			for (int i=0; i<3; i++){
				computer[x][y-i]=1;
				subpos[i]=x*10+y-i;
			}
		}
		if (dir==1)
		{
			for (int i=0; i<3; i++){
				computer[x+i][y]=1;
				subpos[i]=(x+i)*10+y;
			}
		}
		if (dir==2)
		{
			for (int i=0; i<3; i++){
				computer[x][y+i]=1;
				subpos[i]=x*10+y+i;
			}
		}
		if (dir==3)
		{
			for (int i=0; i<3; i++){
				computer[x-i][y]=1;
				subpos[i]=(x-i)*10+y;
			}
		}

	}

	public void getDestroyer(){
		int x, y, dir;
		x=(int)(10*Math.random());
		y=(int)(10*Math.random());
		dir=(int)(100*Math.random()/25);
		while(!ok){
			ok=true;
			x=(int)(10*Math.random());
			y=(int)(10*Math.random());
			dir=(int)(100*Math.random()/25);
			if(dir==0)
			{
				while(y<2){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x][y-i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==1)
			{
				while(x>7){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x+i][y];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==2)
			{
				while(y>7){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x][y+i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==3)
			{
				while(x<2){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<3; i++){
					o=computer[x-i][y];
					if (o==1){
						ok=false;
					}
				}

			}
		}

		if(dir==0)
		{
			for (int i=0; i<3; i++){
				computer[x][y-i]=1;
				destroyerpos[i]=x*10+y-i;
			}
		}
		if (dir==1)
		{
			for (int i=0; i<3; i++){
				computer[x+i][y]=1;
				destroyerpos[i]=(x+i)*10+y;
			}
		}
		if (dir==2)
		{
			for (int i=0; i<3; i++){
				computer[x][y+i]=1;
				destroyerpos[i]=x*10+y+i;
			}
		}
		if (dir==3)
		{
			for (int i=0; i<3; i++){
				computer[x-i][y]=1;
				destroyerpos[i]=(x-i)*10+y;
			}
		}

	}

	public void getPatrol(){
		int x, y, dir;
		x=(int)(10*Math.random());
		y=(int)(10*Math.random());
		dir=(int)(100*Math.random()/25);
		while(!ok){
			ok=true;
			x=(int)(10*Math.random());
			y=(int)(10*Math.random());
			dir=(int)(100*Math.random()/25);
			if(dir==0)
			{
				while(y<1){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<2; i++){
					o=computer[x][y-i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==1)
			{
				while(x>8){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<2; i++){
					o=computer[x+i][y];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==2)
			{
				while(y>8){
					y=(int)(10*Math.random());
				}
				for (int i=0; i<2; i++){
					o=computer[x][y+i];
					if (o==1){
						ok=false;
					}
				}

			}
			if (dir==3)
			{
				while(x<1){
					x=(int)(10*Math.random());
				}
				for (int i=0; i<2; i++){
					o=computer[x-i][y];
					if (o==1){
						ok=false;
					}
				}

			}
		}

		if(dir==0)
		{
			for (int i=0; i<2; i++){
				computer[x][y-i]=1;
				patrolpos[i]=x*10+y-i;
			}
		}
		if (dir==1)
		{
			for (int i=0; i<2; i++){
				computer[x+i][y]=1;
				patrolpos[i]=(x+i)*10+y;
			}
		}
		if (dir==2)
		{
			for (int i=0; i<2; i++){
				computer[x][y+i]=1;
				patrolpos[i]=x*10+y+i;
			}
		}
		if (dir==3)
		{
			for (int i=0; i<2; i++){
				computer[x-i][y]=1;
				patrolpos[i]=(x-i)*10+y;
			}
		}

	}

	public void run(){// to be in here so can compile
	}


	public void init() {

		for (int i=0; i<10; i++){//initializes the guessed matrix to be all 2's(not been guessed)
			for (int j=0;j<10; j++){
				guessed[i][j]=2;
			}
		}
		for (int i=0; i<2; i++){//initializes array to be all zeros
			patrolpos[i]=0;
		}
		for (int i=0; i<2; i++){
			destroyerpos[i]=0;
		}
		for (int i=0; i<2; i++){
			subpos[i]=0;
		}
		for (int i=0; i<2; i++){
			carrierpos[i]=0;
		}
		for (int i=0; i<2; i++){
			battlepos[i]=0;
		}
		battleshipHitCt=0;//initialize all hit counts
		destroyerHitCt=0;
		subHitCt=0;
		patrolHitCt=0;
		carrierHitCt=0;
	    //get all boat positions
		getCarrier();
		ok=false;
		getBattle();
		ok=false;
		getDestroyer();
		ok=false;
		getSub();
		ok=false;
		getPatrol();
	}

	public void paint(Graphics g) { //this is the shots paint method... draws a line from its last position to its current position, basically
	   if (!init && !won){//draws screen before play is pushed
			g.setColor(col.white);
			g.fillRect(0,0,600,320);
			g.setColor(col.black);
			g.fillRect(20,20,30,25);
			g.setColor(col.white);
			g.drawString("PLAY", 23,30);
			g.setColor(col.black);
			g.drawString("This is different that usual battleship, here the goal is",23,65);
			g.drawString("to find all of the computers ships in the least number of guesses.",23,85);
			g.drawString("<30   turns  --- You have too much luck!", 23, 105);
			g.drawString("31-50 turns  --- Excellent!", 23, 125);
			g.drawString(">=51  turns  --- You have no skills!", 23, 145);
			g.drawString("PRESS PLAY TO BEGIN", 23, 165);
		}
		if (init && !won){//draws grid and messages
			g.setColor(col.black);
			g.fillRect(0,0,600,320); //makes big, black rectangle washover
			g.setColor(col.white);
			g.drawString("# of Guesses = " + guesses,500, 280);
			for (int i=0; i<11; i++)
				g.drawLine(20,20+i*28, 300, 20+i*28);
			for (int i=0; i<11; i++)
				g.drawLine(20+i*28,20,20+i*28,300);
			char ch='A';
			for (int i=0; i<10; i++){//draws letter accross the top
				g.drawString(ch+" ",30+28*i,13);
				ch++;
			}
			ch='1';
			for (int i=0; i<9; i++){//draws numbers down the side
				g.drawString(ch+" ",10,40+28*i);
				ch++;
			}
			g.drawString("10", 6,290);
			g.drawString(message,420,40);
			for (int i=0; i<numDestroyed; i++){
				g.drawString(message2[i], 305, 40+(i+1)*20);
			}
			g.setColor(col.black);
			//next puts in any circles already guessed
			for (int i=0; i<10; i++)
				for (int j=0; j<10;j++){
					if (guessed[i][j]==1)	 {
						g.setColor(col.red);
						g.fillOval(i*28+30, j*28+30, 10,10);
					}
					if (guessed[i][j]==0)	 {
						g.setColor(col.white);
						g.fillOval(i*28+30, j*28+30, 10,10);
					}
				}
		}
	}

	public boolean seeifahit(int x, int y){//sees if the shot was a hit or not
		if(computer[x][y]==1)
			return true;
		return false;
	}

	public String getshiptype(int x, int y){//returns the name of the ship that was hit
		for (int i=0;i<4; i++)
			if (battlepos[i]==x*10+y){
				battleshipHitCt++;
				return "Battleship";
		    }
		for (int i=0;i<3; i++)
			if (subpos[i]==x*10+y){
				subHitCt++;
				return "Submarine";
			}
		for (int i=0;i<2; i++)
			if (patrolpos[i]==x*10+y){
				patrolHitCt++;
				return "Patrol Boat";
			}
		for (int i=0;i<5; i++)
			if (carrierpos[i]==x*10+y){
				carrierHitCt++;
				return "Carrier";
			}
		for (int i=0;i<3; i++)
			if (destroyerpos[i]==x*10+y){
				destroyerHitCt++;
				return "Destroyer";
			}
		return "  ";
	}

	public void gameOver(){//displays guesses and ends
		if (!won){
			Graphics g = getGraphics() ;
			g.setColor(col.black);
			g.fillRect(0,0,600,320); //makes big, black rectangle washover
			g.setColor(col.white);
			g.drawString("YOU WIN!!", 200,100);
			String out=new String("It took you "+guesses+" tries!");
			g.drawString(out, 200,120);
			g.drawString("Press refresh on your browser to play again", 200, 150);
			won=true;
		}
	}

	public boolean destroyed(){

		if(battleshipHitCt==4 && battleOK)
		{
			battleOK=false;
			return true;
		}
		if(carrierHitCt==5 && carrierOK)
		{
			carrierOK=false;
			return true;
		}
		if(subHitCt==3 && subOK)
		{
			subOK=false;
			return true;
		}
		if(patrolHitCt==2 && patrolOK)
		{
			patrolOK=false;
			return true;
        }
		if(destroyerHitCt==3 && destroyerOK)
		{
			destroyerOK=false;
			return true;
		}
		return false;
	}

	public boolean mouseDown(Event e, int x, int y) {//handles when a mouse key is pressed(either key)
		String type= new String("");
		if (!won){
			message="";
			Graphics g = getGraphics() ;
			g.setColor(col.white);
			int xindex, yindex, val;
			if (x>20 && y>20 && y<300 && x<300 && init){
				guesses++;
				g.setColor(col.black);
				g.fillRect(490,260, 550, 285);
				g.setColor(col.white);
				g.drawString("# of Guesses = " + guesses,500, 280);
				g.setColor(col.black);
				g.fillRect(419,30,580,95);
				g.setColor(col.white);
				xindex=(x-20)/28;//converts x coordinate into index(A-J) in form of (0-9)
				yindex=(y-20)/28;//converst y coordinate into index(0-9)
				val=guessed[xindex][yindex];
				if (val==2){
					if (seeifahit(xindex,yindex)){
						type=getshiptype(xindex, yindex);
						hits++;
						g.setColor(col.white);
						guessed[xindex][yindex]=1;
						if (!destroyed()){
							message=type + " Hit";
							g.drawString(message, 420, 40);
						}
						else{
							g.setColor(col.white);
							message2[numDestroyed]=new String("");
							message2[numDestroyed]=type + "Destroyed";
							numDestroyed++;
							g.drawString(message2[numDestroyed-1] , 305, 40+(numDestroyed)*20);
						}
						g.setColor(col.red);
					}
					else guessed[xindex][yindex]=0;
					g.fillOval(xindex*28+30, yindex*28+30, 10,10);
				}
                else {
					g.setColor(col.white);
					message="That has already been guessed";
					g.drawString(message,420,40);
				}
			}

			if (x>20 && x<40 && y>20 && y<40 && !init){
				init=true;
				paint(g);
			}
			if (hits>=17){
				gameOver();
				System.exit(0);
			}
		}
		return true;
	}
}


Back to the Bat applet page.

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.