Skip to content
Snippets Groups Projects
Commit a1e2f053 authored by Bariatti Francesco's avatar Bariatti Francesco
Browse files

Added selection of tiles to GUI

parent 2b47d764
No related branches found
No related tags found
No related merge requests found
......@@ -19,6 +19,7 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
public class Controller implements Initializable
......@@ -30,6 +31,7 @@ public class Controller implements Initializable
private Tile[] board;
private TileView[] boardView;
private Player humanPlayer;
private int selectedTile;
@FXML
private Polygon tile0, tile1, tile2, tile3, tile4, tile5, tile6, tile7, tile8, tile9, tile10, tile11, tile12, tile13, tile14, tile15, tile16, tile17, tile18, tile19, tile20, tile21, tile22, tile23, tile24, tile25, tile26, tile27, tile28, tile29, tile30, tile31, tile32, tile33, tile34, tile35, tile36, tile37, tile38, tile39, tile40, tile41, tile42, tile43, tile44, tile45, tile46, tile47, tile48, tile49, tile50, tile51, tile52, tile53, tile54, tile55, tile56, tile57, tile58, tile59;
......@@ -46,8 +48,10 @@ public class Controller implements Initializable
for (int i = 0; i < fxTiles.length; i++)
{
board[i] = new Tile(i, Tile.PenguinPresence.NO_PENGUIN);
fxTiles[i].setOnMouseClicked(new TileClickHandler(i));
boardView[i] = new TileView(fxTiles[i], board[i]);
}
this.selectedTile = -1;
this.gameState = new GameState();
try
{
......@@ -91,14 +95,64 @@ public class Controller implements Initializable
}
}
private class MyClickHandler implements EventHandler<MouseEvent>
/**
* Event handler that will listen for a click on a tile.
* It is associated with a TileView
*/
private class TileClickHandler implements EventHandler<MouseEvent>
{
private int tileNumber;
public TileClickHandler(int tileNumber)
{
this.tileNumber = tileNumber;
}
/**
* Change the tiles' highlighted values to the given value
*/
private void changeTilesHighlightState(List<Integer> tiles, boolean value)
{
for (int tile : tiles)
{
boardView[tile].setHighlighted(value);
boardView[tile].update();
}
}
@Override
public void handle(MouseEvent event)
{
Polygon poly = (Polygon) event.getSource();
poly.setFill(Color.GOLD);
if (!gameState.getCurrent_player().equals(humanPlayer))
return;
if (selectedTile == tileNumber) //If we clicked again on the selected tile
{
//UnSelect and un-highlight previously selected and highlighted tiles
boardView[selectedTile].setSelected(true);
boardView[selectedTile].update();
changeTilesHighlightState(gameState.getReachableTiles(humanPlayer, gameState.getPenguinOnTile(humanPlayer, selectedTile)), false);
selectedTile = -1;
return;
}
//We clicked on a tile that wasn't previously selected
int penguinNb = gameState.getPenguinOnTile(humanPlayer, tileNumber);
if (penguinNb == -1) //There is no penguin on this tile
return;
//There is a penguin on the tile: we want to select this tile
if (selectedTile != -1) //If there was a tile previously selected
{
boardView[selectedTile].setSelected(false);
boardView[selectedTile].update();
changeTilesHighlightState(gameState.getReachableTiles(humanPlayer, gameState.getPenguinOnTile(humanPlayer, selectedTile)), false);
}
boardView[tileNumber].setSelected(true);
boardView[tileNumber].update();
changeTilesHighlightState(gameState.getReachableTiles(humanPlayer, penguinNb), true);
selectedTile = tileNumber;
return;
}
}
......
......@@ -58,7 +58,7 @@ public class UpdateThread extends Thread
//UPDATE VIEW
for (int i = 0; i < boardView.length; i++)
boardView[i].updateFromModel();
boardView[i].update();
}
}
catch (IOException e)
......
......@@ -3,7 +3,9 @@ package model;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GameState
......@@ -72,17 +74,12 @@ public class GameState
/**
* @param player The penguin's owner
* @param i The number of the penguin for this player
* @param i The number of the penguin for this player
* @return the total moves that this penguin can do
*/
public int getPenguinTotalMoves(Player player, int i)
{ return ((penguins.get(player)[i] >>> 6) & 63); }
public enum Direction
{
A,B,C,D,E,F;
}
/**
* Get maximum number of tiles that a penguin can do in one specific direction
*/
......@@ -122,18 +119,52 @@ public class GameState
{
int[] peng = penguins.get(player);
int total = 0;
for(int i = 0; i < penguinNumber; i++) //We add the moves of all preceding penguins
for (int i = 0; i < penguinNumber; i++) //We add the moves of all preceding penguins
total += getPenguinTotalMoves(player, i);
for(Direction d : Direction.values())
for (Direction d : Direction.values())
{
if(d.equals(direction))
return total+nbSteps-1;
if (d.equals(direction))
return total + nbSteps - 1;
else
total += getNbMoves(player, penguinNumber, d);
}
return -1;
}
/**
* @return The number of the penguin of this player that is on tile number tileNumber. Or -1 if there isn't any (note: there could be a penguin of the other player)
*/
public int getPenguinOnTile(Player player, int tileNumber)
{
for (int i = 0; i < penguins.get(player).length; i++)
if (getPenguinPos(player, i) == tileNumber)
return i;
return -1;
}
/**
* @return The list of all tiles that could be reached by moving penguin penguinNb of player player
*/
public List<Integer> getReachableTiles(Player player, int penguinNb)
{
List<Integer> result = new ArrayList<>();
int startingTile = getPenguinPos(player, penguinNb);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.A); i++)
result.add(startingTile + i * 7);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.B); i++)
result.add(startingTile - i);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.C); i++)
result.add(startingTile - i * 8);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.D); i++)
result.add(startingTile - i * 7);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.E); i++)
result.add(startingTile + i);
for (int i = 1; i <= getNbMoves(player, penguinNb, Direction.F); i++)
result.add(startingTile + i * 8);
return result;
}
public boolean getCan_play_red()
{
return can_play_red;
......@@ -154,4 +185,9 @@ public class GameState
return score.get(player);
}
public enum Direction
{
A, B, C, D, E, F;
}
}
......@@ -11,9 +11,11 @@ public class TileView
{
private Polygon fxTile;
private Tile modelTile;
private boolean selected, highlighted;
public TileView(Polygon fxTile, Tile modelTile)
{
this.fxTile = fxTile;
this.modelTile = modelTile;
}
......@@ -21,30 +23,50 @@ public class TileView
/**
* Tell the view to update according to the model
*/
public void updateFromModel()
public void update()
{
//TODO: Better tile representation
Color fillColor = null;
//FISH NUMBER
switch (modelTile.getNbFish())
{
case 0:
fxTile.setFill(Color.LIGHTBLUE);
fillColor = Color.LIGHTBLUE;
break;
case 1:
fxTile.setFill(Color.GREENYELLOW);
fillColor = Color.GREENYELLOW;
break;
case 2:
fxTile.setFill(Color.GREEN);
fillColor = Color.GREEN;
break;
case 3:
fxTile.setFill(Color.DARKGREEN);
fillColor = Color.DARKGREEN;
break;
}
//PENGUIN
if (modelTile.getPenguinPresence().equals(Tile.PenguinPresence.RED_PENGUIN))
fxTile.setFill(Color.RED);
fillColor = Color.RED;
else if (modelTile.getPenguinPresence().equals(Tile.PenguinPresence.BLUE_PENGUIN))
fxTile.setFill(Color.BLUE);
fillColor = Color.BLUE;
//SELECTION/HIGHLIGHT
if (selected)
fillColor = fillColor.deriveColor(0, 1, 0.5, 1);
if (highlighted)
fillColor = fillColor.deriveColor(0, 0.5, 1, 1);
fxTile.setFill(fillColor);
}
public Tile getModelTile() { return modelTile; }
public boolean isSelected() { return selected; }
public void setSelected(boolean selected) { this.selected = selected; }
public boolean isHighlighted() { return highlighted; }
public void setHighlighted(boolean highlighted) { this.highlighted = highlighted; }
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment