// Lyn's Recursion Examples // CS111 , 3/18/98 import java.awt.*; public class CountingWorld extends BuggleWorld { Randomizer rand = new Randomizer(); public void resetButtonHook() { // Extend default state initialization to add bagels trail as well. int side = rand.intBetween(5,10); setDimensions(side, side); int bagels = rand.intBetween(5,25); setDimensions(side, side); placeBagels(bagels, side); } public void placeBagels(int bagels, int n) { if (bagels > 0) { int x = rand.intBetween(1,n); int y = rand.intBetween(1,n); if (isBagelAt(new Point(x,y))) { //System.out.println("lose (" + x + ", " + y + ")"); // We lose; try again! placeBagels(bagels, n); } else { // We win; place a bagel //System.out.println("win (" + x + ", " + y + ")"); addBagel(new Point(x,y)); placeBagels(bagels - 1, n); } } } public Direction eastOrWest () { int dir = rand.intBetween(1,2); if (dir == 1) { return Direction.EAST; } else { return Direction.WEST; } } public Point randomPoint (int n) { return new Point (rand.intBetween(1,n), rand.intBetween(1,n)); } public void run () { boolean seeBagels; int numBagels; Counter carol = new Counter(); carol.brushUp(); System.out.println("Carol can see bagels: " + carol.canSeeBagel()); /* System.out.println("Carol counts " + carol.countBagels() + " bagels"); System.out.println("Carol counts in " + carol.countBagelsIn() + " bagels"); if(carol.canSeeBagel()){ System.out.println("Carol sees " + carol.countBagels() + " bagels"); } */ } } class Counter extends Buggle { public boolean canSeeBagel(){ boolean result; if (isOverBagel()){ result = true; }else if (isFacingWall()){ result = false; }else { forward(); result = canSeeBagel(); backward(); } return result; } public int countBagels(){ int numBagels; if(isFacingWall()){ if(isOverBagel()){ numBagels = 1; }else{ numBagels = 0; } }else{ forward(); numBagels = countBagels(); backward(); if(isOverBagel()){ numBagels = numBagels + 1; } } return numBagels; } public int countBagelsIn(){ return countUp(0); } public int countUp(int bagelsSeen){ int totalBagels; if(isFacingWall()){ if(isOverBagel()){ totalBagels = bagelsSeen + 1; }else{ totalBagels = bagelsSeen; } }else{ if(isOverBagel()){ forward(); totalBagels = countUp(bagelsSeen + 1); backward(); }else{ forward(); totalBagels = countUp(bagelsSeen); backward(); } } return totalBagels; } }