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

📄 hanoi.java

📁 java编写的一个小游戏(汉诺塔游戏
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		
		Close.setBackground(Color.white);
		Close.setBorder(border2);
		Close.setFont(defaultFont);
		Close.setText("关闭");
		jPanel3.add(Close);
		Close.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) { setVisible(false); }
		});

		this.setLocationRelativeTo(null);	
		this.setModal(true);	
		this.show();
	}
	
}


//*******************************帮助dialog*****************************
class DialogHelp extends JDialog
{
	JScrollPane scrollPane ;
	Border border1 = new EmptyBorder(20,15,5,15);
    Border border2 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,
			new Color(204,236,255),
			new Color(204,236,255),					//43, 66, 97
			new Color(45, 92, 162),
			new Color(45, 92, 162));
	JPanel Panel1 = new JPanel();
	JPanel Panel2 = new JPanel(new BorderLayout());
	JButton Close = new JButton();
	Font defaultFont = new Font("宋体",Font.PLAIN,12);
	JTextArea jTextArea = new JTextArea();
	
	public DialogHelp(JFrame frame) throws HeadlessException 
	{
		super(frame, true);	
		this.setSize(new Dimension(300, 200));
		this.setTitle("帮  助  ");

		jTextArea.setEditable(false);
		jTextArea.setText("  关于汉诺塔\n\n"
						+"  在印度,有这么一个古老的传说:\n"
						+"  在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。\n"
						+"  印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。\n"
						+"  不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。\n"
						+"  僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。\n\n"
						+"  后来,这个传说就演变为汉诺塔游戏:\n"
						+"  1.有三根杆子A,B,C。A杆上有若干盘子\n"
						+"  2.每次移动一块盘子,小的只能叠在大的上面 \n"
						+"  3.把所有碟子从A杆全部移到C杆上\n\n"
						+"  游戏说明:\n"
						+"    规则:每次只能移动箭头所指向的柱子上的盘子。\n"
						+"    操作:\n"
						+"     D:向左移动箭头  K:向右移动箭头\n"
						+"     F:向左移动碟子  J:向右移动碟子\n");
		jTextArea.setLineWrap(true);
		jTextArea.setForeground(new Color(55, 77, 118));
		scrollPane = new JScrollPane(jTextArea);
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setBorder(border2);
		scrollPane.setOpaque(false);
		scrollPane.setPreferredSize(new Dimension(240,110));
		
		Close.setBackground(Color.white);
		Close.setActionCommand("jButton1");
		Close.setText("关闭");
		Close.setFont(defaultFont);
		Close.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) { setVisible(false); }
		});

		Panel1.setSize(new Dimension(200,40));
		Panel1.setBorder(new EmptyBorder(0,0,5,0));
		Panel1.setBackground(new Color(185,211,238));
		Panel1.add(Close, null);
		JPanel p1 = new JPanel();
		p1.add(scrollPane);	
		p1.setBackground(new Color(185,211,238));
		JPanel p2 = new JPanel();
		p2.setBackground(new Color(185,211,238));
		p2.setPreferredSize(new Dimension(300,7));
		this.add(p2,BorderLayout.NORTH); 	
		this.add(Panel1,BorderLayout.SOUTH);
		this.add(p1, BorderLayout.CENTER);
		this.setLocationRelativeTo(null);
		this.setModal(true);
		this.show();
	}
}


//******************************首选项dialog*****************************
class ButtonPanel extends JPanel
{
	private ButtonGroup group ;
	JRadioButton b[] ;
	int n ;
	Font defaultFont = new Font("宋体",Font.PLAIN,13);
	
	public ButtonPanel(String title , String[] options)
	{
		setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),title));
		setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
		group = new ButtonGroup();
		b = new JRadioButton[options.length];
		for(int i = 0 ; i < options.length ; i ++)
		{
			b[i] = new JRadioButton(" "+options[i]);
			b[i].setFocusable(false);
			b[i].setFont(defaultFont);
			b[i].setActionCommand(options[i]);
			add(b[i]);
			group.add(b[i]);
		}
		n = 0 ;
		b[n].setSelected(true);
	}
	
	public void setSelect(int n)
	{
		b[n].setSelected(true);
	}
	
	public String getSelection()   
 	{
		return group.getSelection().getActionCommand();
	}
}

class DialogOption extends JDialog implements ActionListener
{
	Hanoi mainFrame ;
	private ButtonPanel ratePanel ;
	private ButtonPanel soundPanel ;
	private ButtonPanel musicPanel ;
	private JButton close ;
	
