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

@ -65,4 +65,15 @@ public class MockHand implements IHand {
return null; return null;
} }
} }
@Override
public int getRowCount() {
return 0;
}
@Override
public int getFreeRowSpace(int row) {
// TODO Auto-generated method stub
return 0;
}
} }

View file

@ -7,7 +7,7 @@ import java.awt.Color;
*/ */
public class MockPlayer implements IPlayer { public class MockPlayer implements IPlayer {
/** */ /** */
public MockHand hand; public Hand hand;
/** */ /** */
public String name; public String name;
/** */ /** */
@ -20,7 +20,7 @@ public class MockPlayer implements IPlayer {
* the player color * the player color
*/ */
public MockPlayer(String name, Color color) { public MockPlayer(String name, Color color) {
hand = new MockHand(); hand = new Hand();
this.name = name; this.name = name;
this.color = color; this.color = color;
} }

View file

@ -149,17 +149,26 @@ public class RoundControl {
return ret; return ret;
} }
void dealStone() { void dealStones(int count) {
gameState IHand hand = gameState.getActivePlayer().getHand();
.getActivePlayer() int rowCount = hand.getRowCount();
.getHand()
.drop(gameState.getGameHeap().drawStone(), for (int i = 0; i < count; ++i) {
new Position(Hand.WIDTH - 1, Hand.HEIGHT - 1)); 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) { private void dealPenalty(int count) {
for (int i = 0; i < count + 3; ++i) dealStones(count + 3);
dealStone();
} }
private void win() { private void win() {

View file

@ -247,11 +247,6 @@ public class TurnControl {
if (x >= Hand.WIDTH) { if (x >= Hand.WIDTH) {
x = 0; x = 0;
y++; 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 * The width of the hand
*/ */
public final static int WIDTH = 14; 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; int count = 0;
for (Pair<Stone, Position> entry : this) { for (Pair<Stone, Position> entry : this) {
if (entry.getSecond().getY() == row) { if (entry.getSecond().getY() == row) {
count++; 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 @Override
protected Pair<Position, Direction> fixInvalidDrop(Stone stone, Position pos, protected Pair<Position, Direction> fixInvalidDrop(Stone stone, Position pos,
Direction dir) { Direction dir) {
@ -38,7 +47,7 @@ public class Hand extends StoneTray<Stone> implements IHand {
if (x < 0) { if (x < 0) {
return new Pair<Position, Direction>(new Position(0, y), RIGHT); return new Pair<Position, Direction>(new Position(0, y), RIGHT);
} else { } else {
if (rowIsFull(y)) { if (getFreeRowSpace((int) y) == 0) {
return new Pair<Position, Direction>(new Position(0, y + 1), RIGHT); return new Pair<Position, Direction>(new Position(0, y + 1), RIGHT);
} else { } else {
return new Pair<Position, Direction>(new Position(WIDTH - 1, y), LEFT); 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> { 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);
} }

View file

@ -15,6 +15,8 @@ import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import jrummikub.model.Hand;
import jrummikub.model.IHand;
import jrummikub.model.MockGameState; import jrummikub.model.MockGameState;
import jrummikub.model.MockTable; import jrummikub.model.MockTable;
import jrummikub.model.Position; import jrummikub.model.Position;
@ -52,11 +54,9 @@ public class RoundControlTest {
private void checkCorrectlyDealed() { private void checkCorrectlyDealed() {
assertEquals(106 - testGameState.getPlayerCount() * 14 assertEquals(106 - testGameState.getPlayerCount() * 14
- testGameState.table.getSize(), testGameState.getGameHeap() - testGameState.table.getSize(), testGameState.getGameHeap().getSize());
.getSize());
for (int i = 0; i < testGameState.getPlayerCount(); i++) { for (int i = 0; i < testGameState.getPlayerCount(); i++) {
assertEquals(14, testGameState.getNthNextPlayer(i).getHand() assertEquals(14, testGameState.getNthNextPlayer(i).getHand().getSize());
.getSize());
} }
} }
@ -91,27 +91,28 @@ public class RoundControlTest {
view.getTablePanel().rightPlayerName = null; view.getTablePanel().rightPlayerName = null;
view.displayStartTurnPanel = false; view.displayStartTurnPanel = false;
} }
/** */ /** */
@Test @Test
public void playerCameOutCorrectly(){ public void playerCameOutCorrectly() {
MockTable oldTable = new MockTable(); MockTable oldTable = new MockTable();
MockTable newTable = new MockTable(); MockTable newTable = new MockTable();
Stone blueTen = new Stone(10, BLUE); Stone blueTen = new Stone(10, BLUE);
Stone redTen = new Stone(10, RED); Stone redTen = new Stone(10, RED);
Stone blackTen = new Stone(10, BLACK); Stone blackTen = new Stone(10, BLACK);
} }
/** */ /** */
@Test @Test
public void testDealStone() { public void testDealStones() {
testRound.deal(); testRound.deal();
checkCorrectlyDealed(); checkCorrectlyDealed();
for (int i = 0; i < 28 - 14; i++) { for (int i = 0; i < 14; i++) {
testRound.dealStone(); testRound.dealStones(2);
} }
assertEquals(28, testGameState.getActivePlayer().getHand().getSize()); assertEquals(2 * 14 + 14, testGameState.getActivePlayer().getHand()
.getSize());
} }
/** */ /** */
@ -150,7 +151,9 @@ public class RoundControlTest {
view.startTurnEvent.emit(); view.startTurnEvent.emit();
assertFalse(view.displayStartTurnPanel); assertFalse(view.displayStartTurnPanel);
testGameState.players.get(0).hand.stones.remove(0);
IHand hand = testGameState.players.get(0).hand;
hand.pickUp(hand.iterator().next().getFirst());
resetTurnStart(); resetTurnStart();
view.getPlayerPanel().endTurnEvent.emit(); view.getPlayerPanel().endTurnEvent.emit();
@ -170,8 +173,9 @@ public class RoundControlTest {
view.startTurnEvent.emit(); view.startTurnEvent.emit();
assertFalse(view.displayStartTurnPanel); assertFalse(view.displayStartTurnPanel);
Stone stone = testGameState.players.get(0).hand.stones.remove(0) IHand hand = testGameState.players.get(0).hand;
.getFirst(); Stone stone = hand.iterator().next().getFirst();
hand.pickUp(stone);
newTable.drop(new StoneSet(stone), new Position(0, 0)); newTable.drop(new StoneSet(stone), new Position(0, 0));
resetTurnStart(); resetTurnStart();
view.getPlayerPanel().endTurnEvent.emit(); view.getPlayerPanel().endTurnEvent.emit();
@ -232,10 +236,11 @@ public class RoundControlTest {
view.startTurnEvent.emit(); view.startTurnEvent.emit();
assertFalse(view.displayStartTurnPanel); assertFalse(view.displayStartTurnPanel);
Stone stone = testGameState.players.get(0).hand.stones.remove(0) IHand hand = testGameState.players.get(0).hand;
.getFirst(); Stone stone = hand.iterator().next().getFirst();
hand.pickUp(stone);
newTable.drop(new StoneSet(stone), new Position(0, 0)); newTable.drop(new StoneSet(stone), new Position(0, 0));
testGameState.players.get(0).hand.stones.clear(); testGameState.players.get(0).hand = new Hand();
resetTurnStart(); resetTurnStart();
view.getPlayerPanel().endTurnEvent.emit(); view.getPlayerPanel().endTurnEvent.emit();
@ -253,15 +258,12 @@ public class RoundControlTest {
Stone blueTwo = new Stone(2, BLUE); Stone blueTwo = new Stone(2, BLUE);
Stone blueThree = new Stone(3, BLUE); Stone blueThree = new Stone(3, BLUE);
Stone blueFour = new Stone(4, BLUE); Stone blueFour = new Stone(4, BLUE);
StoneSet oldSet1 = new StoneSet( StoneSet oldSet1 = new StoneSet(Arrays.asList(blueOne, redOne, blackOne));
Arrays.asList(blueOne, redOne, blackOne));
StoneSet oldSet2 = new StoneSet(blueTwo); StoneSet oldSet2 = new StoneSet(blueTwo);
oldTable.drop(oldSet1, new Position(0, 0)); oldTable.drop(oldSet1, new Position(0, 0));
oldTable.drop(oldSet2, new Position(0, 0)); oldTable.drop(oldSet2, new Position(0, 0));
StoneSet newSet1 = new StoneSet(Arrays.asList(blueOne, blueTwo, StoneSet newSet1 = new StoneSet(Arrays.asList(blueOne, blueTwo, blueFour));
blueFour)); StoneSet newSet2 = new StoneSet(Arrays.asList(redOne, blackOne, blueThree));
StoneSet newSet2 = new StoneSet(Arrays.asList(redOne, blackOne,
blueThree));
newTable.drop(newSet1, new Position(0, 0)); newTable.drop(newSet1, new Position(0, 0));
newTable.drop(newSet2, new Position(0, 0)); newTable.drop(newSet2, new Position(0, 0));