23,407
社区成员
发帖
与我相关
我的任务
分享
class View extends JFrame {
private static final long serialVersionUID = -5260375337613779312L;
// 按钮名称
private static final String CREATE = "新建";
private static final String RESET = "重来";
private static final String SUBMIT = "提交";
private static final String ANSWER = "答案";
// 关于窗口的数据信息
private static final int SIZE_WIDTH = 300;
private static final int SIZE_HEIGHT = 160;
private static final int COMMAND_LOCAL = SIZE_WIDTH - 100;
// 生成随机数范围
private static final int DATA_ROUND = 100;
// 输入数据的格式:1-2位数字
private static final String DATA_REGEX = "^\\d{1,2}$";
// 提示信息标题
private static final String WARNING_TITLE = "提示";
// 提示信息
private static final String DATA_ERROR = new StringBuffer().append(
"数据非法,范围(0-").append(DATA_ROUND - 1).append(")").toString();
private static final String OPER_ERROR = "非法操作";
private static final String DATA_SMALL = "数值小了..";
private static final String DATA_LARGE = "数值大了..";
private static final String INFO_ANSWER = "很遗憾,答案是{0}";
private static final String INFO_CREATE = "<html><b>?</b>,猜一猜</html>";
private static final String INFO_SUCCESS = "<html>恭喜您,答对了..<br>用时{0}s,得分{1}</html>";
private static final String INFO_RESET = "游戏已经从新开始";
private static final String INFO_TO_START = "请点击“新建”";
// 控件
JLabel lblWarning;
JTextField txtEnter;
JButton btnCreate;
JButton btnReset;
JButton btnSubmit;
JButton btnAnswer;
// 事件监听器
private CommandListener listener = new CommandListener();
// 生成随机数数值
private int data = 0;
// 验证次数
private int times = 0;
// 开始时间
private Date startTime = null;
/**
* 构造器<br/>
* 说明:定义窗体标题,配置相关属性,将命令按钮和信息域添加到窗体中,设置游戏处于结束状态
*/
public View() {
super("猜数字");
configBaseAttr();
configCommand();
configFileds();
finish();
}
// 添加信息域
private void configFileds() {
lblWarning = new JLabel(INFO_TO_START);
lblWarning.setBounds(30, 20, 150, 40);
add(lblWarning);
txtEnter = new JTextField();
txtEnter.setBounds(30, 80, 100, 20);
add(txtEnter);
}
// 添加命令按钮
private void configCommand() {
btnCreate = createCommand(CREATE, 15);
btnReset = createCommand(RESET, 40);
btnSubmit = createCommand(SUBMIT, 65);
btnAnswer = createCommand(ANSWER, 90);
}
// 配置基本属性
private void configBaseAttr() {
int x = Toolkit.getDefaultToolkit().getScreenSize().width;
int y = Toolkit.getDefaultToolkit().getScreenSize().height;
// 屏幕中间显示
setBounds((x - SIZE_WIDTH) / 2, (y - SIZE_HEIGHT) / 2, SIZE_WIDTH,
SIZE_HEIGHT);
// 自定义布局
setLayout(null);
// 关闭操作
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
// 初始游戏
private void initGame() {
data = random();
times = 0;
lblWarning.setText(INFO_CREATE);
txtEnter.setText("");
startTime = new Date();
System.out.println("this time, the data is " + data);
}
// 游戏启动状态
private void start() {
status(true);
}
// 游戏结束状态
private void finish() {
status(false);
}
/*
* 生成命令按钮(配置了按钮的一些共同属性)
* @param name 名称
* @param y 纵坐标
* @return 按钮
*/
private JButton createCommand(String name, int y) {
JButton temp = new JButton(name);
temp.setBounds(COMMAND_LOCAL, y, 65, 18);
add(temp);
temp.addActionListener(listener);
return temp;
}
// 生成随机数
private int random() {
return (int) (Math.random() * DATA_ROUND);
}
// 游戏的状态控制
private void status(boolean status) {
txtEnter.setEnabled(status);
btnReset.setEnabled(status);
btnSubmit.setEnabled(status);
btnAnswer.setEnabled(status);
}
// 根据游戏中使用的命令,定义监听器
class CommandListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton key = (JButton) e.getSource();
if (isEqual(key, CREATE)) { // 创建游戏
start();
initGame();
} else if (isEqual(key, RESET)) { // 重置游戏
display(INFO_RESET);
initGame();
} else if (isEqual(key, SUBMIT)) { // 提交操作
if (isData(txtEnter.getText())) {
times++; // 输入正确,则验证次数加1
int enter = getValue(txtEnter);
if (enter == data) { // 回答正确
Date now = new Date(); // 获取当前时间
lblWarning.setText(format(INFO_SUCCESS, (now.getTime()-startTime.getTime())/1000, score()));
finish();
} else if(enter > data) { // 大了
display(DATA_LARGE);
} else { // 小了
display(DATA_SMALL);
}
} else {
display(DATA_ERROR);
}
} else if (isEqual(key, ANSWER)) { // 获取答案
lblWarning.setText(format(INFO_ANSWER, data));
finish();
} else { // 为监听操作
display(OPER_ERROR);
}
}
// 简单计算分数
private int score() {
if (times > 10) {
return 5;
}
return (11 - times) * 10;
}
// 验证事件的命令
private boolean isEqual(JButton key, String command) {
return command.equals(key.getText());
}
// 弹出框显示信息
private void display(String message) {
JOptionPane.showMessageDialog(View.this, message, WARNING_TITLE,
JOptionPane.WARNING_MESSAGE);
}
// 输入数值是否合法
private boolean isData(String value) {
return value.matches(DATA_REGEX);
}
// 获取文本框中的数值
private int getValue(JTextField text) {
return Integer.valueOf(text.getText());
}
// 格式化消息
private String format(String pattern, Object... params) {
return MessageFormat.format(pattern, params);
}
}
}