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
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
Reference in a new issue