You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.9 KiB
194 lines
5.9 KiB
import javafx.application.Application;
|
|
import javafx.animation.FadeTransition;
|
|
import javafx.geometry.Pos;
|
|
import javafx.geometry.Insets;
|
|
import javafx.scene.Node;
|
|
import javafx.scene.Scene;
|
|
import javafx.scene.control.Button;
|
|
import javafx.scene.control.TextField;
|
|
import javafx.scene.layout.GridPane;
|
|
import javafx.scene.paint.Color;
|
|
import javafx.scene.shape.Rectangle;
|
|
import javafx.scene.text.Text;
|
|
import javafx.scene.text.Font;
|
|
import javafx.stage.Stage;
|
|
import javafx.util.Duration;
|
|
import java.util.Scanner;
|
|
|
|
public class BattleshipMain extends Application
|
|
{
|
|
private GridPane windowScreen = new GridPane();
|
|
private Battleship battle;
|
|
|
|
@Override
|
|
public void start(Stage primaryStage)
|
|
{
|
|
this.battle = new Battleship(10, 10);
|
|
startingGame();
|
|
this.windowScreen.setAlignment(Pos.CENTER);
|
|
|
|
Scene scene = new Scene(this.windowScreen, battle.getPlayerBoard().length * 70, battle.getPlayerBoard()[0].length * 60);
|
|
primaryStage.setTitle("Battleship");
|
|
primaryStage.setScene(scene);
|
|
primaryStage.show();
|
|
|
|
promptingPlayer();
|
|
}
|
|
|
|
public void startingGame()
|
|
{
|
|
this.windowScreen.setPadding(new Insets(10, 10, 10, 10));
|
|
|
|
Text playerBoard = new Text(" Player Board");
|
|
playerBoard.setFont(Font.font("Arial", 20));
|
|
GridPane.setConstraints(playerBoard, 1, 1);
|
|
setBoardValues(this.battle.getPlayerBoard(), 1);
|
|
|
|
Text computerBoard = new Text(" Computer Board");
|
|
computerBoard.setFont(Font.font("Arial", 20));
|
|
GridPane.setConstraints(computerBoard, 1, 12);
|
|
setBoardValues(this.battle.getComputerBoardDisplay(), 12);
|
|
|
|
addSpacing();
|
|
|
|
this.windowScreen.getChildren().addAll(playerBoard, computerBoard);
|
|
}
|
|
|
|
public void setBoardValues(int[][] p, int columnOffset)
|
|
{
|
|
for(int row = 0; row < p.length; row++)
|
|
for(int col = 0; col < p[row].length; col++)
|
|
{
|
|
Rectangle player = new Rectangle(0, 0, 20, 20);
|
|
player.setStroke(Color.BLACK);
|
|
if(p[row][col] == 3)
|
|
player.setFill(Color.BLACK);
|
|
else if(p[row][col] == 2)
|
|
player.setFill(Color.RED);
|
|
else if(p[row][col] == 1)
|
|
player.setFill(Color.WHITE);
|
|
else
|
|
player.setFill(Color.LIGHTGRAY);
|
|
|
|
this.windowScreen.add(player, row + 4, col + columnOffset);
|
|
}
|
|
}
|
|
|
|
public void addSpacing()
|
|
{
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
Text blankSpace = new Text(" ");
|
|
this.windowScreen.add(blankSpace, i + 2, 1);
|
|
Text blankSpace2 = new Text(" ");
|
|
this.windowScreen.add(blankSpace2, i + 14, 1);
|
|
}
|
|
|
|
for (int i = 1; i < 11; i++)
|
|
{
|
|
Text number = new Text("" + i);
|
|
number.setFont(Font.font("Arial", 20));
|
|
this.windowScreen.add(number, 3, 11 + i);
|
|
Text numberHorizontal = new Text("" + i);
|
|
numberHorizontal.setFont(Font.font("Arial", 20));
|
|
this.windowScreen.add(numberHorizontal, 3 + i, 11);
|
|
}
|
|
}
|
|
|
|
public void promptingPlayer()
|
|
{
|
|
TextField xInput = createInput("x", 10);
|
|
TextField yInput = createInput("y", 11);
|
|
Button sendCoordinates = new Button(" Send Coordinates ");
|
|
this.windowScreen.add(sendCoordinates, 16, 12);
|
|
sendCoordinates.setOnAction( e -> calculatingMove(xInput.getText(), yInput.getText()));
|
|
}
|
|
|
|
public TextField createInput(String coord, int colLoc)
|
|
{
|
|
TextField input = new TextField();
|
|
input.setPromptText("Enter " + coord + " coordinate");
|
|
this.windowScreen.add(input, 16, colLoc);
|
|
return input;
|
|
}
|
|
|
|
public void calculatingMove(String xInput, String yInput)
|
|
{
|
|
int[][] computerActual = this.battle.getComputerBoardHidden();
|
|
int[][] computerDisplay = this.battle.getComputerBoardDisplay();
|
|
int[][] playerBoard = this.battle.getPlayerBoard();
|
|
|
|
boolean playerWin = false, computerWin = false, checkingHit = false;
|
|
|
|
int x, y = -1;
|
|
|
|
Text usedCoord = new Text(" Pick again");
|
|
usedCoord.setFont(Font.font("Arial", 12));
|
|
this.windowScreen.add(usedCoord, 16, 16);
|
|
usedCoord.setOpacity(0.0);
|
|
|
|
x = Integer.parseInt(xInput) - 1;
|
|
y = Integer.parseInt(yInput) - 1;
|
|
|
|
if ( x < 0 || x > 9 )
|
|
handleError("x", 14);
|
|
|
|
if ( y < 0 || y > 9 )
|
|
handleError("y", 15);
|
|
|
|
if ((x >= 0 && x <= 9) && (y >= 0 && y <= 9))
|
|
{
|
|
checkingHit = computerDisplay[x][y] == 0;
|
|
}
|
|
|
|
if (checkingHit)
|
|
{
|
|
this.battle.updateComputerBoards(x, y, computerActual, computerDisplay);
|
|
playerWin = this.battle.checkPlayerWin();
|
|
this.battle.computerTurn();
|
|
computerWin = this.battle.checkComputerWin();
|
|
setBoardValues(this.battle.getPlayerBoard(), 1);
|
|
setBoardValues(this.battle.getComputerBoardDisplay(), 12);
|
|
} else {
|
|
usedCoord.setOpacity(1.0);
|
|
FadeTransition fading = creatingFader(usedCoord);
|
|
fading.play();
|
|
}
|
|
|
|
if (playerWin)
|
|
handleWin("You");
|
|
|
|
if (computerWin)
|
|
handleWin("Computer");
|
|
}
|
|
|
|
public void handleWin(String player)
|
|
{
|
|
Text winner = new Text(" " + player + " won!");
|
|
winner.setFont(Font.font("Arial", 18));
|
|
this.windowScreen.add(winner, 16, 18);
|
|
}
|
|
|
|
public void handleError(String coord, int colLoc)
|
|
{
|
|
Text error = new Text(" Invalid " + coord + " coordinate.");
|
|
error.setFont(Font.font("Arial", 12));
|
|
this.windowScreen.add(error, 16, colLoc);
|
|
error.setOpacity(1.0);
|
|
FadeTransition fading = creatingFader(error);
|
|
fading.play();
|
|
}
|
|
|
|
private FadeTransition creatingFader(Node node)
|
|
{
|
|
FadeTransition fade = new FadeTransition(Duration.seconds(3), node);
|
|
fade.setFromValue(1);
|
|
fade.setToValue(0);
|
|
return fade;
|
|
}
|
|
|
|
public static void main(String[] args)
|
|
{
|
|
Application.launch(args);
|
|
}
|
|
}
|