【华东野鸡大学】大学时候自写的【五子棋算法】
///////////////////////////////////////////////【递归实现,Java五子棋算法,自创的】
////////////////////设置下图标就OK了,呵呵。。
package javaapplication3;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
/**
*
* @author zhangbilei
*/
class 五子棋 extends JFrame implements ActionListener
{
private int x;
private int y;
int row;
int column;
private JButton button[][];
private boolean 甲[][];
private boolean 乙[][];
private boolean 记录[][];
private int count;
private JFrame f;
private JTextField text;
//private JButton 重开=new JButton("重新开局");
//Image icon=Toolkit.getDefaultToolkit().getImage("zhangbilei/图片/icon.jpg");
public 五子棋(int column,int row)
{
super();
//重开.setPreferredSize(new Dimension(20,20));
f=new JFrame();
this.row=row;
this.column=column;
count=1;
//////////////////////////////setLayout(new FlowLayout());
FlowLayout flow=new FlowLayout();
flow.setHgap(0);
flow.setVgap(0);
setLayout(flow);
button=new JButton[row][column];
甲=new boolean[row][column];
乙=new boolean[row][column];
记录=new boolean[row][column];//避免重复点击的。。。
for(int i=0;i<row;i++)
for(int j=0;j<column;j++)
{
button[i][j]=new JButton("");
button[i][j].setPreferredSize(new Dimension(20,20));
button[i][j].setIcon(null);
add(button[i][j]);
button[i][j].addActionListener(this);
}
//重开.addActionListener(this);
setBounds(200,200,20*column+20,20*row+40);
setVisible(true);
validate();
}
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<row;i++)
for(int j=0;j<column;j++)
{
if(e.getSource()==button[i][j]&&记录[i][j]!=true)//点击过的不能再点
{
记录[i][j]=true;
System.out.println("i="+i+";j="+j+" ,count= "+count);
if(count%2!=0)
{
//button[i][j].setIcon("甲方");
button[i][j].setText("#");
/////////////////////
甲[i][j]=true;
//System.out.println("甲:i="+i+";j="+j+甲[i][j]);
}
else
{
//button[i][j].setIcon(new ImageIcon("Icon"));
//Graphics g=button[i][j].getGraphics();
//一定要将窗口显示出来,g画的东西才有效
//g.drawImage(icon,0,0,button[i][j].getSize().width,button[i][j].getSize().height,button[i][j]);
//button[i][j].setText("@");
//button[i][j].setIcon("乙方");
乙[i][j]=true;
//button[i][j].setIcon(); /////////////
}
count++;
}
}
if(赢的是(甲))
{
text=new JTextField("甲方赢了!",10);
System.out.println("甲方赢");
f.add(text);
//f.add(重开);
f.setBounds(100,100,100,100);
f.setVisible(true);
f.validate();
}
if(赢的是(乙))
{
text=new JTextField("乙方赢了!",10);
System.out.println("乙方赢");
f.add(text);
//f.add(重开);
f.setBounds(100,100,100,100);
f.setVisible(true);
f.validate();
}
/* if(e.getSource()==重开)
{
for(int i=0;i<row;i++)
for(int j=0;j<column;j++)
{
button[i][j].setText(null);
甲[i][j]=false;
乙[i][j]=false;
}
// f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}*/
}
public boolean 赢的是(boolean 选手[][])
{
boolean 赢=false;
for(int i=0;i<row;i++)
for(int j=0;j<column;j++)
{
int flag_L_to_R=0;//左向右斜的个数(棋子
int flag_R_to_L=0;//右向左斜的个数
int flag_row=0;//横向个数
int flag_column=0;//纵向个数
if(j<column-4)//判断横向
for(int k=0;k<5;k++)
{
if(选手[i][k+j]==true)
flag_row++;
}
if(i<row-4)//判断纵向
for(int k=0;k<5;k++)
{
if(选手[i+k][j]==true)
flag_column++;
}
///////判断斜向(都是以左边第一个为开头)
if(j<column-4)//以最后四列任意一个开头的是没有斜向的(以左边第一个为开头)
{
if(i<row-4)//判断左向右斜(\)(::当i>=row-4,没有左向右斜
{
for(int k=0;k<5;k++)
{
if(选手[i+k][j+k]==true)
flag_L_to_R++;
}
}
if(i>=4)////////判断右向左斜(/)
{
for(int k=0;k<5;k++)
{
if(选手[i-k][j+k]==true)
flag_R_to_L++;
}
}
}
if (flag_L_to_R==5||flag_R_to_L==5||flag_row==5||flag_column==5)
赢=true;
}
return 赢;
}
}
public class Main{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
五子棋 w=new 五子棋(30,20);//可以设置长宽。。。会自己调节(列,行)
}
}
