📄 mainframe.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 + -