⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame1.java

📁 用java实现的汉诺塔游戏 用java实现的汉诺塔游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package hanio;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class Frame1 extends JFrame implements Runnable {
  JPanel contentPane;
  JButton jButton1 = new JButton();

  //Construct the frame
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception {
    contentPane = (JPanel)this.getContentPane();
    jButton1.setBackground(new Color(255, 255, 250));
    jButton1.setBounds(new Rectangle(181, 366, 105, 26));
    jButton1.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton1.setForeground(new Color(122, 150, 225));
    jButton1.setText("确定");
    jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
    contentPane.setLayout(null);
    this.getContentPane().setBackground(SystemColor.info);
    this.setForeground(Color.red);
    this.setIconImage(null);
    this.setSize(new Dimension(841, 528));
    this.setTitle(" 汉诺塔  软件工程(2)班 刘勋华 22");
    jTextArea1.setEnabled(true);
    jTextArea1.setForeground(new Color(122, 150, 222));
    jTextArea1.setBorder(BorderFactory.createEtchedBorder());
    jTextArea1.setOpaque(true);
    jTextArea1.setRequestFocusEnabled(false);
    jTextArea1.setDisabledTextColor(new Color(122, 150, 222));
    jTextArea1.setColumns(1200);
    jTextArea1.setLineWrap(true);
    jTextArea1.setRows(1200);
    jTextArea1.setWrapStyleWord(true);
    contentPane.addMouseListener(new Frame1_contentPane_mouseAdapter(this));
    jLabel1.setEnabled(true);
    jLabel1.setFont(new java.awt.Font("Dialog", 0, 13));
    jLabel1.setForeground(SystemColor.textHighlight);
    jLabel1.setText("输入盘数:[1,10]");
    jLabel1.setBounds(new Rectangle(32, 366, 90, 26));
    jOptionPane1.setBackground(new Color(255, 255, 225));
    jOptionPane1.setToolTipText("");
    jOptionPane1.setBounds(new Rectangle(282, 503, 187, 70));
    jButton2.setBackground(new Color(255, 255, 250));
    jButton2.setBounds(new Rectangle(416, 366, 109, 26));
    jButton2.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton2.setForeground(new Color(122, 150, 225));
    jButton2.setText("动画演示");
    jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this));
    jButton3.setBackground(new Color(255, 255, 250));
    jButton3.setBounds(new Rectangle(536, 366, 106, 26));
    jButton3.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton3.setForeground(new Color(122, 150, 225));
    jButton3.setText("文本显示");
    jButton3.addActionListener(new Frame1_jButton3_actionAdapter(this));
    jButton4.setBackground(new Color(255, 255, 250));
    jButton4.setBounds(new Rectangle(180, 398, 106, 26));
    jButton4.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton4.setForeground(new Color(122, 150, 225));
    jButton4.setText("清空重置");
    jButton4.addActionListener(new Frame1_jButton4_actionAdapter(this));
    jButton5.setBackground(new Color(255, 255, 250));
    jButton5.setBounds(new Rectangle(294, 366, 112, 27));
    jButton5.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton5.setForeground(new Color(122, 150, 225));
    jButton5.setText("手工操作");
    jButton5.addActionListener(new Frame1_jButton5_actionAdapter(this));
    jTextArea2.setBorder(BorderFactory.createEtchedBorder());
    jTextArea2.setBounds(new Rectangle(130, 366, 40, 26));
    jScrollPane1.setBounds(new Rectangle(668, 44, 133, 348));
    jLabel2.setFont(new java.awt.Font("Dialog", 0, 12));
    jLabel2.setForeground(SystemColor.inactiveCaption);
    jLabel2.setText("步数:");
    jLabel2.setBounds(new Rectangle(322, 398, 39, 27));
    jLabel3.setFont(new java.awt.Font("Dialog", 1, 16));
    jLabel3.setForeground(Color.red);
    jLabel3.setText("0");
    jLabel3.setBounds(new Rectangle(364, 397, 30, 27));
    jLabel4.setFont(new java.awt.Font("Dialog", 0, 12));
    jLabel4.setForeground(Color.red);
    jLabel4.setBounds(new Rectangle(34, 399, 146, 27));
    contentPane.setMaximumSize(new Dimension(808, 412));
    contentPane.setMinimumSize(new Dimension(808, 412));
    contentPane.addMouseMotionListener(new Frame1_contentPane_mouseMotionAdapter(this));
    jButton7.setBackground(new Color(255, 255, 250));
    jButton7.setBounds(new Rectangle(416, 397, 109, 26));
    jButton7.setFont(new java.awt.Font("Dialog", 0, 12));
    jButton7.setForeground(new Color(122, 150, 225));
    jButton7.setText("动画暂停");
    jButton7.addActionListener(new Frame1_jButton7_actionAdapter(this));
    contentPane.add(jOptionPane1, null);
    contentPane.add(jButton2, null);
    contentPane.add(jButton5, null);
    contentPane.add(jButton3, null);
    contentPane.add(jButton1, null);
    contentPane.add(jButton4, null);
    contentPane.add(jTextArea2, null);
    contentPane.add(jLabel1, null);
    contentPane.add(jLabel4, null);
    contentPane.add(jScrollPane1, null);
    contentPane.add(jButton7, null);
    contentPane.add(jLabel2, null);
    contentPane.add(jLabel3, null);
    jScrollPane1.getViewport().add(jTextArea1, null);
  }

  //Overridden so we can exit when window is closed
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  Color color;
  int n =0;//表示画笔的所画内容
  int disnum; //盘子总数
  int Adishremain=0, Bdishremain=0, Cdishremain=0;
  int step=0;String S;//计步数
  int i = 1;
  int  TowS,TowD;//TowS表示来源塔,TowD表示目标塔,=1表示塔A,=2表示塔B,=3表示塔C
  int[] TowA = new int[11];
  int[] TowB = new int[11];
  int[] TowC = new int[11];
  int[] Number=new int[11];
  int Ax[]={95,115,105};
  int Ay[]={90,90,110};
  int Bx[]={315,335,325};
  int By[]={90,90,110};
  int Cx[]={535,555,545};
  int Cy[]={90,90,110};
  int from=0;//1表示盘来自A塔,2表示盘来自B塔,3表示盘来自C塔
  int fromX=0;//来源塔的X坐标值
  int num=1;
  int stepcount=0;//记录动画演示过程的步数
  int x, y; //释放点的坐标
  int movX, movY, movW, movH;//记录要移动的盘子的坐标,长度,和高度
  int TowX, TowY;//记录要移动的盘子在塔的位置坐标
  boolean canmove = false;//表示能否移盘
  boolean ok=true,move=false,text=false,clean=false,hand=false,wait=false,
          suspend=false,MOV=false,HAND=false;
  String s;
  String c;
  String number;
  String STEP;
  private Thread animate= null ;//做动画的线程

  JTextArea jTextArea1 = new JTextArea();
  JLabel jLabel1 = new JLabel();
  ButtonGroup buttonGroup1 = new ButtonGroup();
  JOptionPane jOptionPane1 = new JOptionPane();
  JButton jButton2 = new JButton();
  JButton jButton3 = new JButton();
  JButton jButton4 = new JButton();
  JButton jButton5 = new JButton();
  JTextArea jTextArea2 = new JTextArea();
  JScrollPane jScrollPane1 = new JScrollPane();
  JLabel jLabel2 = new JLabel();
  JLabel jLabel3 = new JLabel();
  JLabel jLabel4 = new JLabel();
  JButton jButton7 = new JButton();

  public void update(Graphics g) {
    paint(g);
  }
  public void paint(Graphics g) {
  switch (n) {
        case 0://画塔和底座
        jTextArea2.requestFocusInWindow();
        super.paint(g);
        color = new Color(122, 150, 223);
        g.setColor(color);
        g.fill3DRect(100, 130, 10, 200,true);
        g.fill3DRect(320, 130, 10, 200,true);
        g.fill3DRect(540, 130, 10, 200,true);

        g.fill3DRect(50, 330, 110, 20,true);
        g.fill3DRect(270, 330, 110, 20,true);
        g.fill3DRect(490, 330, 110, 20,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString("TowerA",84,343);
        g.drawString("TowerB",304,343);
        g.drawString("TowerC",524,343);
        break;

      case 1: //画全部盘子
        for (i = 1; i <= disnum; i++) {
          color = new Color(255, 0, 0);
          g.setColor(color);
          g.fill3DRect((210-TowA[i])/2, 330 - 15 * i, TowA[i],10,true);

           number=number.valueOf(disnum+1-i);
           color = new Color(0, 0, 0);
           g.setColor(color);
           g.drawString(number,(2*(210-TowA[i])/2+TowA[i])/2-2,330 - 15 * i+9);}
           break;

      case 2: //A塔消盘
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(movX, movY, 100, 10);
        color = new Color(122, 150, 223);
        g.setColor(color);
        g.fill3DRect(100,130,10,TowY-130+15,true);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect(movX,110,movW,10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(210 - movW) / 2+movW)/2-2,110+10);
        break;

      case 3: //在B塔画盘
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(0, 110, 650, 10);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect( (650 - movW) / 2, 330 - 15 * (Bdishremain), movW, 10,true);

         color = new Color(0, 0, 0);
         g.setColor(color);
         g.drawString(number,(2*(650 - movW) / 2+movW)/2-2,330 - 15 * (Bdishremain)+9);
         break;

      case 4: //在C塔画盘
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(0, 110, 650, 10);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect( (1090 - movW) / 2, 330 - 15 * (Cdishremain), movW, 10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(1090 - movW) / 2+movW)/2-2,330 - 15 * (Cdishremain)+9);
        break;

      case 5: //B塔消盘
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(movX, movY, 100, 10);

        color = new Color(122, 150, 223);
        g.setColor(color);
        g.fill3DRect(320,130,10,TowY-130+15,true);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect(movX,110,movW,10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(650 - movW) / 2+movW)/2-2,110+10);
        break;

      case 6: //C塔消盘
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(movX, movY, 100, 10);

        color = new Color(122, 150, 223);
        g.setColor(color);
        g.fill3DRect(540,130,10,TowY-130+15,true);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect(movX,110,movW,10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(1090 - movW) / 2+movW)/2-2,110+10);
        break;

      case 7: //在A塔画盘

        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(0, 110, 650, 10);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect((210 - movW) / 2, 330 - 15 * (Adishremain), movW, 10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(210 - movW) / 2+movW)/2-2,330 - 15 * (Adishremain)+9);
        break;

      case 8://回画
        color = new Color(255, 255, 225);
        g.setColor(color);
        g.fillRect(0, 110, 650, 10);

        color = new Color(255, 0, 0);
        g.setColor(color);
        g.fill3DRect(movX, movY, movW, 10,true);

        color = new Color(0, 0, 0);
        g.setColor(color);
        g.drawString(number,(2*(fromX - movW) / 2+movW)/2-2,movY+9);
        break;

       case 9://A塔箭头
        g.fillRect(100,60,10,30);
        g.fillPolygon(Ax,Ay,3);
        break;

        case 10://B塔画箭头
        g.fillRect(320,60,10,30);
        g.fillPolygon(Bx,By,3);
        break;

        case 11://C塔画箭头
          g.fillRect(540,60,10,30);
          g.fillPolygon(Cx,Cy,3);
          break;

        case 12://清除箭头
          color = new Color(255, 255, 225);
          g.setColor(color);
          g.fillRect(50,60,600,50);
          break;
        }
  }


