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

📄 mainframe.java

📁 MVC设计模式早在面向对象语言Smalltalk-80中就被提出并在此后得到业界的广泛接受。它包括三类对象:(1)模型(Model)对象:是应用程序的主体部分。(2)视图(View)对象:是应用程序中
💻 JAVA
字号:
/********************************************************************************************/
/*																							*/
/*                           MainFrame.java                                                 */
/*										                                                    */
/*			            整个框架的主控模块 负责整个GUI界面的显示和总调度					*/
/*																							*/
/*						Programed by Luo Pengkui on 2004-9									*/
/*																							*/
/********************************************************************************************/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Color;

//------------------------------------ BEGIN ------------------------------------------------


public class MainFrame extends JFrame
{
	SnakeModel m_snake;											// 建立模型实例接收者
	MatrixModel m_matrix;
	FoodMaker m_foodMaker;
	SnakeControl m_control;

	JMenuBar menuBar = new JMenuBar();                          // 菜单条

	JFrame settingFrame ;                                       // "设置"面板框架
	JCheckBox[] settingCheckBox =                               // "设置"面板中上面四个复选项
	{
		new JCheckBox("开启音乐",false), new JCheckBox("分数随时间自动递减",true),
		new JCheckBox("果实被吃后自动长出",false), new JCheckBox("蛇吃果后加速",true)
	};
	JLabel[][] settingLabel =                                   // "设置"面板中间几个标签
	{
		{
			new JLabel("速度变化率")
		},
		{
			new JLabel("蛇身初始长度"),
			new JLabel("蛇初始速度"), new JLabel("果实总量"),
			new JLabel("地图大小"), new JLabel("背景颜色")
		}
	};
	JSlider speedChangeRateSlider = new JSlider(JSlider.HORIZONTAL,1,5,3); // "设置"面板中的速度变化率滑块

	String[][] comboItem =										// "设置"面板中的下拉列表内容
	{
		{ "中等","短","长" },
		{ "中等","慢","快" },
		{ "中等","少","多"	},
		{ "中等","小","大" },
		{ "灰色","白色","黄色" }
	};
	JComboBox [] settingComboBox = 								// "设置"面板中的下拉列表(组合框)
	{
		new JComboBox(comboItem[0]), new JComboBox(comboItem[1]),
		new JComboBox(comboItem[2]), new JComboBox(comboItem[3]),
		new JComboBox(comboItem[4]),
	};
	JButton okButton = new JButton("确认");						// "设置"面板的确认键

	boolean m_scoreAutoDecrease = true;							// 默认值
	boolean m_speedUpAfterEaten = true;
	boolean m_fruitAutoGrown = false;
	boolean m_musicOrNot = false;

	int m_snakeLength = 2;										// 蛇身初始长度
	int m_speed = 200;											// 蛇的初始速度
	int m_amountofFoods = 10;
	int m_canvasCol = 20; 										// 画布列宽
	int m_canvasRow = 30;										// 画布长度
	Color m_mapColor = Color.GRAY;								// 画布颜色

	double m_speedChangeRate = 0.95; 							// 速度变化率

	int i,j;

