/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.scrabble.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.variable.PlanningVariable;
import org.optaplanner.examples.common.domain.AbstractPersistable;
import org.optaplanner.examples.scrabble.domain.solver.ScrabbleWordAssignmentDifficultyComparator;
@PlanningEntity(difficultyComparatorClass = ScrabbleWordAssignmentDifficultyComparator.class)
@XStreamAlias("ScrabbleWord")
public class ScrabbleWordAssignment extends AbstractPersistable {
private ScrabbleSolution solution;
private String word;
@PlanningVariable(valueRangeProviderRefs = {"startCellRange"})
private ScrabbleCell startCell;
@PlanningVariable(valueRangeProviderRefs = {"directionRange"})
private ScrabbleWordDirection direction;
public ScrabbleSolution getSolution() {
return solution;
}
public void setSolution(ScrabbleSolution solution) {
this.solution = solution;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public ScrabbleCell getStartCell() {
return startCell;
}
public void setStartCell(ScrabbleCell startCell) {
this.startCell = startCell;
}
public ScrabbleWordDirection getDirection() {
return direction;
}
public void setDirection(ScrabbleWordDirection direction) {
this.direction = direction;
}
// ************************************************************************
// Complex methods
// ************************************************************************
public String getLabel() {
return word;
}
public boolean isOutOfGrid() {
if (direction == null || startCell == null) {
return false;
}
switch (direction) {
case HORIZONTAL:
return startCell.getX() + word.length() > solution.getGridWidth();
case VERTICAL:
return startCell.getY() + word.length() > solution.getGridHeight();
default:
throw new IllegalStateException("The direction (" + direction + ") is not implemented.");
}
}
/**
* @return manhattan distance
*/
public int getDistanceToCenter() {
if (direction == null || startCell == null) {
return 0;
}
int centerX = solution.getGridWidth() / 2;
int centerY = solution.getGridHeight() / 2;
int x;
int y;
switch (direction) {
case HORIZONTAL:
x = startCell.getX() + word.length() / 2;
y = startCell.getY();
break;
case VERTICAL:
x = startCell.getX();
y = startCell.getY() + word.length() / 2;
break;
default:
throw new IllegalStateException("The direction (" + direction + ") is not implemented.");
}
return Math.abs(centerX - x) + Math.abs(centerY - y);
}
@Override
public String toString() {
return word;
}
}