void jButton1_actionPerformed(ActionEvent e) {
if(ok){
    jLabel4.setText("");
    String s;
    s=jTextArea2.getText();
    int Ascii=s.hashCode();
    if(!((Ascii>48&&Ascii<58)||Ascii==1567)){jLabel4.setText("请输入1~10之间的数字");jTextArea2.setText("");ok=true;return;}
    ok=false;
    move=true;text=true;clean=true;suspend=false;MOV=true;HAND=true;//按确定之后其它按钮才有效
    int m = 1, j =100;

    for (m = 0; m <= 10; m++)
    {TowA[m] =0;TowB[m] =0;TowC[m] =0;}

    disnum = (int)(Double.parseDouble(jTextArea2.getText()));
    if(disnum>10||disnum<1){jTextArea2.setText("");jLabel4.setText("请输入1~10之间的数字");ok=true;return;}
    Adishremain = disnum;
    Bdishremain = 0;
    Cdishremain = 0;
    hand=false;
    for (m = 1; m <= disnum; m++) {
      TowA[m] = j;
      Number[(100-j)/8+1]=disnum+1-m;
      j = j -8;
    } //TowA[num]位于最顶

    j = 100;
    for (m = 1; m <= disnum; m++) {
      TowB[m] = j;}

    for (m = 1; m <= disnum; m++) {
      TowC[m] = j;}

    n = 1;
    repaint();}

    else{jLabel4.setText("请先按“清空重置”");}
  }


  void contentPane_mousePressed(MouseEvent e) {//按下鼠标
    if(hand){
    x = e.getX();
    y = e.getY();
    if ( (x >= 50) && (x <= 160) )
       { //A塔取盘
      if (Adishremain == 0)
        return;
      else {
        from=1;
        movX = (210 - TowA[Adishremain]) / 2;
        movY = 330 - 15 * (Adishremain);
        movW = TowA[Adishremain];
        movH = 10;
        number=number.valueOf( Number[(100-movW)/8+1]);
        TowX = 100;
        TowY = 330 - 15 * (Adishremain);
        Adishremain--; //
        canmove = true;
        n = 2;
        repaint();}
    }

    if ( (x >= 270) && (x <= 380))
       { //B塔取盘
      if (Bdishremain == 0)
        return;
      else {
        from=2;
        movX = (650 - TowB[Bdishremain]) / 2;
        movY = 330 - 15 * (Bdishremain);
        movW = TowB[Bdishremain];
        movH = 10;
 number=number.valueOf( Number[(100-movW)/8+1]);
        TowX = 320;
        TowY = 330 - 15 * (Bdishremain);
        Bdishremain--;
        canmove = true;
        n = 5;
        repaint();}
    }

    if ( (x >= 490 ) && (x <= 600) )
      { //C塔取盘
      if (Cdishremain == 0)
        return;
      else {
        from=3;
        movX =  (1090 - TowC[Cdishremain]) / 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -