worked on PathFinderMoveStrategy and Refactoring in Game.java
This commit is contained in:
parent
4b5802a0d0
commit
ad2e1c3104
|
@ -220,7 +220,12 @@ public class Game implements GameSpecification {
|
||||||
if (crashPosition != null) {
|
if (crashPosition != null) {
|
||||||
track.carDoesCrash(currentCarIndex, crashPosition);
|
track.carDoesCrash(currentCarIndex, crashPosition);
|
||||||
} else {
|
} else {
|
||||||
calculateWinner(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition(), currentCarIndex);
|
int newWinPoints = calculateNewWinPoints(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition());
|
||||||
|
if(newWinPoints == 1){
|
||||||
|
track.getCar(currentCarIndex).increaseWinPoints();
|
||||||
|
}else{
|
||||||
|
track.getCar(currentCarIndex).deductWinPoints();
|
||||||
|
}
|
||||||
track.moveCar(currentCarIndex);
|
track.moveCar(currentCarIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,43 +285,46 @@ public class Game implements GameSpecification {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) {
|
private int calculateNewWinPoints(PositionVector start, PositionVector finish) {
|
||||||
List<PositionVector> path = calculatePath(start, finish);
|
List<PositionVector> path = calculatePath(start, finish);
|
||||||
for (PositionVector point : path) {
|
for (PositionVector point : path) {
|
||||||
if (track.getSpaceType(point) != null) {
|
if (track.getSpaceType(point) != null) {
|
||||||
switch (track.getSpaceType(point)) {
|
switch (track.getSpaceType(point)) {
|
||||||
case FINISH_UP:
|
case FINISH_UP:
|
||||||
if (start.getY() < finish.getY()) {
|
if (start.getY() < finish.getY()) {
|
||||||
track.getCar(carIndex).increaseWinPoints();
|
return 1;
|
||||||
} else if (start.getY() > finish.getY()) {
|
} else if (start.getY() > finish.getY()) {
|
||||||
track.getCar(carIndex).deductWinPoints();
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FINISH_DOWN:
|
case FINISH_DOWN:
|
||||||
if (start.getY() > finish.getY()) {
|
if (start.getY() > finish.getY()) {
|
||||||
track.getCar(carIndex).increaseWinPoints();
|
return 1;
|
||||||
} else if (start.getY() < finish.getY()) {
|
} else if (start.getY() < finish.getY()) {
|
||||||
track.getCar(carIndex).deductWinPoints();
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FINISH_RIGHT:
|
case FINISH_RIGHT:
|
||||||
if (start.getX() < finish.getX()) {
|
if (start.getX() < finish.getX()) {
|
||||||
track.getCar(carIndex).increaseWinPoints();
|
return 1;
|
||||||
} else if (start.getX() > finish.getX()) {
|
} else if (start.getX() > finish.getX()) {
|
||||||
track.getCar(carIndex).deductWinPoints();
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FINISH_LEFT:
|
case FINISH_LEFT:
|
||||||
if (start.getX() > finish.getX()) {
|
if (start.getX() > finish.getX()) {
|
||||||
track.getCar(carIndex).increaseWinPoints();
|
return 1;
|
||||||
} else if (start.getX() < finish.getX()) {
|
} else if (start.getX() < finish.getX()) {
|
||||||
track.getCar(carIndex).increaseWinPoints();
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,128 @@
|
||||||
package ch.zhaw.pm2.racetrack.strategy;
|
package ch.zhaw.pm2.racetrack.strategy;
|
||||||
|
|
||||||
import ch.zhaw.pm2.racetrack.PositionVector;
|
import ch.zhaw.pm2.racetrack.PositionVector;
|
||||||
|
import ch.zhaw.pm2.racetrack.PositionVectorNotValid;
|
||||||
import ch.zhaw.pm2.racetrack.Track;
|
import ch.zhaw.pm2.racetrack.Track;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class PathFinderMoveStrategy implements MoveStrategy{
|
public class PathFinderMoveStrategy implements MoveStrategy{
|
||||||
private Track track;
|
private Track track;
|
||||||
private int carIndex;
|
private int carIndex;
|
||||||
private List<PositionVector.Direction> moveList;
|
private List<PositionVector.Direction> moveList;
|
||||||
private int pointer;
|
private int pointer;
|
||||||
|
private List<PositionVector.Direction> allDirections;
|
||||||
|
|
||||||
|
|
||||||
public PathFinderMoveStrategy(Track track, int carIndex) {
|
public PathFinderMoveStrategy(Track track, int carIndex) {
|
||||||
this.track = track;
|
this.track = track;
|
||||||
this.carIndex = carIndex;
|
this.carIndex = carIndex;
|
||||||
|
allDirections = Arrays.asList(PositionVector.Direction.values());
|
||||||
createMoveList();
|
createMoveList();
|
||||||
pointer = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void createMoveList(){
|
private void createMoveList(){
|
||||||
moveList = new ArrayList<>();
|
PossibleMove finishedMove = null;
|
||||||
|
List<PossibleMove> possibleMoves= new ArrayList<>();
|
||||||
|
for(PositionVector.Direction direction : allDirections){
|
||||||
|
possibleMoves.add(new PossibleMove(null, direction));
|
||||||
|
}
|
||||||
|
while(finishedMove == null){
|
||||||
|
List<PossibleMove> newMoves = new ArrayList<>();
|
||||||
|
for(PossibleMove previousMove : possibleMoves){
|
||||||
|
for(PositionVector.Direction direction : allDirections){
|
||||||
|
PossibleMove newMove = new PossibleMove(previousMove, direction);
|
||||||
|
|
||||||
|
if(! (newMove.crashed() || newMove.drivingLoop())){
|
||||||
|
newMoves.add(newMove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
possibleMoves = newMoves;
|
||||||
|
finishedMove = findFinishedMove(possibleMoves);
|
||||||
|
}
|
||||||
|
|
||||||
|
moveList = finishedMove.directions;
|
||||||
|
|
||||||
|
pointer = moveList.size();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private PossibleMove findFinishedMove(List<PossibleMove> moveList){
|
||||||
|
for(PossibleMove move : moveList){
|
||||||
|
if(move.finished()){
|
||||||
|
return move;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class PossibleMove {
|
||||||
|
List<PositionVector.Direction> directions;
|
||||||
|
List<PositionVector> positions;
|
||||||
|
PositionVector endVelocity;
|
||||||
|
|
||||||
|
public PossibleMove(PossibleMove previousMove, PositionVector.Direction nextDirection){
|
||||||
|
PositionVector startVelocity;
|
||||||
|
PositionVector startPosition;
|
||||||
|
positions = new ArrayList<>();
|
||||||
|
directions = new ArrayList<>();
|
||||||
|
if(previousMove != null){
|
||||||
|
positions.addAll(previousMove.positions);
|
||||||
|
directions.addAll(previousMove.directions);
|
||||||
|
startPosition = positions.get(positions.size()-1);
|
||||||
|
startVelocity = previousMove.endVelocity;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
startPosition = track.getCarPos(carIndex);
|
||||||
|
startVelocity = track.getCar(carIndex).getVelocity();
|
||||||
|
}
|
||||||
|
directions.add(nextDirection);
|
||||||
|
endVelocity = new PositionVector(startVelocity.getX() + nextDirection.vector.getX(), startVelocity.getY() + nextDirection.vector.getY());
|
||||||
|
positions.add(new PositionVector(startPosition.getX() + endVelocity.getX(), startPosition.getY() + endVelocity.getY()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean finished(){
|
||||||
|
for(PositionVector finishPosition : track.getFinishLine()){
|
||||||
|
if(finishPosition.equals(positions.get(positions.size()-1))){
|
||||||
|
return true; //TODO: check direction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean crashed() {
|
||||||
|
try {
|
||||||
|
if(track.willCrashAtPosition(carIndex, positions.get(positions.size()-1))){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (PositionVectorNotValid e) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean drivingLoop(){
|
||||||
|
for(int i = 0; i < positions.size()-1; i++){
|
||||||
|
if(positions.get(i).equals(positions.get(positions.size()-1))){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PositionVector.Direction nextMove() {
|
public PositionVector.Direction nextMove() {
|
||||||
pointer += 1;
|
pointer -= 1;
|
||||||
//TODO: Check if crash. if yes --> createMoveList();
|
//TODO: Check if crash. if yes --> createMoveList();
|
||||||
if (pointer < moveList.size()) {
|
if (pointer >= 0) {
|
||||||
return moveList.get(pointer);
|
return moveList.get(pointer);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Reference in New Issue