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:
Matthias Schiffer 2011-05-16 22:01:02 +02:00
parent 57227570fe
commit 604ef91282
7 changed files with 89 additions and 48 deletions

View file

@ -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() {

View file

@ -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();
}
}
}

View file

@ -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);

View file

@ -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);
}