窗口类:package com.gzsoft.wuziqi;import java.awt.Color;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import javax.swing.JFrame;
import javax.swing.JPanel;/**
 * 一个棋盘窗口的类;
 * 
 * @author lyp
 * 
 */
public class QPFrame extends Frame { // 1棋盘类的引用
private Qipan qipan = null; // 2棋盘窗口,持有自己的应用
private QPFrame qpf = this; // 3是否开启!
private Boolean start = false; public void launchFrame() { // 4窗口的布局设置
this.setTitle("五子棋(泥豆米版本!)");
this.setBounds(300, 100, 502, 530);
//this.setBackground(Color.GREEN);
this.setResizable(false);
this.setVisible(true); this.addWindowListener(new WindowAdapter() { @Override
public void windowClosing(WindowEvent e) {
qpf.start = false;
System.exit(0);
} }); // 5设置棋盘
this.qipan = new Qipan(14); // 起一个新的线程
this.start = true;
MyThread myThread = new MyThread();
myThread.start(); this.addMouseListener(new MouseMonitor());
} public static void main(String[] args) {
QPFrame qp = new QPFrame();
qp.launchFrame(); } public void paint(Graphics g) {
Toolkit tk = Toolkit.getDefaultToolkit(); // 画出棋盘
Image img = tk.getImage(QPFrame.class.getClassLoader().getResource(
"棋盘.jpg"));
g.drawImage(img, 2, 26, 500, 500, null); this.qipan.paint(g);
}
public void reset() {
this.qipan=new Qipan(14);
}
// //////////////////////////////调用线程,每隔200毫秒重新画一次界面///////////////////////////////////
class MyThread extends Thread { public void run() {
while (start) {
qpf.repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// //////////////////////////////鼠标的监听类,控制鼠标点击键盘时候画出一个棋子////////////////
class MouseMonitor extends MouseAdapter {
private Boolean whiteOrBlack = false; public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("x:" + x + " y:" + y);

            //处理边缘问题:
int j = (x - 22) / 34;
if ((x - 22) % 34 >= 17) {
j++;
}

int i = (y - 28) / 34;
if ((y - 28) % 34 > 17) {
i++;
} //System.out.println("i:" + i + " j:" + j);

//判断是白方还是黑方下子,白方用1表示,黑方用2表示
int xiaqi = 0;
if (!whiteOrBlack) {
xiaqi = 1;
} else {
xiaqi = 2;
}
            
//判断鼠标点击的是不 是边界:如果越界,就下子失败,
if (i > 0 && i < 14 && j > 0 && j < 14) {

//下子到已经有子的地方,就下子失败,setQIZI的方法就返回结果0;成功则发回结果1
int jieguo = qpf.qipan.setQIZI(i, j, xiaqi);

//如果下棋成功,轮到对方下子;
if (jieguo == 1) {
whiteOrBlack = !whiteOrBlack;
}
   
//判断此时的局势是不是有人胜出
Boolean win = TestWin.isWin(qipan, xiaqi);
if (win) {
if (xiaqi == 1) {
System.out.println("白方赢了");
Dialog log = new Dialog(qpf, "白方赢了!");
log.setLocation(500, 500);
log.setVisible(true);
qpf.reset();
this.whiteOrBlack=false;
} else {
System.out.println("黑方赢了");
Dialog log = new Dialog(qpf, "黑方赢了!");
log.setLocation(500, 500);
log.setVisible(true);
} }
}
} }}棋盘实体类:package com.gzsoft.wuziqi;import java.awt.Color;
import java.awt.Graphics;/**
 * 棋盘类,
 * 
 * @author lyp
 * 
 */
public class Qipan { // 1棋盘的大小;默认为9*9的棋盘;
private int size = 9;
private int[][] qipanSHUZU = null; private Boolean lunliuxiaqi = false; // 2构造方法1
public Qipan() {
setQipanSHUZU(new int[size][size]);
} // 3构造方法2
public Qipan(int size) {
this.size = size;
setQipanSHUZU(new int[size][size]);
} // --------------setter and getter----------------- public void setQipanSHUZU(int[][] qipanSHUZU) {
this.qipanSHUZU = qipanSHUZU;
} public int[][] getQipanSHUZU() {
return qipanSHUZU;
} public int getSize() {
return size;
} public  int setQIZI(int i, int j, int qizi) {
if(this.qipanSHUZU[i][j]==0){
this.qipanSHUZU[i][j]=qizi;
return 1;
}else{
return 0;
}
} public void show() {
TestWin.showQipan(this);
} public void paint(Graphics g) {
Color c = g.getColor();
int size = this.getSize();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if(qipanSHUZU[i][j] != 0){
if (qipanSHUZU[i][j] == 1) {
g.setColor(Color.WHITE);
}
else if(qipanSHUZU[i][j] == 2){
g.setColor(Color.BLACK);
}

int y = i * 34 + 22;
int x = j * 34 + 28-17-10;
//System.out.println("dangqiand weizi x:"+x+" y:"+y);
g.fillOval(x, y, 34, 34);
}
} }

g.setColor(c);
}
}检测是否有人胜出的类,静态方法iswin(棋盘 棋盘对象)package com.gzsoft.wuziqi;public class TestWin { public static void main(String[] args) { int size = 9;
int[][] qipan = new int[size][size]; /*qipan[1][1] = 1;
qipan[1][2] = 1;
qipan[1][3] = 1;
qipan[1][4] = 1;*/ /*qipan[2][1] = 1;
qipan[2][2] = 1;
qipan[2][3] = 1;
qipan[2][4] = 1;
qipan[2][5] = 1;*/ qipan[1][1]=1;
qipan[2][1]=1;
qipan[2][2] = 1;
qipan[3][1] = 1;
qipan[4][1] = 1;
//qipan[5][1] = 1; qipan[3][3] = 1;
qipan[4][4] = 1;
//qipan[5][5] = 1; qipan[0][5] = 1;
qipan[1][4] = 1;
qipan[2][3] = 1;
qipan[3][2] = 1; Qipan q = new Qipan(9);
q.setQipanSHUZU(qipan);
showQipan(q); System.out.println("-----------------------------------");
if(isWin(q,1)){
System.out.println("win");
}
else{
System.out.println("not win");
}

} public static void showQipan(Qipan q) {
int [][] qipan=q.getQipanSHUZU();
int size=q.getSize();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
System.out.print(" " + qipan[i][j]);
}
System.out.print("\n");
}
} public static Boolean isWin(Qipan qipan,int oneORtwo) { int size = qipan.getSize();
int[][] qipanSHUZU = qipan.getQipanSHUZU();

int flag = 0; Boolean win = false;
// ///////////////////////////////////////横向检查是否已经win?
if (!win) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if ((qipanSHUZU[i][j]) == oneORtwo) {
flag++;
} else{
flag = 0;
}
if (flag >= 5) {
win = true;
System.out.print("纵向检查是否已经win?---win!!!!!!!");
break;
}
}
if(win){ return win; }
}
}
// ///////////////////////////////////////纵向检查是否已经win?
if (!win) {
for (int i = 0; i < size; i++) {

for (int j = 0; j < size; j++) {
if ((qipanSHUZU[j][i]) == oneORtwo) {
flag++;
} else{
flag = 0;
}
if (flag >= 5) {
flag = 0;
win=true;
System.out.print("纵向检查是否已经win?---win!!!!!!!");
break;
}
}
if(win){
return win;
}
}


}
// //////////////////////////////////////////////////////////////斜向检查是否已经win?
if (!win) {
int i1 = 8;
int j1 = 0;
while (j1 <= 8) { // 内部循环使用的限制;
int i2 = i1;
int j2 = j1;
int iLimit = 13 - j1;
int jLimit = 13 - i1; while (i1 <= iLimit && j2 <= jLimit) {
if (qipanSHUZU[i2][j2] == oneORtwo) {
flag++;
} else {
flag = 0;
} if (flag >= 5) {
win=true;
System.out.print("斜向检查是否已经win?\\\\win!!!!!!!");
flag = 0;
break;
}
i2++;
j2++;
}

if(win){
return win;
} if (i1 == 0) {
j1++;
} else {
i1--;
}
}
System.out.println("-----------------------------------");
}
// //////////////////////////////////////////////////////////////反斜向检查是否已经win?
if (!win) {
int i1 = 0;
int j1 = 8;
while (i1 <= 13) { // 内部循环使用的限制;
int i2 = i1;
int j2 = j1;
int iLimit = j1;
int jLimit = i1; while (i1 <= iLimit && j2 >= jLimit) { if (qipanSHUZU[i2][j2] == oneORtwo) {
flag++;
} else {
flag = 0;
} if (flag >= 5) {
win=true;
flag = 0;
System.out.print("反斜向检查是否已经win? ////win!!!!!!!");
break;
}
i2++;
j2--;
}

if(win){
return win;
} if (j1 == 13) {
i1++;
} else {
j1++;
} }

}

return win;
}
}

解决方案 »

  1.   

    程序在功能实现上已经很完美。稍微提点小建议。尽量少出现固定的数字,比如13,8,程序做好了,完全可以实现只修改一个变量值,就能完成棋盘布局从13*13到14*14的转变。
      

  2.   

    做的也好,建议的也好,好好顶下嘿
      

  3.   

    感谢向我们这些新手的分享,支持!!!!!!!!!!!!!