Stone Game
<< Slider Puzzle | FinalProjectsTrailIndex | TileGridApplet >>
Stone.gif
Stone.java
import java.awt.Color; import info.gridworld.actor.Actor; public class Stone extends Actor { public Stone() { setColor(Color.WHITE); } public Stone(Color c) { setColor(c); } }
StoneGame.java
Here I put the burden of counting stones in the Game class rather than the the Stone class. While this will spot the maximum number in a row, it does not check for the end of the game nor who the winner is. Can you find a way to use setMessage
to identify the winner, or else to announce that it is a tie game?
import java.awt.Color; import java.util.ArrayList; import info.gridworld.actor.Actor; import info.gridworld.actor.ActorWorld; import info.gridworld.grid.BoundedGrid; import info.gridworld.grid.Grid; import info.gridworld.grid.Location; public class StoneGame extends ActorWorld { private int turn; private BoundedGrid gr; public StoneGame() { gr=new BoundedGrid(4,4); this.setGrid(gr); System.setProperty("info.gridworld.gui.selection", "hide"); System.setProperty("info.gridworld.gui.frametitle", "Stone Game"); System.setProperty("info.gridworld.gui.tooltips", "hide"); turn =0; setMessage("Try to get 4 in a row\n Yellow's Move"); } public boolean locationClicked(Location loc){ if (gr.get(loc)==null){ Color c=Color.YELLOW; setMessage("Try to get 4 in a row\n Green's Move"); turn++; if (turn%2==0) { c=Color.GREEN; setMessage("Try to get 4 in a row\n Yellow's Move"); } Stone s = new Stone(c); s.putSelfInGrid(gr, loc); setMessage(getMessage()+" Max in a row: "+getLargestInARow()); } return true; } public static void main(String[] args) { StoneGame game=new StoneGame(); game.show(); } public int numberInARow(Actor a, int dir){ int result = 1; ArrayList<Location> locs=new ArrayList<Location>(); Location next=a.getLocation(); //Follow the direction until the edge of the grid //Or no actor there while (gr.isValid(next)&& gr.get(next)!=null){ locs.add(next); next=next.getAdjacentLocation(dir); } //Find the colors until nothing there Color firstColor=a.getColor(); Color nextColor=firstColor; int i=1; while (i<locs.size()&& firstColor.equals(nextColor)){ Actor s=(Actor) gr.get(locs.get(i)); nextColor = s.getColor(); if (firstColor.equals(nextColor)) result++; i++; } return result; } public int getLargestInARow(){ int max=0; ArrayList<Location> stones=gr.getOccupiedLocations(); //inspect each stone's max run for (int i=0; i<stones.size();i++){ Actor s=(Actor) gr.get(stones.get(i)); int stoneMax=0; for(int dir=0;dir<180;dir+=45){ int n=numberInARow(s, dir); if (n>stoneMax) stoneMax=n; } if (stoneMax>max) max=stoneMax; } return max; } }