Fix dealing stones for more than 2 rows
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@244 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
57227570fe
commit
604ef91282
7 changed files with 89 additions and 48 deletions
|
@ -149,17 +149,26 @@ public class RoundControl {
|
|||
return ret;
|
||||
}
|
||||
|
||||
void dealStone() {
|
||||
gameState
|
||||
.getActivePlayer()
|
||||
.getHand()
|
||||
.drop(gameState.getGameHeap().drawStone(),
|
||||
new Position(Hand.WIDTH - 1, Hand.HEIGHT - 1));
|
||||
void dealStones(int count) {
|
||||
IHand hand = gameState.getActivePlayer().getHand();
|
||||
int rowCount = hand.getRowCount();
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (hand.getFreeRowSpace(rowCount - 1) == 0) {
|
||||
rowCount++;
|
||||
}
|
||||
|
||||
hand.drop(gameState.getGameHeap().drawStone(), new Position(
|
||||
Hand.WIDTH - 1, rowCount - 1));
|
||||
}
|
||||
}
|
||||
|
||||
private void dealStone() {
|
||||
dealStones(1);
|
||||
}
|
||||
|
||||
private void dealPenalty(int count) {
|
||||
for (int i = 0; i < count + 3; ++i)
|
||||
dealStone();
|
||||
dealStones(count + 3);
|
||||
}
|
||||
|
||||
private void win() {
|
||||
|
|
|
@ -247,11 +247,6 @@ public class TurnControl {
|
|||
if (x >= Hand.WIDTH) {
|
||||
x = 0;
|
||||
y++;
|
||||
|
||||
if (y >= Hand.HEIGHT) {
|
||||
// TODO We can't handle this yet...
|
||||
throw new ArrayIndexOutOfBoundsException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,22 +10,31 @@ public class Hand extends StoneTray<Stone> implements IHand {
|
|||
* The width of the hand
|
||||
*/
|
||||
public final static int WIDTH = 14;
|
||||
/**
|
||||
* The height of the hand
|
||||
*/
|
||||
@Deprecated
|
||||
public final static int HEIGHT = 2;
|
||||
|
||||
private boolean rowIsFull(float row) {
|
||||
@Override
|
||||
public int getFreeRowSpace(int row) {
|
||||
int count = 0;
|
||||
for (Pair<Stone, Position> entry : this) {
|
||||
if (entry.getSecond().getY() == row) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count == WIDTH;
|
||||
return WIDTH - count;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
int rows = 0;
|
||||
|
||||
for (Pair<Stone, Position> entry : this) {
|
||||
if (entry.getSecond().getY() > rows) {
|
||||
rows = (int) entry.getSecond().getY();
|
||||
}
|
||||
}
|
||||
|
||||
return rows + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Pair<Position, Direction> fixInvalidDrop(Stone stone, Position pos,
|
||||
Direction dir) {
|
||||
|
@ -38,7 +47,7 @@ public class Hand extends StoneTray<Stone> implements IHand {
|
|||
if (x < 0) {
|
||||
return new Pair<Position, Direction>(new Position(0, y), RIGHT);
|
||||
} else {
|
||||
if (rowIsFull(y)) {
|
||||
if (getFreeRowSpace((int) y) == 0) {
|
||||
return new Pair<Position, Direction>(new Position(0, y + 1), RIGHT);
|
||||
} else {
|
||||
return new Pair<Position, Direction>(new Position(WIDTH - 1, y), LEFT);
|
||||
|
|
|
@ -5,4 +5,19 @@ package jrummikub.model;
|
|||
*/
|
||||
public interface IHand extends IStoneTray<Stone> {
|
||||
|
||||
/**
|
||||
* The number of used rows
|
||||
*
|
||||
* @return the number of rows
|
||||
*/
|
||||
int getRowCount();
|
||||
|
||||
/**
|
||||
* Gets the amount of free space in a hand row
|
||||
*
|
||||
* @param row
|
||||
* the row number
|
||||
* @return the number of stones that can fit into the row
|
||||
*/
|
||||
int getFreeRowSpace(int row);
|
||||
}
|
||||
|
|
Reference in a new issue