mishka89
mishka89

Reputation: 13

Changing value in rectangular two dimensional array

I am creating a very rudimentary battle ship program for fun and I have come across a problem with changing values in my rectangular two dimensional array. Essentially, there are five "ships" placed in this two dimensional array. A user then inputs an integer to see if they hit or miss. I wanted the output to display the array with the guessed number represented with an X for a miss and a 0 for a hit. I am having trouble with changing the value at area[i][j] when it equals the value of t to the 0 or X. I am new to java so I am trying to learn. Any help would be appreciated. Thank you in advance.

import java.util.*;
public class battleship {

    //Rudimentary Battleship game
    public static void main(String[] args) {
        System.out.println(" Hello and welcome to a basic version of Battleship.");
        System.out.println(" The objective of this game is to sink all five ships located on the grid listed below.");
        System.out.println(" Follow the prompt located underneath the grid ");
        final int ROWS = 10;
        final int COLS = 10;
        int sum = 0;
        int [][] area = { {1,2,3,4,5,6,7,8,9,10},
                  {11,12,13,14,15,16,17,18,19,20},
                  {21,22,23,24,25,26,27,28,29,30},
                  {31,32,33,34,35,36,37,38,39,40},
                  {41,42,43,44,45,46,47,48,49,50},
                  {51,52,53,54,55,56,57,58,59,60},
                  {61,62,63,64,65,66,67,68,69,70},
                  {71,72,73,74,75,76,77,78,79,80},
                  {81,82,83,84,85,86,87,88,89,90},
                  {91,92,93,94,95,96,97,98,99,100} };

        for(int i=0; i < area.length; i++) {
            for (int j=0; j < area[i].length; j++) {


              if(area[i][j] < 10) 
                System.out.print("   "+(area[i][j])+" ");  
              else if(area[i][j] < 100) 
                System.out.print("  "+(area[i][j])+" ");
              else 
                System.out.print(" "+(area[i][j])+" ");
            }
          System.out.println("");
        }

    Scanner input = new Scanner(System.in);{
    System.out.println("Enter attack integer:");
    int t;
    while(true){
    t = input.nextInt();

    if ((t == 41) || (t == 42) || (t == 43)){
    System.out.println("Hit - Destroyer");}

    if ((t == 80) || (t == 90) || (t == 100)){
        System.out.println("Hit - Submarine");}


    if((t == 52) || (t == 62) || (t== 72) || (t == 82) || (t == 92)){
        System.out.println ("Hit - Aircraft Carrier");}

    if((t == 15) || (t == 16) || (t == 17) || (t == 18)){
        System.out.println ("Hit - Battleship");}

    if((t == 1) || (t == 2)){
        System.out.println ("Hit - PT Boat");}
    else{
        System.out.println ("Miss");
    }
    System.out.println("You have fired at:" + t);
    int w = 0;
    for(int i=0; i < area.length; i++) {
        for (int j=0; j < area[i].length; j++) {

            if (area[i][j] == t)

          if(area[i][j] < 10) 
            System.out.print("   "+(area[i][j])+" ");  
          else if(area[i][j] < 100) 
            System.out.print("  "+(area[i][j])+" ");
          else 
            System.out.print(" "+(area[i][j])+" ");
        }
      System.out.println("");
    }

        }
        }
    }
} 

Upvotes: 0

Views: 3366

Answers (2)

turbo
turbo

Reputation: 1897

This is simple, modifying your code:

if ((t == 41) || (t == 42) || (t == 43)){
    System.out.println("Hit - Destroyer");
    area[i][j] = "X";
}
if ((t == 80) || (t == 90) || (t == 100)){
    System.out.println("Hit - Submarine");
    area[i][j] = "X";
}
if((t == 52) || (t == 62) || (t== 72) || (t == 82) || (t == 92)){
    System.out.println ("Hit - Aircraft Carrier");
    area[i][j] = "X";
}

if((t == 15) || (t == 16) || (t == 17) || (t == 18)){
    System.out.println ("Hit - Battleship");
    area[i][j] = "X";
}
if((t == 1) || (t == 2)){
    System.out.println ("Hit - PT Boat");
    area[i][j] = "X";
}
else{
    System.out.println ("Miss");
    area[i][j] = "O";
}

A note: be careful, arrays are 0 indexed, so your ship positions don't exactly correspond to the way you set up the grid. i.e. area[4][1] is not "41". You seemed to do this correctly (in the case of the destroyer) for the columns but not the rows. The if statements should check for 31, 32, 33 if the ship is at area[4][0], area[4][1], area [4][2]. In fact, you might be better off labeling the positions from 00, 01, 02, ... , 97, 98, 99 so that the indices correspond to the numbers.

Upvotes: 1

durron597
durron597

Reputation: 32343

You would be much better off using object orientation. Here's a skeleton to get you started:

public class Cell {
  private boolean ship = false;
  private boolean hit = false;

  public boolean getHit() {
    return hit;
  }
  public void setHit(boolean hit) {
    this.hit = hit;
  }
}

Then

public class Board() {
  public static final int SIZE = 10;
  private Cell[][] board;

  public Board() {
    board  = new Cell[SIZE][SIZE];
    for(int i = 0; i < 10; i++)
      for(int j = 0; j < 10; j++)
        board[i][j] = new Cell();

  public boolean getHit(int x, int y) {
    if(x < 0 || x >= SIZE || y < 0 || y >= SIZE) throw new BattleshipException("You queried a cell that doesn't exist!");
    return board[x][y].getHit();
  }
  // etc etc.
} 

Flesh out all the methods you need, add fields when you need them, this will work much better!

Upvotes: 2

Related Questions