	public MainFrame( MatrixModel matrix, SnakeModel snake, SnakeControl control)
	{															// 用构造器初始化
		super( "贪吃蛇" );								// 标题

		m_snake = snake;										// 接收实例
		m_matrix = matrix;
		m_control = control;

		setSize(300,200);										// 设置顶层框架大小
		setVisible(true);										// 可见性
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			// 关闭方式

		// 定义菜单项
		JMenu[] menu = { new JMenu( "游戏(G)" ), new JMenu( "工具(T)" ), new JMenu( "帮助(H)" ) };
		char[] menuC = { 'G','T','H' };							// 快捷键
		JMenuItem[][] menuItem =
		{
			{ new JMenuItem("开始游戏(S)"), new JMenuItem("英雄榜(H)"), new JMenuItem("退出(E)") },
			{ new JMenuItem("设置(S)") },
			{ new JMenuItem("游戏规则(R)"), new JMenuItem("关于(A)")	}
		};
		char[][] menuItemC = { {'S','H','E'},{'S'},{'R','A'} };	// 快捷键

		// 逐项添加菜单条
		setJMenuBar(menuBar);
		for ( i=0; i<menu.length; i++)
		{
			menuBar.add( menu[i] );
			menu[i].setMnemonic(menuC[i]);
			for (j=0; j<menuItem[i].length; j++)
			{
				menu[i].add(menuItem[i][j]);
				menuItem[i][j].setMnemonic(menuItemC[i][j]);
			}
		}

		// ------------------------------------------------------------------------------
		// 以下是菜单事件处理,全是匿名内部类

		// 单击"开始游戏(S)" 时的事件处理
		menuItem[0][0].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					// 初始化整个地图
					m_matrix.mb_resetMatrix( m_canvasCol, m_canvasRow );

					// 初始化蛇的属性
					m_snake.mb_resetSnake( m_canvasCol, m_canvasRow, m_speed, m_snakeLength,
						m_scoreAutoDecrease, m_speedChangeRate, m_speedUpAfterEaten );

					// 获得FoodMaker类的引用
					m_foodMaker = new FoodMaker( m_matrix );
					// 开始果实建造
					m_foodMaker.mb_start( m_canvasCol,  m_canvasRow, m_amountofFoods, m_fruitAutoGrown);
					// 获取所有果实的引用
					FoodModel[] foods = m_foodMaker.mb_getFoods();

					// 初始化画布
					setSize(m_canvasRow*10 ,m_canvasCol*10);
					Container cp = getContentPane();

					// 添加键盘监听器
					addKeyListener(m_control);
					// 初始化画布
        			Painter view = new Painter( m_snake, m_control, foods, m_matrix, m_mapColor, m_canvasCol, m_canvasRow, cp);
        			pack();

        			// 把监听器加载到蛇模型和果实建造模型上
        			m_snake.addObserver( view );
        			m_foodMaker.addObserver( view );

        			// 开启蛇运动线程
        			(new Thread( m_snake )).start();

        			// 音效,留待处理
        			//if(m_musicOrNot) (new Thread( new BackgroundMusic() )).start();
				}
			}
		);

		// 单击"英雄榜(H)" 时的事件处理,该功能仍在开发中
		menuItem[0][1].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					JOptionPane.showMessageDialog(null,"对不起,该功能仍在开发中","Sorry",JOptionPane.INFORMATION_MESSAGE);
				}
			}
		);

		// 单击"退出(E)" 时的事件处理
		menuItem[0][2].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					System.exit(0);
				}
			}
		);

		// 单击"设置(S)" 时的事件处理
		menuItem[1][0].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					settingFrame = new JFrame("设置");			// 创建新窗体
					settingFrame.setSize(100,100);
					// 获取容器并设置布局方式
					Container settingCP = settingFrame.getContentPane();
					settingCP.setLayout(new BoxLayout(settingCP,BoxLayout.Y_AXIS));
					settingCP.setSize(200,250);

					// 添加组件
					for (i=0; i<4; i++)
						settingCP.add(settingCheckBox[i]);
					settingCP.add(settingLabel[0][0]);
					settingCP.add(speedChangeRateSlider);

					for (i=0;i<5;i++)
					{
						settingCP.add(settingLabel[1][i]);
						settingCP.add(settingComboBox[i]);
					}
					settingCP.add(okButton);

					settingFrame.setVisible(true);
					settingFrame.setResizable(false);
					settingFrame.pack();
					settingFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

					// 为“确认”按钮添加监听器
					okButton.addActionListener( new ActionListener()
						{
						public void actionPerformed( ActionEvent ae )
						{
							// 为“设置”选项赋新值
							m_musicOrNot = settingCheckBox[0].isSelected();
							m_scoreAutoDecrease = settingCheckBox[1].isSelected();
							m_fruitAutoGrown = settingCheckBox[2].isSelected();
							m_speedUpAfterEaten = settingCheckBox[3].isSelected();

							switch ( settingComboBox[0].getSelectedIndex() )
							{
								case 0: m_snakeLength = 8; break;
								case 1: m_snakeLength = 3; break;
								case 2: m_snakeLength = 15; break;
							}
							switch (settingComboBox[1].getSelectedIndex())
							{
								case 0: m_speed = 100; break;
								case 1: m_speed = 200; break;
								case 2: m_speed = 50; break;
							}
							switch (settingComboBox[2].getSelectedIndex())
							{
								case 0: m_amountofFoods = 9; break;
								case 1: m_amountofFoods = 3; break;
								case 2: m_amountofFoods = 15; break;
							}
							switch (settingComboBox[3].getSelectedIndex())
							{
								case 0: m_canvasCol = 40;
										m_canvasRow = 30;
										break;
								case 1: m_canvasCol = 30;
										m_canvasRow = 20;
										break;
								case 2: m_canvasCol = 50;
										m_canvasRow = 40;
										break;
							}
							switch (settingComboBox[4].getSelectedIndex())
							{
								case 0: m_mapColor = Color.GRAY; break;
								case 1: m_mapColor = Color.WHITE; break;
								case 2: m_mapColor = Color.YELLOW; break;
								default:;
							}
							settingFrame.hide();				// 隐藏“设置”窗体

						}
						}
					);
				}
			}
		);


		// 单击"游戏规则(R)" 时的事件处理
		menuItem[2][0].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					JOptionPane.showMessageDialog(null,"细节部分请参见文档,谢谢!","游戏规则",JOptionPane.INFORMATION_MESSAGE);
				}
			}
		);

		// 单击"关于(A)" 时的事件处理
		menuItem[2][1].addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent ae )
				{
					JOptionPane.showMessageDialog(null,"开发者 : 罗鹏魁\n       2004-9","版权所有",JOptionPane.INFORMATION_MESSAGE);;
				}
			}
		);

	}
}

//------------------------------------- END -------------------------------------------------

⌨️ 快捷键说明

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