java汉诺塔_JAVA——汉诺塔

这个博客展示了如何使用JAVA创建一个汉诺塔问题的交互式界面。通过JFrame、JButton、JComboBox等组件,用户可以选择不同难度级别的汉诺塔问题,并进行设置、解决和清除操作。程序用Graphics2D绘制不同步骤的汉诺塔状态,允许用户前后浏览解决方案的步骤。
摘要由CSDN通过智能技术生成

1 import java.awt.event.*;2 import javax.swing.*;3 import java.awt.*;4 import java.util.*;5 import java.math.*;6

7 public class UI extendsJFrame{8

9 staticJPanel MainPanel,ButtonPanel,OpPanel;10 staticJLabel Steps;11 staticJButton Set,Solve,Clear;12 staticJComboBox Diff;13 static Font font = new Font("Times New Roman",Font.BOLD,20);14 static int[][] mmp = new int[3][20];15 static int[] Len = new int[3];16 static intnowPage;17 staticGraphics2D G;18 staticHanoi hanoi;19 staticJButton prev,next;20 publicUI(){21 this.setTitle("Tower of Hanoi");22

23 ButtonPanel = new JPanel(null);24 ButtonPanel.setBackground(Color.BLACK);25 ButtonPanel.setPreferredSize(new Dimension(800,50));26 this.add(ButtonPanel,BorderLayout.NORTH);27

28 Set = new JButton("Set");29 Set.setBounds(100,5,150,40);30 Set.setFont(font);31 Set.setEnabled(true);32 Set.setMargin(new Insets(0,0,0,0));33 Set.addActionListener(newActionListener() {34 public voidactionPerformed(ActionEvent e) {35 hanoi = new Hanoi(Diff.getSelectedIndex() + 1);36 G.setColor(Color.WHITE);37 G.fillRect(0, 0, 800, 600);38 Diff.setEnabled(false);39 nowPage = 0;40 Steps.setText("Step " +String.valueOf(nowPage));41 Draw(0,G);42 }43 });44 ButtonPanel.add(Set);45

46 Diff = newJComboBox();47 for(int i = 1;i <= 6;i ++){Diff.addItem(i);}48 Diff.setBounds(250,5,50,40);49 Diff.setFont(font);50 ButtonPanel.add(Diff);51

52 Clear = new JButton("Clear");53 Clear.setBounds(550,5,150,40);54 Clear.setFont(font);55 Clear.setEnabled(true);56 Clear.setMargin(new Insets(0,0,0,0));57 Clear.addActionListener(newActionListener() {58 public voidactionPerformed(ActionEvent e) {59 Diff.setEnabled(true);60 hanoi = null;61 Set.setEnabled(true);62 Solve.setEnabled(true);63 G.setColor(Color.WHITE);64 G.fillRect(0, 0, 800, 600);65 Steps.setText("Step Null");66 next.setEnabled(false);67 prev.setEnabled(false);68 }69 });70 ButtonPanel.add(Clear);71

72 Solve = new JButton("Solve");73 Solve.setBounds(350,5,150,40);74 Solve.setFont(font);75 Solve.setEnabled(true);76 Solve.setMargin(new Insets(0,0,0,0));77 Solve.addActionListener(newActionListener() {78 public voidactionPerformed(ActionEvent e) {79 if(hanoi == null) {return;}80 hanoi.Solve();81 Set.setEnabled(false);82 Solve.setEnabled(false);83 next.setEnabled(true);84 prev.setEnabled(true);85 }86 });87 ButtonPanel.add(Solve);88

89 OpPanel = new JPanel(null);90 OpPanel.setBackground(Color.BLACK);91 OpPanel.setPreferredSize(new Dimension(800,50));92 this.add(OpPanel,BorderLayout.SOUTH);93

94 prev = new JButton("<

111 next = new JButton(">>");112 next.setBounds(550,5,150,40);113 next.setFont(font);114 next.setEnabled(false);115 next.setMargin(new Insets(0,0,0,0));116 next.addActionListener(newActionListener() {117 public voidactionPerformed(ActionEvent e) {118 if(nowPage + 1 > hanoi.maxStep){return;}119 G.setColor(Color.WHITE);120 G.fillRect(0, 0, 800, 600);121 nowPage ++;122 Steps.setText("Step " +String.valueOf(nowPage));123 Draw(nowPage,G);124 }125 });126 OpPanel.add(next);127

128 Steps = new JLabel("Step Null",JLabel.CENTER);129 Steps.setBounds(300,5,150,40);130 Steps.setFont(new Font("Times New Roman",Font.BOLD,25));131 Steps.setForeground(Color.WHITE);132 OpPanel.add(Steps);133

134 MainPanel = newJPanel();135 MainPanel.setBackground(Color.WHITE);136 this.add(MainPanel);137 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);138 this.setSize(800, 600);139 Dimension winSize =Toolkit.getDefaultToolkit().getScreenSize();140 this.setLocation((winSize.width - this.getWidth()) / 2,(winSize.height - this.getHeight()) / 2);141 this.setResizable(false);142 this.setVisible(true);143 G =(Graphics2D)MainPanel.getGraphics();144 }145

146 public void Draw(intx,Graphics G) {147 G.setColor(Color.DARK_GRAY);148 G.fillRect(50, 350, 200, 30);149 G.fillRect(300, 350, 200, 30);150 G.fillRect(550, 350, 200, 30);151 G.setColor(Color.BLUE);152 for(int i = 0;i < hanoi.ans[x][0].size();i ++) {153 int s = hanoi.ans[x][0].get(i);154 G.drawRect(150 - 15 * s, 320 - 30 * i, 30 * s, 30);155 }156 for(int i = 0;i < hanoi.ans[x][1].size();i ++) {157 int s = hanoi.ans[x][1].get(i);158 G.drawRect(400 - 15 * s, 320 - 30 * i, 30 * s, 30);159 }160 for(int i = 0;i < hanoi.ans[x][2].size();i ++) {161 int s = hanoi.ans[x][2].get(i);162 G.drawRect(650 - 15 * s, 320 - 30 * i, 30 * s, 30);163 }164 }165

166 public static voidmain(String[] args) {167 newUI();168 }169

170 }

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class HannoiWindow extends JFrame implements ActionListener{ Tower tower=null; int amountOfDisc=3; char []towerName={'A','B','C'}; JMenuBar bar; JMenu menuGrade; JMenuItem oneGradeItem,twoGradeItem,threeGradeItem; JButton renew=null; JButton autoButton=null; JPanel center=new JPanel(); HannoiWindow(){ tower=new Tower(towerName); tower.setAmountOfDisc(amountOfDisc); tower.setMaxDiscWidth(120); tower.setMinDiscWidth(50); tower.setDiscHeight(16); tower.putDiscOnTower(); add(tower,BorderLayout.CENTER); bar=new JMenuBar(); menuGrade=new JMenu("选择级别"); oneGradeItem=new JMenuItem("初级"); twoGradeItem=new JMenuItem("中级"); threeGradeItem=new JMenuItem("高级"); menuGrade.add(oneGradeItem); menuGrade.add(twoGradeItem); menuGrade.add(threeGradeItem); bar.add(menuGrade); setJMenuBar(bar); oneGradeItem.addActionListener(this); twoGradeItem.addActionListener(this); threeGradeItem.addActionListener(this); renew=new JButton("重新开始"); renew.addActionListener(this); autoButton=new JButton("自动演示"); autoButton.addActionListener(this); JPanel north=new JPanel(); north.add(renew); north.add(autoButton); String mess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+ "座或"+towerName[2]+"座"; JLabel hintMess=new JLabel(mess,JLabel.CENTER); north.add(hintMess); add(north,BorderLayout.NORTH); setResizable(false); setVisible(true); setBounds(60,60,460,410); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ if(e.getSource()==oneGradeItem){ amountOfDisc=3; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); } else if(e.getSource()==twoGradeItem){ amountOfDisc=4; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); } else if(e.getSource()==threeGradeItem){ amountOfDisc=5; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); } else if(e.getSource()==renew){ tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); } else if(e.getSource()==autoButton){ tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); int x=this.getBounds().x+this.getBounds().width; int y=this.getBounds().y; tower.getAutoMoveDisc().setLocation(x,y); tower.getAutoMoveDisc().setSize(280,this.getBounds().height); tower.getAutoMoveDisc().setVisible(true); } validate(); } public static void main(String args[]){ new HannoiWindow(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值