Application of 24 Points
首先,必须要感谢JcMan在github上发布的[Game_24Points](https://github.com/JcMan/Game_24Points),这在我一开始设计一筹莫展的时候给予我很大的帮助。
总体流程构思
在刚接到这个任务的时候,经过一段时间的调研,有非常多的方法来解决24点这个问题,虽然有些方法存在着改进的空间,但是单从算法效率去处理这个任务,显然不仅仅是我们想要的。所以我们有了设计一个完整的24点交互小游戏的想法。
为了得到一个24点的小游戏,首先我们需要正确的获取外界的输入,包括他们对数字、符号的选择,以及他们提交答案、获取提示等一系列的操作。其次,我们需要对输入表达式的合法性和正确性进行判断,并根据判断给予用户一定的反馈,来拥有更加良好的交互感官。
在获取外界输入这一过程中,java的swing包提供了非常好的接口来表现这一过程,也就是java控件的监听事件,能够处理点击,聚焦等等来自于鼠标键盘的事件。这里我们将各个数字、符号、游戏操作都设计为了按钮(JButton),通过点击来处理应有的展示内容。
例如下方为处理数字按钮的相应内容(当检测当用户按下某一数字按钮时,应该在原有显示基础上增加该数字,并且需要防止按钮再次被生效,此外加入key是为了防止连续按下两个数字,产生非法操作。)
if(key==0){
string += number[0];
textfield.setText(s);
Button1.setEnabled(false);
}
如上图,就是我们对24点游戏的基本框架设计。但是,这里的24点的判断任务只是,完成对字符串是否符合计算结果的判断。所以我们额外增加了一个窗口来体现回溯方法下的24点算法,并展示24点的所有可能性。并且,我们加入了一些基本的游戏元素来增加整体的趣味性。
如图,为我们最终的游戏整体框架。
算法设计
这里对一般的算法不在介绍,比如按钮的实现、窗口的切换、计时器功能、按钮之间的逻辑互斥,这些都非常容易实现。
本次游戏设计的主要算法有两个:1.完成对字符串文本是否符合24点的判断。2.判断四个数字之间所有组成24点的可能性。(剪枝版:得到一种结果)
算法1: 获取文本框中的字符串 expression
判断字符串是否合法:
if expression 为空 and 当前数字有解: 不合法
if expression 中括号位置不对 : 不合法
判断expression是否等于24:
numbers = expression 中的数字 #(利用字符串分割数字,在进行转换)
sign = expression 中的符号 #(正则表达式提取)
对符号进行优先级判断
通过优先级计算四个数字的表达式expression是否等于24
算法2: 回溯方法:每一步选择两个数字进行加减乘除结果。
step1: 选择 1-2 两个数字
加|减|乘|除 操作
并将得到的数字放回数字组中
stepi: 选择 i-i+1 两个数字
加|减|乘|除 操作
并将得到的数字放回数字组中
结束: 当仅剩下一个数字时
判断是否为24点。
为此在程序实现过程中我们专门利用类Algorithm来处理有关24点的所有算法。
实验代码
所有的实验代码已经上传到github上。[代码](https://github.com/00zwp/Game24)
这里简单介绍几块内容,方便日后在利用Swing包的时候。
1.窗体的创建
// 本类继承 extends JFrame
this.setVisible(true);
this.setTitle("欢迎来到初始选择界面");
this.setLayout(null);
this.setBounds(300,50,400,600);
this.addelements();
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2.按钮的监听事件
this.Button1 =new JButton();
this.Button1.setBounds(50,100,100,150);
this.Button1.setIcon(new ImageIcon("./imgs/number_img/first.JPG"));
this.add(this.Button1);
this.Button1.addActionListener(new ButtonEvent());
class ButtonEvent implements ActionListener { //定义牌按钮的监视器类
public void actionPerformed(ActionEvent e){
if (backupkey==0)
{ backupkey=1;
if (e.getSource() == Button1) {
s += "" + endarray[0];
textfield.setText(s);
Button1.setEnabled(false);
}//需要和操作符添加互斥
}
}
}