程序说明:大学期间的课程设计,黑棋先行,此程序仅仅试探性的的摸清五子棋程序框架设计的基本思路,其具体的五子棋下棋思路还有待完善,此程序仅从防守的角度给予回应对方棋子,也没有禁手的设置。
其源代码如下:
public class Untitled7 extends javax.swing.JFrame {
javax.swing.JButton jbBegin = new javax.swing.JButton("重新开始");
javax.swing.JButton jbBack = new javax.swing.JButton("悔棋");
javax.swing.JPanel jpButt = new javax.swing.JPanel();
int M = 15;
int board[][] = new int[M][M];//存储棋盘上的落子状况
int FLAG = 1;//胜负状态标志
public Untitled7(){
jpButt.setLayout(new java.awt.FlowLayout());
jpButt.add(jbBegin);
jpButt.add(jbBack);
gbPanel gp = new gbPanel();
this.getContentPane().add(jpButt,java.awt.BorderLayout.NORTH);
this.getContentPane().add(gp,java.awt.BorderLayout.CENTER);
this.setSize(310,372);
this.setResizable(false);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Untitled7();
}
class gbPanel extends javax.swing.JPanel{
public gbPanel(){
this.addMouseListener(new mouselis());//落子事件
}
public void paintComponent(java.awt.Graphics g){
super.paintComponent(g);
javax.swing.ImageIcon icon1 = new javax.swing.ImageIcon("五子棋_棋盘.jpg");
g.drawImage(icon1.getImage(),0,0,this);//在panel中绘制棋盘
for(int i=0;i<M;i++)
for(int j=0;j<M;j++){
if(1==board[i][j]){//重绘黑子
g.drawImage(new mouselis().iconB.getImage(),i*20+1,j*20+1,this);
}
else if(2==board[i][j]){//重绘白字
g.drawImage(new mouselis().iconW.getImage(),i*20+1,j*20+1,this);
}
}
}
class mouselis extends java.awt.event.MouseAdapter{
javax.swing.ImageIcon iconB = new javax.swing.ImageIcon("五子棋_黑子.jpg");
javax.swing.ImageIcon iconW = new javax.swing.ImageIcon("五子棋_白子.jpg");
String strb = "黑方";
String strw = "白方";
public void mouseClicked(java.awt.event.MouseEvent e) {
int xb = e.getX()/20;//获取黑棋落子的行号
int yb = e.getY()/20;//获取黑棋落子的列号
int mb = xb*20;//
int nb = yb*20;//
if(1==FLAG){
if (0 == board[xb][yb]) { //该点为空,可以着子
getGraphics().drawImage(iconB.getImage(), mb + 1, nb + 1, gbPanel.this);
board[xb][yb] = 1;//修改存储信息
win(board, xb, yb, strb);//判断胜负
if(1==FLAG){
int xw = gow(board) / 15;//获取白棋落子的行号
int yw = gow(board) % 15;
int mw = xw * 20;
int nw = yw * 20;
getGraphics().drawImage(iconW.getImage(), mw + 1, nw + 1, gbPanel.this);
board[xw][yw] = 2;
win(board, xw, yw, strw);
}
} //end if black
}
}//end void mouseClicked()
int gow(int board[][]){
int k=0;int max=0;int tagb = 0;int tagw = 0;
int bla[] = new int[4];
int whi[] = new int[4];
java.util.Vector v4= new java.util.Vector();
java.util.Vector v3= new java.util.Vector();
java.util.Vector v2= new java.util.Vector();
java.util.Vector v1= new java.util.Vector();
java.util.Vector v0= new java.util.Vector();
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
for(int t=0;t<4;t++){
bla[t] = 0;//init bla[]
whi[t] = 0;//init whi[]
tagb=0;
tagw=0;
}//end for for
if(0==board[i][j]){ //当前坐标可以着子
int buf[][]={{1,0},{1,1},{0,1},{-1,1}};//四个方向
for(int m=0;m<4;m++){//向四个方向搜索
int num = 1;
for(int n=-1;n<2;n+=2){//每个方向的正反两个方向
int t=1,row,col;
while(t!=0){
row = i+buf[m][0]*n*t;//行值++或行值--
col = j+buf[m][1]*n*t;
if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(2==board[row][col])){
whi[m]++;//坐标row,col处为白子
t++;
}
else if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(1==board[row][col])){
tagw = 1;//连续白子后的棋子为对方棋子,默认为空
t = 0;
}
else
t=0;
}
t=1;
while(t!=0){
row = i+buf[m][0]*n*t;
col = j+buf[m][1]*n*t;
if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(1==board[row][col])){
bla[m]++;//坐标row,col处为黑子
t++;
}
else if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(2==board[row][col])){
tagb = 2;//连续黑子后的棋子为对方棋子,默认为空
t = 0;
}
else
t=0;
}
}
}
}//end if
int z=0;
for(int p = 0;p < 4;p++){
for (int q = 0; q < 4; q++) {
if (whi[q] > 3 ) {//当前i,j坐标处的四个方向的白色棋子大于3,自己着子后就获胜
v4.addElement(new Integer(k));
}
else if(bla[q]>3){//当前i,j坐标处的四个方向的黑色棋子大于3,自己必须防守,否则就败
v3.addElement(new Integer(k));
}
else if ( (whi[q] == 3)) {//当前i,j坐标处的四个方向的白色棋子等于3,进行冲4
v2.addElement(new Integer(k));
}
else if ( (tagb==0)&&(bla[q]==3)) {//当前i,j坐标处的四个方向的黑色棋子等于3,且为活三
v1.addElement(new Integer(k));
}
else {
if (max < (bla[p] + whi[q])) {//选取连接白子和黑子最多的点
max = (bla[p] + whi[q]);
v0.removeAllElements();
v0.addElement(new Integer(k));
}
else if(max == (bla[p] + whi[q])){
v0.addElement(new Integer(k));
}
}
}
}
k++;
}//end for j
}//end for i
if (!v4.isEmpty()) {
return Integer.parseInt(v4.elementAt(0).toString());
}
else if (!v3.isEmpty()) {
return Integer.parseInt(v3.elementAt(0).toString());
}
else if (!v2.isEmpty()) {
return Integer.parseInt(v2.elementAt(0).toString());
}
else if (!v1.isEmpty()) {
return Integer.parseInt(v1.elementAt(0).toString());
}
else
return Integer.parseInt(v0.elementAt(0).toString());
}//end int gow()
public void win(int qi[][],int m,int n,String str){
int buf[][]={{1,0},{1,1},{0,1},{-1,1}};
int color = qi[m][n];
for(int i=0;i<4;i++){
int num = 1;
for(int k=-1;k<2;k+=2){
int t=1,row,col;
while(t!=0){
row = m+buf[i][0]*k*t;
col = n+buf[i][1]*k*t;
if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(color==qi[row][col])){
num++;
if(num==5){
javax.swing.JOptionPane.showMessageDialog(Untitled7.this,
str+"胜利",
"结果",
javax.swing.JOptionPane.INFORMATION_MESSAGE);
FLAG = 2;
}
t++;
}
else
t=0;
}
}
}
}
}//end class mouselis
}//end class gbpanel
}//end
运行结果截图: