home *** CD-ROM | disk | FTP | other *** search
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Image;
- import java.awt.Point;
- import java.awt.Polygon;
- import java.awt.Rectangle;
- import java.awt.image.ImageObserver;
- import java.util.Random;
- import java.util.Vector;
-
- class Puzzle {
- private Tubes _applet;
- private int _diameter = 48;
- private int _height = 6;
- private int _margin = 12;
- private int _size;
- private Color _color;
- private Image _supportImage;
- private Image _marginImage;
- private Image _segmentImage;
- private Queue _upper;
- private Queue _lower;
-
- Puzzle(Tubes var1, int var2) {
- this._color = Tubes.colors[7];
- this._applet = var1;
- this._marginImage = this.makeBox(this._margin, this._diameter + 2 * this._margin, this._height, false, 0);
- this._segmentImage = this.makeBox(this._diameter, this._diameter + 2 * this._margin, this._height, true, this._diameter / 2);
- new Bead(this._applet, this._diameter / 2);
- this.setSize(var2);
- }
-
- private Image makeSupport() {
- Rectangle var1 = (new IsoPoint(0, 0)).getBox(1, this._size * this._diameter + 2 * this._margin, this._diameter + 2 * this._margin);
- Image var2 = this._applet.makeImage(var1.width, var1.height += 2 * this._height);
- IsoPoint var3 = new IsoPoint(var1.width / 2, var1.height / 2);
- var3.isoMove(this._diameter * this._size / 2 + this._margin / 2, 0, 0);
- Graphics var4 = var2.getGraphics();
- Image var5 = this._marginImage;
- int var6 = var3.x;
- int var7 = var3.y;
- var4.drawImage(var5, var6 - var5.getWidth((ImageObserver)null) / 2, var7 - var5.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
- var3.isoMove((-this._diameter - this._margin) / 2, 0, 0);
- int var9 = 0;
-
- while(var9 < this._size) {
- Image var10 = this._segmentImage;
- var7 = var3.x;
- int var8 = var3.y;
- var4.drawImage(var10, var7 - var10.getWidth((ImageObserver)null) / 2, var8 - var10.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
- ++var9;
- var3.isoMove(-this._diameter, 0, 0);
- }
-
- var3.isoMove((this._diameter - this._margin) / 2, 0, 0);
- Image var11 = this._marginImage;
- var7 = var3.x;
- int var14 = var3.y;
- var4.drawImage(var11, var7 - var11.getWidth((ImageObserver)null) / 2, var14 - var11.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
- return this._applet.hollowImage(var2);
- }
-
- private Image makeBox(int var1, int var2, int var3, boolean var4, int var5) {
- Rectangle var6 = (new IsoPoint(0, 0)).getBox(1, var1, var2);
- Image var7 = this._applet.makeImage(var6.width, var6.height += 2 * var3);
- Graphics var8 = var7.getGraphics();
- IsoPoint var9 = new IsoPoint(var6.width / 2, var6.height / 2);
- var9.isoMove(0, 0, -var3 / 2);
- Image var10 = this.makeCover(this._color.darker(), var1, var2, var4, var5);
- int var11 = var9.x;
- int var12 = var9.y;
- var8.drawImage(var10, var11 - var10.getWidth((ImageObserver)null) / 2, var12 - var10.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
- var9.isoMove(-var1 / 2, -var2 / 2, 0);
- Polygon var14 = var9.createIsoRectangle(1, var1, var2);
- var8.setColor(this._color.darker());
- ((Point)var9).move(var14.xpoints[2], var14.ypoints[2]);
- var8.fillPolygon(var9.createIsoRectangle(2, -var1, var3));
- var8.fillPolygon(var9.createIsoRectangle(3, -var2, var3));
- ((Point)var9).move(var14.xpoints[0], var14.ypoints[0]);
- var8.fillPolygon(var9.createIsoRectangle(2, var1, var3));
- var8.setColor(this._color.darker().darker());
- var8.fillPolygon(var9.createIsoRectangle(3, var2, var3));
- ((Point)var9).move(var6.width / 2, var6.height / 2);
- var9.isoMove(0, 0, var3 / 2);
- Image var15 = this.makeCover(this._color, var1, var2, var4, var5);
- var12 = var9.x;
- int var13 = var9.y;
- var8.drawImage(var15, var12 - var15.getWidth((ImageObserver)null) / 2, var13 - var15.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
- return this._applet.hollowImage(var7);
- }
-
- private Image makeCover(Color var1, int var2, int var3, boolean var4, int var5) {
- Rectangle var6 = (new IsoPoint(0, 0)).getBox(1, var2, var3);
- Image var7 = this._applet.makeImage(var6.width, var6.height);
- Graphics var8 = var7.getGraphics();
- var8.setColor(var1);
- IsoPoint var9 = new IsoPoint(var6.width / 2, var6.height / 2);
- var9.isoMove(-var2 / 2, -var3 / 2, 0);
- var8.fillPolygon(var9.createIsoRectangle(1, var2, var3));
- if (var4) {
- var9.isoMove(var2 / 2, var3 / 2, 0);
- var8.setColor(Hollow.color);
- var9.fillIsoCircle(var8, var5);
- }
-
- return this._applet.hollowImage(var7);
- }
-
- void draw(Graphics var1) {
- IsoPoint var2 = new IsoPoint(0, 0);
- var2.isoMove(this._diameter * (this._size - 1) / 2, 0, 0);
- IsoPoint var3 = new IsoPoint(var2.x, var2.y);
- int var4 = this._size - 1;
-
- while(var4 >= 0) {
- ((Slot)this._lower.at(var4)).draw(var1, var3, -this._height / 2, this._diameter / 2);
- --var4;
- var3.isoMove(-this._diameter, 0, 0);
- }
-
- Image var5 = this._supportImage;
- var1.drawImage(var5, -(var5.getWidth((ImageObserver)null) / 2), -(var5.getHeight((ImageObserver)null) / 2), (ImageObserver)null);
- ((Point)var3).move(var2.x, var2.y);
- int var6 = this._size - 1;
-
- while(var6 >= 0) {
- ((Slot)this._upper.at(var6)).draw(var1, var3, this._height / 2, this._diameter / 2);
- --var6;
- var3.isoMove(-this._diameter, 0, 0);
- }
-
- }
-
- void setSize(int var1) {
- if (this._size != var1) {
- this._size = var1;
- this._supportImage = this.makeSupport();
- this.goal();
- }
- }
-
- void goal() {
- this._upper = new Queue(this._size + 1);
- this._lower = new Queue(this._size + 1);
-
- for(int var1 = 0; var1 < this._size; ++var1) {
- this._upper.append(new Slot(var1 + 1));
- this._lower.append(new Slot(var1 + 1));
-
- for(int var2 = 0; var2 <= var1; ++var2) {
- ((Slot)this._lower.at(var1)).prepend(new Bead(var1 + 1));
- }
- }
-
- }
-
- void left() {
- this._upper.append(this._upper.getFirst());
- this.gravity();
- }
-
- void right() {
- this._upper.prepend(this._upper.getLast());
- this.gravity();
- }
-
- void flip() {
- Queue var1 = this._upper;
- this._upper = this._lower;
- this._lower = var1;
- this.gravity();
- }
-
- void gravity() {
- for(int var1 = 0; var1 < this._size; ++var1) {
- Slot var2 = (Slot)this._upper.at(var1);
- Slot var3 = (Slot)this._lower.at(var1);
-
- while(!((Vector)var2).isEmpty() && !var3.isFull()) {
- ((Queue)var3).prepend(((Queue)var2).getFirst());
- }
- }
-
- }
-
- void randomize() {
- this.goal();
- Random var1 = new Random();
-
- do {
- for(int var2 = 0; var2 < this._size * this._size; ++var2) {
- int var3 = var1.nextInt() % this._size;
-
- for(int var4 = 0; var4 < var3; ++var4) {
- this.right();
- }
-
- var3 = var1.nextInt() % 2;
-
- for(int var5 = 0; var5 < var3; ++var5) {
- this.flip();
- }
-
- var3 = var1.nextInt() % this._size;
-
- for(int var6 = 0; var6 < var3; ++var6) {
- this.right();
- }
- }
- } while(this.goal_p());
-
- }
-
- boolean goal_p() {
- for(int var1 = 0; var1 < this._size; ++var1) {
- Slot var2 = (Slot)this._lower.at(var1);
- if (((Vector)var2).size() != var2.getColor()) {
- return false;
- }
-
- for(int var3 = 0; var3 < ((Vector)var2).size(); ++var3) {
- if (var2.getColor() != ((Bead)((Queue)var2).at(var3)).getColor()) {
- return false;
- }
- }
- }
-
- return true;
- }
- }
-