菜鸟写的一个五子棋游戏,两个人轮流下的,求狂批!
窗口类:
- 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的转变。
[解决办法]
做的也好,建议的也好,好好顶下嘿
[解决办法]
这五子棋写的真够烂的。。
[解决办法]
感谢向我们这些新手的分享,支持!!!!!!!!!!!!!