【Java之五子棋】——java五子棋游戏

基本思路:

1.先有一个界面可以弹出窗口,在界面上重写paint方法,在这个方法里加入棋盘,使得棋盘可以不断重绘,不会因为刷新而消失;

2.创建鼠标监听器,为了让鼠标监听器界面可以下黑白棋子;

3.再创建一个判断输赢的类,可以用数组来存储棋子

接下来完成具体步骤:

1.创建一个Gobang的类,继承了JFrame的功能,因此以前会写jf.setTitle("五子棋");这里就可以用this代替或者不写,下面这四个就是分别用了这两个方法

【Java之五子棋】——java五子棋游戏_第1张图片

【Java之五子棋】——java五子棋游戏_第2张图片

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的四个坐标分别表示起点的坐标和它的长宽,这样我们就可以写出如下方法:

【Java之五子棋】——java五子棋游戏_第3张图片

界面就是现在这样:

【Java之五子棋】——java五子棋游戏_第4张图片

3.接下来创建Gobanglistener鼠标监听器,连接Graphics画笔,为了之后可以下棋子,具体方法不再赘述,详细请看之前的鼠标监听器文章

【Java之五子棋】——java五子棋游戏_第5张图片

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 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;i0 ; 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;i0 ; 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;
    }


}

你可能感兴趣的:(java,java,开发语言,后端)