	public DialogOption(Hanoi f)
	{
		super(f,true);
		mainFrame = f ;
		setTitle("首 选 项 ");
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		Font defaultFont = new Font("宋体",Font.PLAIN,13);		
		
		JPanel gridPanel = new JPanel();
		gridPanel.setPreferredSize(new Dimension(300,195));
		gridPanel.setLayout(new GridLayout(1,2));
		gridPanel.setBorder(new EmptyBorder(5,10,5,10));
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2,1));
		panel.setBorder(new EmptyBorder(0,0,0,5));
			
		soundPanel = new ButtonPanel("音效",new String[]
		{
			"开",
			"关"
		});
		soundPanel.setSelect(1);
		musicPanel = new ButtonPanel("背景音乐",new String[]
		{
			"开",
			"关"
		});
		musicPanel.setSelect(1);
		panel.add(soundPanel);
		panel.add(musicPanel);
		
		ratePanel = new ButtonPanel("演示速度",new String[]
		{
			"1倍速",
			"2倍速",
			"3倍速",
			"4倍速"
		});
		ratePanel.setSelect(3-(int)(Math.log(mainFrame.getDelay()/50)/Math.log(2)));
		gridPanel.add(panel);
		gridPanel.add(ratePanel);
		
		JPanel p = new JPanel();
		p.setPreferredSize(new Dimension(300,40));
		close = new JButton("关闭");
		close.setActionCommand("关闭");
		close.setBackground(Color.white);
		close.setFont(defaultFont);
		close.setFocusable(false);
		close.addActionListener(this); 
		p.add(close);
		
		this.add(gridPanel , BorderLayout.CENTER);
		this.add(p , BorderLayout.SOUTH);	
		this.setSize(new Dimension(300,235));
		this.setLocationRelativeTo(null);
		this.show();
	}
	
	public void actionPerformed(ActionEvent e) 
	{ 
		if(ratePanel.getSelection() == "1倍速")
		{
			mainFrame.setDelay(400);
		}
		else if(ratePanel.getSelection() == "2倍速")
		{
			mainFrame.setDelay(200);
		}
		else if(ratePanel.getSelection() == "3倍速")
		{
			mainFrame.setDelay(100);
		}
		else if(ratePanel.getSelection() == "4倍速")
		{
			mainFrame.setDelay(50);
		}
		
		setVisible(false); 
	}


}


//*******************************盘数自定义dialog**************************
class DialogCustomDisk extends JDialog implements ChangeListener
{
	Hanoi mainFrame ;
	JPanel panel = new JPanel();
	JSlider slider = new JSlider(3,10,3);
	JLabel label = new JLabel("盘 数 : ");
	JButton close = new JButton("关闭");
	Font labelFont = new Font("宋体",Font.PLAIN,14);
	Font buttonFont = new Font("宋体",Font.PLAIN,13);
	
	public DialogCustomDisk(Hanoi f)
	{
		super(f, true);	
		mainFrame = f ;
		this.setSize(new Dimension(300, 150));
		this.setTitle("设置盘数");
		slider.setMajorTickSpacing(1);		//显示标尺,每单元现实一个大标尺
		slider.setPaintTicks(true);			//显示标尺
		slider.setSnapToTicks(true);		//强制滑块对齐标尺
		slider.setPaintLabels(true);		//给达标尺添加标尺标签
		slider.addChangeListener(this);
		label.setFont(labelFont);
		close.setBackground(Color.white);
		close.setFont(buttonFont);
		close.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) { setVisible(false); }
		});
		panel.add(label);
		panel.add(slider);
		panel.add(close);
		panel.setBorder(new EmptyBorder(10,5,10,5));
		panel.setLayout(new FlowLayout(FlowLayout.CENTER,5,10));
		this.add(panel,BorderLayout.CENTER);
		this.setLocationRelativeTo(null);
		this.show();
	}
	
	public void stateChanged(ChangeEvent event)
	{
		int diskNum = slider.getValue();
		mainFrame.setDiskTotalNum(diskNum) ;
	}
}


//******************************passGameDialog*****************************
class DialogPassGame extends JDialog 
{
	private Hanoi mainFrame ;
	
	public DialogPassGame(Hanoi f)
	{
		super(f,true) ;
		mainFrame = f ;
		Font defaultFont = new Font("宋体",Font.PLAIN,13);
		Font font = new Font("宋体",Font.BOLD,14);
		JLabel labelText = new JLabel("恭喜您! 第"+(mainFrame.getDiskTotalNum()-2)+"关 过关!",JLabel.CENTER);
		labelText.setFont(font);
		labelText.setForeground(Color.red);
		labelText.setPreferredSize(new Dimension(300,35));
		labelText.setBackground(new Color(248,248,255));
		labelText.setOpaque(true);
		
		JPanel panelText = new JPanel(new GridLayout(3,1));
		panelText.setPreferredSize(new Dimension(240,105));
		panelText.setBackground(Color.white);
		String s1 = mainFrame.getRecord(mainFrame.getDiskTotalNum()-2) ;	//当前记录
		String s2 = mainFrame.getTime();									//玩家过关时间
		JLabel l1 = new JLabel("",JLabel.CENTER);
		if(mainFrame.isDigital(s1))
			l1.setText("目前最高记录:"+s1+" 秒");
		else
			l1.setText("目前最高记录: 无");
		JLabel l2 = new JLabel("您的时间:"+s2+" 秒",JLabel.CENTER);
		JLabel l3 = new JLabel();
		JLabel labelIcon = new JLabel();
		labelIcon.setPreferredSize(new Dimension(125,115));
		labelIcon.setBorder(new EmptyBorder(0,10,0,10));
		if(!mainFrame.isDigital(s1) || Float.parseFloat(s1) > Float.parseFloat(s2))		//当前记录大于玩家过关时间则刷新
		{
			mainFrame.setRecord(s2,mainFrame.getDiskTotalNum()-2);
			l3.setText("挑战成功!新记录诞生!");
			l3.setHorizontalAlignment(JLabel.CENTER);
			l3.setForeground(Color.red);
			labelIcon.setIcon(new ImageIcon("images/pass2.gif"));
		}
		else
		{
			l3.setText("挑战失败!下次继续努力!");
			l3.setHorizontalAlignment(JLabel.CENTER);
			l3.setForeground(Color.GREEN);
			labelIcon.setIcon(new ImageIcon("images/pass1.gif"));
		}
		l1.setFont(defaultFont);
		l2.setFont(defaultFont);
		l3.setFont(defaultFont);
		panelText.add(l1);
		panelText.add(l2);
		panelText.add(l3);
		
		JPanel panelButton = new JPanel();
		panelButton.setPreferredSize(new Dimension(300,35));
		panelButton.setBackground(new Color(248,248,255));
		JButton close = new JButton("关闭");
		close.setBackground(Color.white);
		close.setFont(defaultFont);
		close.setFocusable(false);
		close.setPreferredSize(new Dimension(60,25));
		close.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) { setVisible(false); }
		});
		panelButton.add(close);
		
		this.add(labelText,BorderLayout.NORTH);
		this.add(labelIcon,BorderLayout.WEST);
		this.add(panelText,BorderLayout.CENTER);
		this.add(panelButton,BorderLayout.SOUTH);
		this.setBackground(new Color(248,248,255));
		this.setSize(365,210);
		this.setLocationRelativeTo(null);
		this.show();
	}
}


//***********************************自动演示线程*******************************
class ThreadAutoPlay extends Thread
{
	Hanoi mainFrame ;
	
	public ThreadAutoPlay(Hanoi f)
	{
		mainFrame = f ;
	}
	
	public void run()
	{
		mainFrame.timeStart();
		hPlay(mainFrame.getDiskTotalNum(),0,1,2);
		mainFrame.timeStop();	
	}
	
	public void hPlay(int n , int a , int b ,int c)
	{
		if(n > 0)
		{
			hPlay(n-1,a,c,b);
			if(n>1) 
			{ 
				pause() ; 
				mainFrame.moveArrow( a-b ) ; 
			}
			pause() ;
			mainFrame.moveDisk( c-a );
			if(n>1) 
			{ 
				pause() ; 
				mainFrame.moveArrow( b-c ) ; 
			}
			hPlay(n-1,b,a,c);
		}
	}
	
	public void pause() 
	{ 
		try
		{ 
			Thread.sleep(mainFrame.getDelay());//可以修改此值加快盘子移动的速度 
		}catch(InterruptedException e){} 
 	} 
}


//**************************************计时器线程*********************************
class ThreadTime extends Thread
{
	Hanoi mainFrame ;
	int times ;
	
	public ThreadTime(Hanoi f)
	{
		mainFrame = f ;
	}
	
	public void run()
	{
		times = 0 ;
		while(true)
		{	
			try
			{
				sleep(100);
			}catch(InterruptedException e){}
			times ++ ;
			mainFrame.setTime(times);
			mainFrame.printTime();
		}
	}
}


⌨️ 快捷键说明

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