基本思路:
1.先有一个界面可以弹出窗口,在界面上重写paint方法,在这个方法里加入棋盘,使得棋盘可以不断重绘,不会因为刷新而消失;
2.创建鼠标监听器,为了让鼠标监听器界面可以下黑白棋子;
3.再创建一个判断输赢的类,可以用数组来存储棋子
接下来完成具体步骤:
1.创建一个Gobang的类,继承了JFrame的功能,因此以前会写jf.setTitle("五子棋");这里就可以用this代替或者不写,下面这四个就是分别用了这两个方法
2.重写paint方法,绘制棋盘
可以先画两条直线
g.drawLine(100,100,100+450,100); //横线
g.drawLine(100,100,100,100+450);//竖线
网格就是把这两条线循环的向下和向右画出来,所以我们只需要写一个循环就可以了
//绘制棋盘 for (int i = 0; i <= 15; i++) { g.drawLine(100, 100 + i * 30, 100 + 450, 100 + i * 30); g.drawLine(100 + i * 30, 100, 100 + i * 30, 100 + 450); }
给棋盘底部上色,让他有一个棋盘的样子,注意这里fillRect的四个坐标分别表示起点的坐标和它的长宽,这样我们就可以写出如下方法:
界面就是现在这样:
3.接下来创建Gobanglistener鼠标监听器,连接Graphics画笔,为了之后可以下棋子,具体方法不再赘述,详细请看之前的鼠标监听器文章
4.在监听器中获得鼠标坐标
public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); }
5.实现黑白黑白轮流下棋,只需要设置一个flag,当flag=0表示不下棋,=1表示下黑棋,=2表示下白棋,然后写一个if循环就可以实现啦
int flag =1;//设置状态:0表示不下棋,1下黑棋,2下白棋
public void mouseClicked(MouseEvent e) {
//绘制黑白棋子 if(flag ==1){ g.setColor(Color.BLACK);//下黑棋 flag =2; } else{ g.setColor(Color.WHITE);//下白棋 flag =1; } g.fillOval(x-15,y-15,30,30);//这里-15是减去格子的半径使得棋子刚好落在棋盘网格线上 }
6.校准五子棋坐标
//棋子坐标校准 int m =(x-100+15)/30; int n =(y-100+15)/30; System.out.println("m="+m+ "n="+n); int chessx = 100+m*30; int chessy = 100+n*30;
然后最后应该改为g.fillOval(chessx-15,chessy-15,30,30);
完整代码如下:
package lyq220108五子棋2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Gobanglistener implements MouseListener {
Graphics g; //添加画笔
int flag =1;//设置状态:0表示不下棋,1下黑棋,2下白棋
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
//棋子坐标校准
int m =(x-100+15)/30;
int n =(y-100+15)/30;
System.out.println("m="+m+ "n="+n);
int chessx = 100+m*30;
int chessy = 100+n*30;
//绘制黑白棋子
if(flag ==1){
g.setColor(Color.BLACK);
flag =2;
}
else{
g.setColor(Color.WHITE);
flag =1;
}
g.fillOval(chessx-15,chessy-15,30,30);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
7.棋子如何判断输赢呢??
先创建一个类,用来判断棋子的输赢
public class GobangIswin { //创建一个类,用来判断棋子的输赢 }
判断棋子有八个方向:向上、向下、向左、向右、左上、左下、右上、右下
for (int i = m+1; i for (int i = m; i >= 0; i--) { //最后一个棋子向左查找 if (chessArr[n][m] == chessArr[n][i]){ count ++; System.out.println("count2="+count); }else break; }分别将这八个小方向写成四个大方向
完整代码如下:
package lyq220108五子棋2; public class GobangWin { public boolean Iswin(int[][] chessArr, int n, int m){ System.out.println("iswin"); // if(Row(chessArr, n, m)>=5||Line(chessArr, n, m)>=5){ if(Row(chessArr, n, m)==5||Line(chessArr, n, m)==5||Xie1(chessArr, n, m)==5||Xie2(chessArr, n, m)==5){ return true; } else return false; } private int Row(int[][] chessArr, int n, int m) { System.out.println("row"); int count =0; for (int i = m ; i < chessArr[0].length; i++) { //最后一个棋子向右查找 if (chessArr[n][m] == chessArr[n][i]) { count++; System.out.println("向右查找第" + count+"个棋子"); } } for (int i = m - 1; i > 0; i--) { if (chessArr[n][m] == chessArr[n][i]) { //左 count++; System.out.println("向左查找第" + count+"个棋子"); } } return count; } private int Line(int[][] chessArr, int n, int m) { int count = 0; for(int i = n; i
=0 ; i--) { //上 if (chessArr[n][m] == chessArr[i][m]) { count++; System.out.println("向上查找第" + count+"个棋子"); } } return count; } private int Xie1(int[][] chessArr, int n, int m){ int count = 0; for(int i=n-1,j=m-1;i>=0&&j>0;i--,j--){ //左上 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向左上查找第" + count+"个棋子"); } } for(int i=n,j=m;i 0 ; i++,j--){ //左下 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向左下查找第" + count+"个棋子"); } } for(int i = n-1,j=m; i>=0&&j < chessArr[0].length ; i--,j++){ //右上 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向右上找第" + count+"个棋子"); } } return count; } } 8.在监听器中创建该对象,最后在下棋的时候进行判断就完成啦
//创建判断输赢类的方法 GobangWin gowin = new GobangWin();//绘制黑白棋子 if(flag ==1){ g.setColor(Color.BLACK); if(gowin.Iswin(chessArr,n,m)){ System.out.println("黑棋胜利!"); } flag =2; } else{ g.setColor(Color.WHITE); if(gowin.Iswin(chessArr,n,m)){ System.out.println("白棋胜利!"); } flag =1; } g.fillOval(chessx-15,chessy-15,30,30);9.完整代码如下:
Gobang:
package lyq220108五子棋2; import javax.swing.*; import java.awt.*; public class Gobang extends JFrame { public void showGobang(){ this.setTitle("五子棋1.0"); this.setSize(800,800); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); //连接鼠标监听器 Gobanglistener gbl = new Gobanglistener(); this.addMouseListener(gbl); Graphics g = this.getGraphics(); gbl.g = g; } //重写paint方法,绘制棋盘,保存棋盘 public void paint(Graphics g) { //上颜色 g.setColor(new Color(141, 94, 45)); g.fillRect(80, 80, 490, 490); g.setColor(Color.BLACK); //绘制棋盘 for (int i = 0; i <= 15; i++) { g.drawLine(100, 100 + i * 30, 100 + 450, 100 + i * 30); g.drawLine(100 + i * 30, 100, 100 + i * 30, 100 + 450); } } public static void main(String[] args) { Gobang gobang = new Gobang(); gobang.showGobang(); } }
Gobanglistener:
package lyq220108五子棋2; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Gobanglistener implements MouseListener { Graphics g; //添加画笔 int flag =1;//设置状态:0表示不下棋,1下黑棋,2下白棋 //设置二维数组存储棋子 int[][] chessArr = new int[16][16]; @Override public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); //棋子坐标校准 int m =(x-100+15)/30; int n =(y-100+15)/30; System.out.println("m="+m+ "n="+n); int chessx = 100+m*30; int chessy = 100+n*30; //创建判断输赢类的方法 GobangWin gowin = new GobangWin(); //何时不可以下棋 if(flag==0||chessArr[n][m]!=0||n>=16||m>=16){ return; } chessArr[n][m]=flag; System.out.println("chessArr[][]=flag时的flag="+flag); System.out.println("chessArr[][]=flag时的chessArr="+chessArr[n][m]); //绘制黑白棋子 if(flag ==1){ g.setColor(Color.BLACK); if(gowin.Iswin(chessArr,n,m)){ System.out.println("黑棋胜利!"); } flag =2; } else{ g.setColor(Color.WHITE); if(gowin.Iswin(chessArr,n,m)){ System.out.println("白棋胜利!"); } flag =1; } g.fillOval(chessx-15,chessy-15,30,30); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }
GobangWin:
package lyq220108五子棋2; public class GobangWin { public boolean Iswin(int[][] chessArr, int n, int m){ System.out.println("iswin"); // if(Row(chessArr, n, m)>=5||Line(chessArr, n, m)>=5){ if(Row(chessArr, n, m)==5||Line(chessArr, n, m)==5||Xie1(chessArr, n, m)==5||Xie2(chessArr, n, m)==5){ return true; } else return false; } private int Row(int[][] chessArr, int n, int m) { System.out.println("row"); int count =0; for (int i = m ; i < chessArr[0].length; i++) { //最后一个棋子向右查找 if (chessArr[n][m] == chessArr[n][i]) { count++; System.out.println("向右查找第" + count+"个棋子"); } } for (int i = m - 1; i > 0; i--) { if (chessArr[n][m] == chessArr[n][i]) { //左 count++; System.out.println("向左查找第" + count+"个棋子"); } } return count; } private int Line(int[][] chessArr, int n, int m) { int count = 0; for(int i = n; i
=0 ; i--) { //上 if (chessArr[n][m] == chessArr[i][m]) { count++; System.out.println("向上查找第" + count+"个棋子"); } } return count; } private int Xie1(int[][] chessArr, int n, int m){ int count = 0; for(int i=n-1,j=m-1;i>=0&&j>0;i--,j--){ //左上 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向左上查找第" + count+"个棋子"); } } for(int i=n,j=m;i 0 ; i++,j--){ //左下 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向左下查找第" + count+"个棋子"); } } for(int i = n-1,j=m; i>=0&&j < chessArr[0].length ; i--,j++){ //右上 if (chessArr[n][m] == chessArr[i][j]) { count++; System.out.println("向右上找第" + count+"个棋子"); } } return count; } }