五子棋窗体类:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * 创建五子棋窗体类,继承自Jframe类 * * @author Administrator * */ public class Chessframe extends JFrame { // 设置属性 private Graphics g; private Image image=new ImageIcon("images/chessboard.jpg").getImage(); private List<Drawchess> list = new ArrayList<Drawchess>(); private int high = 500, length = 500, num = 10, X1, X2, Y1, Y2; /** * 主函数 */ public static void main(String[] args) { Chessframe chf = new Chessframe(); } /** * 构造方法 */ public Chessframe() { inut(); } private void inut() { // 初始化窗体 this.setTitle("五子棋"); this.setSize(new Dimension(650, 600)); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); this.setLayout(new BorderLayout());//设置窗体为边框布局 JPanel jpa=new JPanel();//实例化面板对象 JPanel jpa2=new JPanel();//实例化面板对象 jpa.setLayout(new GridLayout(4,1,5,5));//设置面板为网格布局,并指定为四行一列 JButton jub=new JButton("重新开局");//实例化"重新开局"的按钮对象 JButton jub_RE=new JButton("悔棋");//实例化"悔棋"的按钮对象 JButton jub_CL=new JButton("关闭游戏");//实例化"关闭游戏"的按钮对象 jub.setPreferredSize(new Dimension(90,10));//设置按钮的首选大小为90*50 jpa.add(jub_RE);//将悔棋按钮加到面板上 jpa.add(jub);//将重新开局"按钮加到面板上 jpa.add(jub_CL);//将关闭游戏"按钮加到面板上 jpa2.add(jpa);//将面板添加到窗体的东边的面板上 this.add(jpa2,BorderLayout.EAST);//将面板添加到窗体的东边 this.setVisible(true);//设置窗体为可见 g = this.getGraphics();//获取画布对象,一定要在设置可见之后 Chesslis al = new Chesslis(g, list, this);//实例化鼠标监听器类对象 this.addMouseListener(al);//向窗体上添加鼠标监听器 ACLis acl=new ACLis(this,list,al);//实例化按钮的动作监听器对象 /** * 给三个按钮添加动作监听器 */ jub.addActionListener(acl);//给重新开局按钮添加动作监听器 jub_RE.addActionListener(acl);//给悔棋按钮添加动作监听器 jub_CL.addActionListener(acl);//给关闭游戏按钮添加动作监听器 } /** * 重写重绘方法 */ public void paint(Graphics g) { super.paint(g); this.drawcp(); for (int i = 0; i < list.size(); i++) { list.get(i).draw(); } g.drawImage(image, 50, 50, null); } /** * 画棋盘的方法 */ private void drawcp() { // 画竖线 for (int i = 0; i < num; i++) { X1 = 50 + i * 50; X2 = 50 + i * 50; Y1 = 50; Y2 = high; g.setColor(Color.black); g.drawLine(X1, Y1, X2, Y2); } // 画横线 for (int i = 0; i < num; i++) { Y1 = 50 + i * 50; Y2 = 50 + i * 50; X1 = 50; X2 = length; g.drawLine(X1, Y1, X2, Y2); } } }
动作监听器类:
import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; /** * 创建动作监听器类,用于重新开局和悔棋按钮,该类实现了ActionListener接口 * @author Administrator * */ public class ACLis implements ActionListener{ private Chessframe chf; private List<Drawchess> list; private Chesslis al; private int[][] array; /** * 构造方法 * @param list * @param al * @param chessframe */ public ACLis(Chessframe chf, List<Drawchess> list, Chesslis al) { // TODO Auto-generated constructor stub this.chf=chf; this.list=list; this.al=al; } /** * 接口中动作处理的方法 */ public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getActionCommand().equals("重新开局")){ list.clear();//将list集合清空 chf.repaint();//重绘窗体,好除去所有的棋子 al.array=new int[10][10];//将二维数组清空 al.sum=0;//将计数器清空 al.show(); chf.addMouseListener(al);//重新给窗体添加上鼠标监听器 }else if(e.getActionCommand().equals("悔棋")){ int X,Y,sum; array=al.array;//获取到控制棋子的数组 X=list.get(list.size()-1).X;//获取到最后一个棋子所在的坐标值的X值 Y=list.get(list.size()-1).Y;//获取到最后一个棋子所在的坐标值的Y值 array[X/50-1][Y/50-1]=0;//控制棋子数组的最后一个棋子对应的值清空 sum=al.sum;//获取计数器的值 al.array=array;//将操作完成后的数组重新赋给原数组 al.sum=--sum;//将操作完成后的计数器重新赋给计数器__对计数器的值减一 al.show(); list.remove(list.size()-1);//将list集合中最后一个元素删去 chf.addMouseListener(al);//重新给窗体添加上鼠标监听器 chf.repaint();//重绘窗体,好除去最后一个的棋子 }else{ // chf.setVisible(false); } } }
鼠标监听器类:
import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import javax.swing.JOptionPane; /** * 创建鼠标监听器类,该类实现了MouseListener接口 * @author Administrator * */ public class Chesslis implements MouseListener { //设置属性 private Graphics g; private Chessframe chf; private List<Drawchess> list; /** * X1,Y1表示鼠标点击处的坐标;XM,YM表示X1,Y1比50的模; * X2,Y2表示下棋点存储到数组中的位置;X,Y表示应落棋子的交叉处的坐标 */ private int X1,Y1,X,Y,X2,Y2,XM,YM; /** * sum是判断黑白子的计数器 */ public int sum=0; private Color color; public int array[][]=new int[10][10]; /** * 构造方法 * @param chf */ public Chesslis(Graphics g,List<Drawchess> list, Chessframe chf){ this.g=g; this.list=list; this.chf=chf; } /** * 被点击时的方法 */ @Override public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub // Graphics2D g2=(Graphics2D)g; } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } /** * 被按压时 */ @Override public void mousePressed(MouseEvent arg0) { System.out.println("++++++++++++++++++++"+sum+"++++++++++++++++++"); // TODO Auto-generated method stub X1=arg0.getX(); XM=X1%50; Y1=arg0.getY(); YM=Y1%50; //判断点击的点是否在棋盘内 if(!(X1>=50&&X1<=500&&Y1>=50&&Y1<=500)){ System.out.println("未点在棋盘内"+"xxxxxxxxxxxxxx"+X1+"yyyyyyyyyyyyyyy"+Y1); return; } //用计数器判断是该下那种颜色的棋子 if(sum%2==0){ color=Color.black;//偶次下黑子 }else{ color=Color.white;//奇次下白子 } //判断按压的位置接近哪个交叉处就在那个地方画棋子 if(XM<=25&&YM<=25){ X=X1-XM;Y=Y1-YM; }else if(XM<=25&&YM>=25){ X=X1-XM;Y=Y1-YM+50; }else if(XM>=25&&YM<=25){ X=X1-XM+50;Y=Y1-YM; }else if(XM>=25&&YM>=25){ X=X1-XM+50;Y=Y1-YM+50; } //遍历list集合看看在该处是否已经画了点 for(int i=0;i<list.size();i++){ if(X==list.get(i).X&&Y==list.get(i).Y){ return; } } Drawchess dra=new Drawchess(g,X,Y,color); dra.draw(); list.add(dra); //检查返回值,当有一方获胜时(返回为true时)将原窗体设为不可见,再创建一个窗体对象 if(checkwin()) { chf.removeMouseListener(this);//当有一方获胜时,移除该鼠标监听器 return; } sum++; //计数器加一 } /** * 判断是否获胜的方法 * @return */ private boolean checkwin() { int counth=0,counts=0,countlu=0,countrd=0; X2=X/50-1;Y2=Y/50-1; if(sum%2==0){ array[X2][Y2]=1;//偶次记黑子 show(); }else{ array[X2][Y2]=-1;//奇次记白子 show(); } //向右 for(int i=X2+1;i<array.length;i++){ if(array[i][Y2]==array[X2][Y2]){ counth++; }else break; } //向左 for(int i=X2-1;i>=0;i--){ if(array[i][Y2]==array[X2][Y2]){ counth++; }else break; } //向上 for(int i=Y2+1;i<array[X2].length;i++){ if(array[X2][i]==array[X2][Y2]){ counts++; }else break; } //向下 for(int i=Y2-1;i>=0;i--){ if(array[X2][i]==array[X2][Y2]){ counts++; }else break; } //左上 for(int i=X2-1,j=Y2+1;i>=0&&j<array[i].length;i--,j++){ if(array[i][j]==array[X2][Y2]){ countlu++; }else break; } //右下 for(int i=X2+1,j=Y2-1;i<array.length&&j>=0;i++,j--){ if(array[i][j]==array[X2][Y2]){ countlu++; }else break; } //右上 for(int i=X2+1,j=Y2+1;i<array.length&&j<array[i].length;i++,j++){ if(array[i][j]==array[X2][Y2]){ countrd++; }else break; } //左下 for(int i=X2-1,j=Y2-1;i>=0&&j>=0;i--,j--){ if(array[i][j]==array[X2][Y2]){ countrd++; }else break; } if(counts>=4||counth>=4||countlu>=4||countrd>=4){ if(sum%2==0){ System.out.println("黑棋获胜");//偶次下黑子 JOptionPane.showMessageDialog(null,"黑棋获胜\n重新开局"); return true; }else{ System.out.println("白棋获胜");//奇次下白子 JOptionPane.showMessageDialog(null,"白棋获胜\n重新开局"); return true; } } return false; } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } /** * 输出数组中的值 */ public void show(){ for(int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ System.out.print(" "+array[i][j]); } System.out.println(""); } System.out.println("========================="+sum+"=============================="); } }
画棋子的类:
import java.awt.Color; import java.awt.Graphics; import java.util.List; /** * 创建画棋子类,便于直接将该类的对象添加到集合中,便于重绘 * @author Administrator * */ public class Drawchess { private Graphics g; public int X,Y; private Color color; /** * 构造方法 */ public Drawchess(Graphics g, int X, int Y, Color color) { this.g=g; this.X=X; this.Y=Y; this.color=color; } public void draw(){ //设置颜色 g.setColor(color); //画棋子的方法 g.fillOval(X-20, Y-20, 40, 40); } }