home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 October / PCO1097.ISO / FilesBBS / FREI / TUBES.EXE / Puzzle.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-05-21  |  4.3 KB  |  231 lines

  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.Point;
  5. import java.awt.Polygon;
  6. import java.awt.Rectangle;
  7. import java.awt.image.ImageObserver;
  8. import java.util.Random;
  9. import java.util.Vector;
  10.  
  11. class Puzzle {
  12.    private Tubes _applet;
  13.    private int _diameter = 48;
  14.    private int _height = 6;
  15.    private int _margin = 12;
  16.    private int _size;
  17.    private Color _color;
  18.    private Image _supportImage;
  19.    private Image _marginImage;
  20.    private Image _segmentImage;
  21.    private Queue _upper;
  22.    private Queue _lower;
  23.  
  24.    Puzzle(Tubes var1, int var2) {
  25.       this._color = Tubes.colors[7];
  26.       this._applet = var1;
  27.       this._marginImage = this.makeBox(this._margin, this._diameter + 2 * this._margin, this._height, false, 0);
  28.       this._segmentImage = this.makeBox(this._diameter, this._diameter + 2 * this._margin, this._height, true, this._diameter / 2);
  29.       new Bead(this._applet, this._diameter / 2);
  30.       this.setSize(var2);
  31.    }
  32.  
  33.    private Image makeSupport() {
  34.       Rectangle var1 = (new IsoPoint(0, 0)).getBox(1, this._size * this._diameter + 2 * this._margin, this._diameter + 2 * this._margin);
  35.       Image var2 = this._applet.makeImage(var1.width, var1.height += 2 * this._height);
  36.       IsoPoint var3 = new IsoPoint(var1.width / 2, var1.height / 2);
  37.       var3.isoMove(this._diameter * this._size / 2 + this._margin / 2, 0, 0);
  38.       Graphics var4 = var2.getGraphics();
  39.       Image var5 = this._marginImage;
  40.       int var6 = var3.x;
  41.       int var7 = var3.y;
  42.       var4.drawImage(var5, var6 - var5.getWidth((ImageObserver)null) / 2, var7 - var5.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
  43.       var3.isoMove((-this._diameter - this._margin) / 2, 0, 0);
  44.       int var9 = 0;
  45.  
  46.       while(var9 < this._size) {
  47.          Image var10 = this._segmentImage;
  48.          var7 = var3.x;
  49.          int var8 = var3.y;
  50.          var4.drawImage(var10, var7 - var10.getWidth((ImageObserver)null) / 2, var8 - var10.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
  51.          ++var9;
  52.          var3.isoMove(-this._diameter, 0, 0);
  53.       }
  54.  
  55.       var3.isoMove((this._diameter - this._margin) / 2, 0, 0);
  56.       Image var11 = this._marginImage;
  57.       var7 = var3.x;
  58.       int var14 = var3.y;
  59.       var4.drawImage(var11, var7 - var11.getWidth((ImageObserver)null) / 2, var14 - var11.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
  60.       return this._applet.hollowImage(var2);
  61.    }
  62.  
  63.    private Image makeBox(int var1, int var2, int var3, boolean var4, int var5) {
  64.       Rectangle var6 = (new IsoPoint(0, 0)).getBox(1, var1, var2);
  65.       Image var7 = this._applet.makeImage(var6.width, var6.height += 2 * var3);
  66.       Graphics var8 = var7.getGraphics();
  67.       IsoPoint var9 = new IsoPoint(var6.width / 2, var6.height / 2);
  68.       var9.isoMove(0, 0, -var3 / 2);
  69.       Image var10 = this.makeCover(this._color.darker(), var1, var2, var4, var5);
  70.       int var11 = var9.x;
  71.       int var12 = var9.y;
  72.       var8.drawImage(var10, var11 - var10.getWidth((ImageObserver)null) / 2, var12 - var10.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
  73.       var9.isoMove(-var1 / 2, -var2 / 2, 0);
  74.       Polygon var14 = var9.createIsoRectangle(1, var1, var2);
  75.       var8.setColor(this._color.darker());
  76.       ((Point)var9).move(var14.xpoints[2], var14.ypoints[2]);
  77.       var8.fillPolygon(var9.createIsoRectangle(2, -var1, var3));
  78.       var8.fillPolygon(var9.createIsoRectangle(3, -var2, var3));
  79.       ((Point)var9).move(var14.xpoints[0], var14.ypoints[0]);
  80.       var8.fillPolygon(var9.createIsoRectangle(2, var1, var3));
  81.       var8.setColor(this._color.darker().darker());
  82.       var8.fillPolygon(var9.createIsoRectangle(3, var2, var3));
  83.       ((Point)var9).move(var6.width / 2, var6.height / 2);
  84.       var9.isoMove(0, 0, var3 / 2);
  85.       Image var15 = this.makeCover(this._color, var1, var2, var4, var5);
  86.       var12 = var9.x;
  87.       int var13 = var9.y;
  88.       var8.drawImage(var15, var12 - var15.getWidth((ImageObserver)null) / 2, var13 - var15.getHeight((ImageObserver)null) / 2, (ImageObserver)null);
  89.       return this._applet.hollowImage(var7);
  90.    }
  91.  
  92.    private Image makeCover(Color var1, int var2, int var3, boolean var4, int var5) {
  93.       Rectangle var6 = (new IsoPoint(0, 0)).getBox(1, var2, var3);
  94.       Image var7 = this._applet.makeImage(var6.width, var6.height);
  95.       Graphics var8 = var7.getGraphics();
  96.       var8.setColor(var1);
  97.       IsoPoint var9 = new IsoPoint(var6.width / 2, var6.height / 2);
  98.       var9.isoMove(-var2 / 2, -var3 / 2, 0);
  99.       var8.fillPolygon(var9.createIsoRectangle(1, var2, var3));
  100.       if (var4) {
  101.          var9.isoMove(var2 / 2, var3 / 2, 0);
  102.          var8.setColor(Hollow.color);
  103.          var9.fillIsoCircle(var8, var5);
  104.       }
  105.  
  106.       return this._applet.hollowImage(var7);
  107.    }
  108.  
  109.    void draw(Graphics var1) {
  110.       IsoPoint var2 = new IsoPoint(0, 0);
  111.       var2.isoMove(this._diameter * (this._size - 1) / 2, 0, 0);
  112.       IsoPoint var3 = new IsoPoint(var2.x, var2.y);
  113.       int var4 = this._size - 1;
  114.  
  115.       while(var4 >= 0) {
  116.          ((Slot)this._lower.at(var4)).draw(var1, var3, -this._height / 2, this._diameter / 2);
  117.          --var4;
  118.          var3.isoMove(-this._diameter, 0, 0);
  119.       }
  120.  
  121.       Image var5 = this._supportImage;
  122.       var1.drawImage(var5, -(var5.getWidth((ImageObserver)null) / 2), -(var5.getHeight((ImageObserver)null) / 2), (ImageObserver)null);
  123.       ((Point)var3).move(var2.x, var2.y);
  124.       int var6 = this._size - 1;
  125.  
  126.       while(var6 >= 0) {
  127.          ((Slot)this._upper.at(var6)).draw(var1, var3, this._height / 2, this._diameter / 2);
  128.          --var6;
  129.          var3.isoMove(-this._diameter, 0, 0);
  130.       }
  131.  
  132.    }
  133.  
  134.    void setSize(int var1) {
  135.       if (this._size != var1) {
  136.          this._size = var1;
  137.          this._supportImage = this.makeSupport();
  138.          this.goal();
  139.       }
  140.    }
  141.  
  142.    void goal() {
  143.       this._upper = new Queue(this._size + 1);
  144.       this._lower = new Queue(this._size + 1);
  145.  
  146.       for(int var1 = 0; var1 < this._size; ++var1) {
  147.          this._upper.append(new Slot(var1 + 1));
  148.          this._lower.append(new Slot(var1 + 1));
  149.  
  150.          for(int var2 = 0; var2 <= var1; ++var2) {
  151.             ((Slot)this._lower.at(var1)).prepend(new Bead(var1 + 1));
  152.          }
  153.       }
  154.  
  155.    }
  156.  
  157.    void left() {
  158.       this._upper.append(this._upper.getFirst());
  159.       this.gravity();
  160.    }
  161.  
  162.    void right() {
  163.       this._upper.prepend(this._upper.getLast());
  164.       this.gravity();
  165.    }
  166.  
  167.    void flip() {
  168.       Queue var1 = this._upper;
  169.       this._upper = this._lower;
  170.       this._lower = var1;
  171.       this.gravity();
  172.    }
  173.  
  174.    void gravity() {
  175.       for(int var1 = 0; var1 < this._size; ++var1) {
  176.          Slot var2 = (Slot)this._upper.at(var1);
  177.          Slot var3 = (Slot)this._lower.at(var1);
  178.  
  179.          while(!((Vector)var2).isEmpty() && !var3.isFull()) {
  180.             ((Queue)var3).prepend(((Queue)var2).getFirst());
  181.          }
  182.       }
  183.  
  184.    }
  185.  
  186.    void randomize() {
  187.       this.goal();
  188.       Random var1 = new Random();
  189.  
  190.       do {
  191.          for(int var2 = 0; var2 < this._size * this._size; ++var2) {
  192.             int var3 = var1.nextInt() % this._size;
  193.  
  194.             for(int var4 = 0; var4 < var3; ++var4) {
  195.                this.right();
  196.             }
  197.  
  198.             var3 = var1.nextInt() % 2;
  199.  
  200.             for(int var5 = 0; var5 < var3; ++var5) {
  201.                this.flip();
  202.             }
  203.  
  204.             var3 = var1.nextInt() % this._size;
  205.  
  206.             for(int var6 = 0; var6 < var3; ++var6) {
  207.                this.right();
  208.             }
  209.          }
  210.       } while(this.goal_p());
  211.  
  212.    }
  213.  
  214.    boolean goal_p() {
  215.       for(int var1 = 0; var1 < this._size; ++var1) {
  216.          Slot var2 = (Slot)this._lower.at(var1);
  217.          if (((Vector)var2).size() != var2.getColor()) {
  218.             return false;
  219.          }
  220.  
  221.          for(int var3 = 0; var3 < ((Vector)var2).size(); ++var3) {
  222.             if (var2.getColor() != ((Bead)((Queue)var2).at(var3)).getColor()) {
  223.                return false;
  224.             }
  225.          }
  226.       }
  227.  
  228.       return true;
  229.    }
  230. }
  231.