基本思路:
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 <chessArr[0].length ; i++) { //最后一个棋子向右查找 //chessArr[0].length指横向的长度 //chessArr.length指纵向的长度 //注意边界问题 if (chessArr[n][m] == chessArr[n][i]){ count ++; System.out.println("count1="+count); }else break; }
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<chessArr.length; i++){ //下
if(chessArr[n][m]==chessArr[i][m]){
count ++;
System.out.println("向下查找第" + count+"个棋子");
}
}
for (int i = n-1; 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<chessArr.length&&j<chessArr[0].length;i++,j++){ //右下
if (chessArr[n][m] == chessArr[i][j]) {
count++;
System.out.println("向右下查找第" + count+"个棋子");
}
}
return count;
}
private int Xie2(int[][] chessArr, int n, int m){
int count = 0;
for(int i = n,j = m-1; i< chessArr.length&&j>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<chessArr.length; i++){ //下
if(chessArr[n][m]==chessArr[i][m]){
count ++;
System.out.println("向下查找第" + count+"个棋子");
}
}
for (int i = n-1; 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<chessArr.length&&j<chessArr[0].length;i++,j++){ //右下
if (chessArr[n][m] == chessArr[i][j]) {
count++;
System.out.println("向右下查找第" + count+"个棋子");
}
}
return count;
}
private int Xie2(int[][] chessArr, int n, int m){
int count = 0;
for(int i = n,j = m-1; i< chessArr.length&&j>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;
}
}