读书人

初学者写的一个五子棋游戏两个人轮流

发布时间: 2012-03-12 12:45:33 作者: rapoo

菜鸟写的一个五子棋游戏,两个人轮流下的,求狂批!
窗口类:

Java code
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);                    }                }            }        }    }} 



棋盘实体类:
Java code
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(棋盘 棋盘对象)
Java code
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;    }} 





[解决办法]
程序在功能实现上已经很完美。稍微提点小建议。

尽量少出现固定的数字,比如13,8,程序做好了,完全可以实现只修改一个变量值,就能完成棋盘布局从13*13到14*14的转变。
[解决办法]
做的也好,建议的也好,好好顶下嘿
[解决办法]
这五子棋写的真够烂的。。
[解决办法]
感谢向我们这些新手的分享,支持!!!!!!!!!!!!!

读书人网 >J2SE开发

热点推荐