Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

JAVA 2D ARRAY -- Battleship (Console) ******************************************

ID: 3639676 • Letter: J

Question

JAVA 2D ARRAY -- Battleship (Console)
***************************************************************************************************
Implement a simplified version of the classic board game Battleship. The program should allow the user to play against the computer. The program should generate a 10 by 10 grid and randomly hide two ships in that grid, one of length 5 and one of length 4. It should randomly determine if the two ships are oriented horizontally or vertically. The two ships cannot be allowed to overlap. It should then allow the user to find the two ships.

For each turn, display the board with hits marked with an X, misses marked with an O and all other squares marked with a blank. Display the row and column numbers clearly to make it easier for the user to play the game. Then have the user enter the row and column they want to attack. Indicate to the user if the attempt was a hit or a miss, and if a hit, check if all ships have been sunk. The user must select every square the ship occupies to sink a ship. Give feedback when the user sinks both ships. After the user sinks both ships, the program should display how many moves it took to sink both ships, and then allow the players to choose to play again or exit. If the user chooses to play again, the program should clear the board, select new locations for the two ships, and allow the user to play the new game.

You must use a 2D array for this lab.
--------------------------------------------------------------

DATA NEEDED
Int board[][]
bool playAgain, gameOver
int numMoves
int row, col
Scanner input
Random random

ALGORITHM
// create board and objects
// loop until not playAgain
// init board
// generate ship locations, make sure they do not overlap
// numMoves = 0;
// loop until gameOver
// display board
// get move (includes validation)
// place move
// check for sunk ships, display congrats if both ships sunk
// end loop
// do you want to play again
// end loop

GAME BOARD
int board [] [] = new int[11][11]
Using rows 1-10 and columns 1-10 and ignoring element 0

GAME BOARD VALUES
0 – Not played
1 – Miss
2 – Hit
3 – Ship location

DISPLAYING BOARD
See the last in class problem

1
2
3
4
5
6
7
8
9
10
1
1,1
1,2
1,3
1,4
1,5
1,6
1,7
1,8
1,9
1,10
2
2,1
2,2
2,3
2,4
2,5
2,6
2,7
2,8
2,9
2,10
3
3,1
3,2
3,3
3,4
3,5
3,6
3,7
3,8
3,9
3,10
4
4,1
4,2
4,3
4,4
4,5
4,6
4,7
4,8
4,9
4,10
5
5,1
5,2
5,3
5,4
5,5
5,6
5,7
5,8
5,9
5,10
6
6,1
6,2
6,3
6,4
6,5
6,6
6,7
6,8
6,9
6,10
7
7,1
7,2
7,3
7,4
7,5
7,6
7,7
7,8
7,9
7,10
8
8,1
8,2
8,3
8,4
8,5
8,6
8,7
8,8
8,9
8,10
9
9,1
9,2
9,3
9,4
9,5
9,6
9,7
9,8
9,9
9,10
10
10,1
10,2
10,3
10,4
10,5
10,6
10,7
10,8
10,9
10,10

CONVERT ROUTINE FOR DISPLAYING GAME
static private String convert(int i)
{
if (i == 1)
{
return "O";
}
else if (i == 2)
{
return "X";
}
else if (i == 3) // This case is useful for debugging but should be removed for the game
{
return "S";
}
else
{
return " "; // Displaying a “-“ here can help initially in getting the table to look right
}
}

VALIDATE MOVE
do
{
// get row and col
} while (row < 1 || row > 10 || col < 1 || col > 10 || gameBoard[row][col] == 1 || gameBoard[row][col] == 2);
This is a good example of short-circuiting

GENERATE FIRST SHIP
// Do first ship of length 4
boolean horizontal = (random.nextInt(2) == 0);
int n1 = random.nextInt(10) + 1;
int n2 = random.nextInt(7) + 1;

if (horizontal)
{
board[n1][n2] = board[n1][n2+1] = board[n1][n2+2] = board[n1][n2+3] = 3;
}
else
{
board[n2][n1] = board[n2+1][n1] = board[n2+2][n1] = board[n2+3][n1] = 3;
}

MAKING SURE SHIPS DO NOT OVERLAP
There are a number of ways to do this. The way I am showing here is not the most elegant, but it is simple and straightforward.
//loop
// generate first ship as shown above
// generate second ship as shown above
// iterate through array counting squares with a ship in them
// end loop when number of squares with ships equals 9

CHECKING IF BOTH SHIPS ARE SUNK
*****************************************************************************
Please make it fat

Explanation / Answer

please implement your own DISPLAY BOARD method

