Added isValidPlacement() for checking after the fact whether a tile
placement is legal. git-svn-id: https://samskivert.googlecode.com/svn/trunk@350 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: TileUtil.java,v 1.1 2001/10/10 06:14:57 mdb Exp $
|
// $Id: TileUtil.java,v 1.2 2001/10/11 04:00:49 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.venison;
|
package com.threerings.venison;
|
||||||
|
|
||||||
@@ -65,6 +65,7 @@ public class TileUtil implements TileCodes
|
|||||||
} else if (sum == 1) {
|
} else if (sum == 1) {
|
||||||
// they're neighbors, we may have a match
|
// they're neighbors, we may have a match
|
||||||
int targetEdge = EDGE_MAP[(ydiff+1)*3 + xdiff+1];
|
int targetEdge = EDGE_MAP[(ydiff+1)*3 + xdiff+1];
|
||||||
|
|
||||||
// we want the edge of the placed tile that matches up
|
// we want the edge of the placed tile that matches up
|
||||||
// with the tile in the candidate location, but we also
|
// with the tile in the candidate location, but we also
|
||||||
// need to take into account the orientation of the placed
|
// need to take into account the orientation of the placed
|
||||||
@@ -104,6 +105,62 @@ public class TileUtil implements TileCodes
|
|||||||
return orients;
|
return orients;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the position and orientation of the target tile is
|
||||||
|
* legal given the placement of all of the existing tiles.
|
||||||
|
*
|
||||||
|
* @param tiles an iterator that enumerates all of the tile already on
|
||||||
|
* the board.
|
||||||
|
* @param target the tile whose validity we want to determine.
|
||||||
|
*
|
||||||
|
* @return true if the target tile is configured with a valid position
|
||||||
|
* and orientation, false if it is not.
|
||||||
|
*/
|
||||||
|
public static boolean isValidPlacement (
|
||||||
|
Iterator tiles, VenisonTile target)
|
||||||
|
{
|
||||||
|
boolean matchedAnEdge = false;
|
||||||
|
|
||||||
|
while (tiles.hasNext()) {
|
||||||
|
VenisonTile tile = (VenisonTile)tiles.next();
|
||||||
|
|
||||||
|
// figure out where this tile is in relation to the candidate
|
||||||
|
int xdiff = tile.x - target.x;
|
||||||
|
int ydiff = tile.y - target.y;
|
||||||
|
int sum = Math.abs(xdiff) + Math.abs(ydiff);
|
||||||
|
|
||||||
|
if (sum == 0) {
|
||||||
|
// they overlap, nothing doing
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} else if (sum == 1) {
|
||||||
|
// they're neighbors, we may have a match
|
||||||
|
int targetEdge = EDGE_MAP[(ydiff+1)*3 + xdiff+1];
|
||||||
|
|
||||||
|
// we want the edge of the placed tile that matches up
|
||||||
|
// with the tile in the candidate location, but we also
|
||||||
|
// need to take into account the orientation of the placed
|
||||||
|
// tile
|
||||||
|
int tileEdge = (targetEdge+(4-tile.orientation)+2) % 4;
|
||||||
|
|
||||||
|
// see if the edges match
|
||||||
|
if (getEdge(tile.type, tileEdge) ==
|
||||||
|
getEdge(target.type, targetEdge)) {
|
||||||
|
// make a note that we matched at least one edge
|
||||||
|
matchedAnEdge = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// the edges don't match, nothing doing
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we got this far, we didn't have any mismatches, so we need
|
||||||
|
// only know that we matched at least one edge
|
||||||
|
return matchedAnEdge;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the edge type for specified edge of the specified tile
|
* Returns the edge type for specified edge of the specified tile
|
||||||
* type.
|
* type.
|
||||||
|
|||||||
Reference in New Issue
Block a user