刚学习做了个简易的五子棋小程序,给大家说说我的思路吧。
先说说主要要实现的功能:
1.首先程序有两个模式,玩家对战与人机对战(默认为玩家对战的模式),每次在下拉框选择后棋盘就会重绘,也就是清空重新开始。
2.玩家对战:黑白交替下子,且当某一方五子相连时,判出胜负;人机对战:固定地玩家执黑棋,ai执白棋,通过权值算法来让ai判断下棋的位置。
3.重新开始就是清空棋盘上所有棋子,即清空棋的数组再进行重绘。
4.悔棋按钮的功能:如果是玩家对战,就悔一个棋子;如果是人机对战,就悔两个棋子。
接下来为具体实现:
首先得有一个界面(窗口界面类),并继承JFrame类来进行重绘,同时进行一些设置。
public class FiveChess extends JFrame implements conf{
private chesses[] chessArray = new chesses[144];//存放棋子的位置,颜色属性,用于重绘
public void initui(){
this.setTitle("五子棋");
this.setSize(900, 800);
this.setDefaultCloseOperation(3);
this.getContentPane().setBackground(Color.ORANGE);
this.setResizable(false);//设定不可改变大小
this.setLocationRelativeTo(null);//居中出现
JPanel jp = new JPanel();
jp.setBackground(Color.GRAY);
jp.setPreferredSize(new Dimension(100,0));
this.add(jp,BorderLayout.EAST);
DMouse dm = new DMouse();
String[] shape = {
"重新开始", "悔棋" };
for (int i = 0; i < shape.length; i++) {
JButton jbu = new JButton(shape[i]);
jp.add(jbu);
jbu.addActionListener(dm);
}
String[] a={
"玩家对战 " ,"人机对战"};
JComboBox<String> A=new JComboBox<String>(a);
jp.add(A);
this.setVisible(true);
再就是画棋盘,这里为了能后期更方便的修改棋盘结构,就定义了一个conf接口来存放几个常量。
public interface conf {
public static final int X0=60;
public static final int Y0=60;
public static final int SIZE=40;
public static final int LINE=18;
public static final int CHESS_SIZE=30;
}
然后在窗口界面类(FiveChess)中进行重绘
public void paint(Graphics g) {
super.paint(g);
drawChess(g);//画棋盘
drawChesses(g);//画棋子
}
public void drawChess(Graphics g) {//遍历画棋盘
for(int i=0;i<LINE;i++) {
g.drawLine(X0, Y0+i*SIZE, X0+(LINE-1)*SIZE, Y0+i*SIZE);
}
for(int j=0;j<LINE;j++) {
g.drawLine(X0+j*SIZE, Y0,X0+j*SIZE, Y0+(LINE-1)*SIZE);
}
}
还有棋子的重绘,就要先解决怎么下棋的问题,我们先为窗体加上鼠标监听器,按钮加上动作监听器,并将画笔,自己这个窗体对象(直接在监听类中调用重绘),存放棋子的对象数组(保存下的棋,用来进行棋子的重绘)传递过去
A.addItemListener(dm);
this.addMouseListener(dm);
Graphics g = this.getGraphics();
dm.setFrame(this);//向监听处理传窗体对象
dm.setG(g);//向监听处理传画笔
dm.setChess(chessArray);//向监听处理传数组
这样新建一个监听类DMouse类,重新对应的方法,来实现下棋。这里继承了MouseAdapter类,它是个抽象类,不像MouseListener是个接口,所以只需重写部分方法。同时新建一个棋子类,将每个棋子的位置,颜色,画棋子的方法都放在其中,最后存入该类的对象数组用于重绘。
public class chesses implements conf{//棋子对象
private int x,y;
private Color color;
public chesses(int x, int y, Color color) {
// TODO Auto-generated constructor stub
this.x=x;
this.y=y;
this.color=color;
}
public void drawC(Graphics g) {
g.setColor(color);
g.fillOval(x-CHESS_SIZE/2, y-CHESS_SIZE/2, CHESS_SIZE, CHESS_SIZE);
}
}
DMouse监听类中重写鼠标点击的方法
先是玩家对战,包括了1.黑白棋交替,2.棋子要下在网格上,每个点只能下一个棋子,3棋子要重绘。
通过变量count来控制黑白棋的交替,偶数下黑棋(对应的二维数组记1),奇数下白棋(对应的二维数组记1),二维数组对应棋盘上每一个交点的位置,没下过的就为0。下在网格上通过遍历棋盘上每个交点的位置,判断获取的点击的位置是否还在交点位置的SIZE/2的半径范围内,在的话就直接在相应的交点位置画图。
同时每下一次棋就创建对象存入对象数组。
public class DMouse extends MouseAdapter implements conf,ActionListener,ItemListener{
private Graphics g;
private int count = 0; //黑白棋计数
private int[][] chess = new int[LINE][LINE];//棋盘位置
private chesses[] chessArray;//棋子对象
priv