(since you don't provide it, I coded a sample display method)

package battleship;

import java.util.*;

public class Program {
  

   /**CONVERT ROUTINE FOR DISPLAYING GAME
   *
   */
   static private String convert(int i)
   {
       if (i == 1)
       {
           return "O";
       }
       else if (i == 2)
       {
           return "X";
       }
       else
       {
           return " "; // Displaying a “-“ here can help initially in getting the table to look right
       }
   }
  
  
   public static void main(String[] args) {
       int board[][] = new int[11][11];
       boolean playAgain = true;
       String tempResponse = "y";
       boolean gameOver;
       int numMoves;
       int row, col;
       Scanner input = new Scanner(System.in);
       Random random = new Random();
       boolean horizontal;
       int n1, n2;
       int hitCount;
      
       /**PROCEDURE
       *
       */
       while (playAgain)
       {
           /**INITIALIZE THE GAME'S VARIABLES
           *
           */
           gameOver = false;
           numMoves = 0;
           hitCount = 0;
          
           /**INITIALIZE BOARD
           *
           */
           for (row = 0; row < 11; row++)
           {
               for (col = 0; col < 11; col++)
               {
                   board[row][col] = 0;
               }
           }
          
           /**GENERATE FIRST SHIP
           *
           */
           // Do first ship of length 4
           horizontal = (random.nextInt(2) == 0);
           n1 = random.nextInt(10) + 1;
           n2 = random.nextInt(7) + 1;
           if (horizontal)
           {
               board[n1][n2] = board[n1][n2+1] = board[n1][n2+2] = board[n1][n2+3] = 3;
           }
           else
           {
               board[n2][n1] = board[n2+1][n1] = board[n2+2][n1] = board[n2+3][n1] = 3;
           }
          
           /**GENERATE SECOND SHIP
           *
           */
           // Do first ship of length 5
           horizontal = (random.nextInt(2) == 0);
           n1 = random.nextInt(10) + 1;
           n2 = random.nextInt(6) + 1;      
           if (horizontal)
           {
               while (board[n1][n2] == 3 || board[n1][n2 + 1] == 3 || board[n1][n2 + 2] == 3 ||
                       board[n1][n2 + 3] == 3 || board[n1][n2 + 4] == 3)
               {
                   n1 = random.nextInt(10) + 1;
                   n2 = random.nextInt(6) + 1;
               }
               board[n1][n2] = board[n1][n2+1] = board[n1][n2+2] = board[n1][n2+3] = board[n1][n2+4] = 3;
           }
           else
           {
               while (board[n2][n1] == 3 || board[n2 + 1][n1] == 3 || board[n2 + 2][n1] == 3 ||
                           board[n2 + 3][n1] == 3 || board[n2 + 4][n1] == 3)
               {
                   n1 = random.nextInt(10) + 1;
                   n2 = random.nextInt(6) + 1;
               }
               board[n2][n1] = board[n2+1][n1] = board[n2+2][n1] = board[n2+3][n1] = board[n2+4][n1] = 3;
           }
          
           /**START GAME
           *
           */
           while (!gameOver)
           {
               /**DISPLAY BOARD
               *
               */
               for (row = 1; row < 11; row++)
               {
                   System.out.print("|");
                   for (col = 1; col < 11; col++)
                   {
                       System.out.print(convert(board[row][col]) + "|");
                   }
                   System.out.println();
               }
      
               /**VALIDATE MOVE
               *
               */
               System.out.println();
               do
               {
                   System.out.print("Enter your move (row col): ");
                   row = input.nextInt();
                   col = input.nextInt();
               } while (row < 1 || row > 10 || col < 1 || col > 10 || board[row][col] == 1 || board[row][col] == 2);
              
               /**SET MOVE
               *
               */
               numMoves++;
               if (board[row][col] == 3)
               {
                   board[row][col]--;
                   hitCount++;
               }
               else
               {
                   board[row][col]++;
               }
              
               /**DECIDE GAME STATUS
               *
               */
               if (hitCount == 9)
               {
                   gameOver = true;
                   /**DISPLAY BOARD
                   *
                   */
                   for (row = 1; row < 11; row++)
                   {
                       System.out.print("|");
                       for (col = 1; col < 11; col++)
                       {
                           System.out.print(convert(board[row][col]) + "|");
                       }
                       System.out.println();
                   }
                   System.out.println(" Congratulation! You win!");
                   System.out.println("You need " + numMoves + " moves to finish.");
                  
                   System.out.print(" Do you want to play again?(y/n) ");
                   tempResponse = input.next();
                   playAgain = (tempResponse.charAt(0) == 'y');
               }
           }
       }
   }
}

Sample play/run:

| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 4
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |X| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 3
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | |X|X| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 2
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 5
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X|X| | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 4
Enter your move (row col): 4 6
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X|X|X| | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 7
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X|X|X|X| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 8
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X|X|X|X|X| | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 9
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 3
| | | | | | | | | | |
| | | | | | | | | | |
| | |X| | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 2
| | | | | | | | | | |
| | | | | | | | | | |
| |O|X| | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 2 3
| | | | | | | | | | |
| | |X| | | | | | | |
| |O|X| | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 1 3
| | |O| | | | | | | |
| | |X| | | | | | | |
| |O|X| | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 3
Enter your move (row col): 5 3
| | |O| | | | | | | |
| | |X| | | | | | | |
| |O|X| | | | | | | |
| |O|X|X|X|X|X|X|O| |
| | |X| | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Congratulation! You win!
You need 13 moves to finish.

Do you want to play again?(y/n) y
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 4
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 7 7
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 7 4
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 7
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |X| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 8
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |X|X| | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 9
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |X|X|X| |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 10
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 5
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O|O| |X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 4 6
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 1 2
| |O| | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 1 6
| |O| | | |O| | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 2 3
| |O| | | |O| | | | |
| | |O| | | | | | | |
| | | | | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 2 7
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | | | | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 3
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| | | | | | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 7
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| | | |X| | | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 8
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| | | |X|X| | |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 9
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| | | |X|X|X| |
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 10
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| | | |X|X|X|X|
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 5
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| |O| |X|X|X|X|
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Enter your move (row col): 3 6
| |O| | | |O| | | | |
| | |O| | | |O| | | |
| | |O| |O|X|X|X|X|X|
| | | |O|O|X|X|X|X|O|
| | | | | | | | | | |
| | | | | | | | | | |
| | | |O| | |O| | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |

Congratulation! You win!
You need 20 moves to finish.

Do you want to play again?(y/n) n