Java:五子棋设计(一)窗口与界面
一个完整的五子棋项目包括很多部分:窗口与界面设计、各种功能实现、AI算法设计等等。本篇文章主要介绍基本的窗口和界面设计,以及监听器和画笔的使用。建议经常阅读Java API中文手册,里面用清晰的逻辑框架详尽地介绍了Java软件包里各种类与其包含的方法。
1.1窗口
我们在启动一个游戏时,首先会进入主界面窗口,然后有开始游戏、菜单等按钮选项。除了主界面窗口,在五子棋项目设计中还有胜利窗口、悔棋窗口等等小弹窗,因此我们需要创建多个窗口,并在窗口上添加各种组件(按钮、字段、图片、标签、文本框等等)。在这里以主界面窗口为例进行介绍。(以下三个代码块为一整段代码拆分而成)
1.1.1创建窗口对象
在Java.awt软件包中有一个Frame窗口类,JFrame是Frame的一个子类,我们需要创建一个JFrame对象。
窗口类中包含了多种方法,大家如果想要了解更多的话可以自己创建一个窗口对象,调用不同的方法设置不同的参数尝试一下,看看哪种效果是自己最想要的。
public void initUI() {
//单独写一个方法,在方法体中创建窗口,然后再在主函数中调用本方法
ChessBoard jf=new ChessBoard();
//ChessBoard继承了JFrame类,因此可用ChessBoard直接创建窗口对象
jf.setSize(1000, 850); //窗口大小
jf.setTitle("五子棋"); //窗口标题
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时结束程序
jf.setLocationRelativeTo(null); //窗口在屏幕中居中显示
jf.setResizable(false); //窗口大小不可调整
//以上为窗口类的多个方法
1.1.2添加组件
刚刚我们只是创建了一个空白的窗口,常见的窗口还会包括按钮、字段、文本框、标签或图片等等,以上都称为窗口的组件。为窗口添加组件需要先创建一个该类的对象,然后通过窗口类的add方法将对象添加到窗口上。各种组件也有许多方法,大家可以自己尝试调用。
FlowLayout layout=new FlowLayout();
jf.setLayout(layout);
//FlowLayout为窗口的一种布局模式——流式布局
//需要先创建一个流式布局对象,再把窗口的布局设置为该布局对象
JButton bt2=new JButton("人机对战");//括号中的参数为按钮上的内容
bt2.setBackground(Color.pink);
bt2.addActionListener(game);
//JButton为按钮类,可作为一个组件添加到窗口上
//JButton类中有多个方法,比如设置按钮颜色,添加监听器(后面有介绍)等等
jf.add(bt2);
//为窗口添加组件,此处添加了一个按钮组件,还可以添加许多其他的组件
1.1.3窗口可视化
在创建了窗口对象,设置好参数并添加了各种组件之后,要想窗口能够出现在屏幕上就需要进行窗口可视化。
jf.setVisible(true);
//若将括号内的参数改为false,窗口便不可见
}
1.2监听器
首先介绍一下监听器类。监听器类中的方法没有方法体,因此不能够直接创建对象,需要自己创建一个类继承监听器类,重写方法体,然后再创建该类的对象。继承的方式为接口,implements而不是extends,如果一个类同时有继承与接口,那么先写extends再写implements,若有多个监听器,用逗号分隔。
1.2.1接口继承监听器类
Program类继承了动作监听器的接口以及MouseAdapter(MouseAdapter继承了MouseListener,可以理解为鼠标监听器,详情请查阅API)。
在Program中重写动作监听器的方法ActionPerformed
public class Program extends MouseAdapter implements ChessBoardConfig,ActionListener {
public void actionPerformed(ActionEvent e) {
//重写监听器类的方法体
String str=e.getActionCommand();
//将鼠标点击的按钮的内容存入字符串str中
//点击了不同的按钮,便可以根据字符串内容调用相应的方法
if(str=="双人对战")
this.newgame();
if(str=="悔棋") {
regret.setVisible(true);
System.out.println("打开悔棋窗口");
}
if(str=="重新开始")
this.newgame();
}
}
1.2.2监听器的使用
监听器,顾名思义可以监听电脑的动作,常用的监听器有鼠标监听器、键盘监听器、动作监听器等等。
例如你设置了一个按钮,点击按钮能够触发某个方法,那么电脑如何才能知道你点击了按钮呢?我们可以在按钮上添加动作监听器,这样按钮就能够知道自己被点击了,并在被点击之后调用某个方法。
再比如你想要通过鼠标在窗口上画出一条线,以鼠标按下和释放的位置为线段的两个端点,那么便需要在窗口上添加鼠标监听器来监听鼠标的动作,让窗口知道鼠标在哪里被按下和释放,然后画出一条线段。
//以下代码均写在上文的initUI方法中
JButton bt1=new JButton("双人对战");
JButton bt2=new JButton("人机对战");
JButton bt3=new JButton("悔棋");
JButton bt4=new JButton("重新开始");
Program game=new Program();//创建Program类的对象
//Program继承了动作监听器,因此在按钮上添加动作监听器——Program类的对象game
//执行到以下语句时,电脑会进入Program类中寻找监听器的方法体
bt1.addActionListener(game);
bt2.addActionListener(game);
bt3.addActionListener(game);
bt4.addActionListener(game);
1.3画笔
一个窗口上有按钮等等组件,那如果想要一个窗口成为一个画板,通过鼠标在窗口上画出一条线段要如何实现呢?
首先我们需要在窗口上添加一个鼠标监听器,来获取线段的两个端点,但如果要让窗口上出现一条黑色的线,我们还需要一支画笔在窗口上作图。
//以下代码写在initUI方法中
Graphics g;
//定义画笔时不需要new
g=jf.getGraphics();
//获取窗口画笔
//意思是这个画笔会用在窗口上,在窗口上作画
game.g=g;
//Program的game对象中有一个画笔成员
//我们需要将各个类中的画笔进行统一,相互传送,使得所有画笔统一为窗口上的画笔,这样在其它类中“拿起画笔”时,便可直接在窗口上作画
我刚刚学会使用画笔时经常会出现“画不出来”的情况,一般都是忘记进行画笔的传递。画笔的传递就像投屏一样,你在手机上的操作能够呈现在电视上,同样地,将画笔传递之后就可使其它类中画笔的操作呈现在窗口上。
本篇文章简单介绍了能够让五子棋“有个样子”的一些基本配置,其余的算法会在后续的文章中持续更新。