基本思路:

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下白棋@Overridepublic 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);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic 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];@Overridepublic 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);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic 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;}}

【Java之五子棋】——java五子棋游戏相关推荐

  1. JAVA 实现《五子棋单机版》游戏

    前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围 ...

  2. 面向对象程序设计(Java)课程设计——五子棋小游戏

    目录 一.团队成员及任务 二.项目简介 三.功能设计图 四.运行结果截图 五.核心源码 六.课程设计感想与展望 一.团队成员及任务 队长:管俊杰  计科(智能)22-1 202203200037 负责 ...

  3. 控制台五子棋java源代码_两套 五子棋小游戏源码(控制台+JavaSWing)

    [实例简介] [实例截图] [核心代码] 五子棋 ├── 图形 │   ├── java五子棋小程序.doc │   ├── 五子棋 │   │   ├── bin │   │   │   └── c ...

  4. 五子棋java毕业设计论文_基于Java的五子棋游戏的设计毕业论文,课程设计,研究生文献...

    2 课题相关基础 2.1 五子棋 2.1.1 棋盘和棋子 现代五子棋棋盘,经过国际棋联的多次修改,最终定为15 X 15路,即棋盘由横竖各15条平行线交叉组成,共有225个交叉点:棋盘上共有五个星位, ...

  5. 基于Java编写的网络五子棋

    需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以 ...

  6. 五子棋java百度文库_JAVA课程设计 五子棋(内附完整代码).doc

    JAVA课程设计 五子棋(内附完整代码) JAVA课程设计 设计题目:五子棋游戏 简要的介绍五子棋 五子棋的起源 五子棋,又被称为"连五子.五子连.串珠.五目.五目碰.五格.五石.五法.五联 ...

  7. 五子棋 java 课设,五子棋java课程设计

    五子棋java课程设计 目目 录录 一.课程设计任务及要求 1 二.需求分析. 1 2.1 棋盘板块 .1 2.2 聊天板块 .1 2.3 ChatSever .1 2.4 编译环境 .1 2.5 参 ...

  8. java双人对战五子棋(socket通信)

    学习java的时候一直想要做出一个像样的小游戏,所以就动手做了一个远程联网对战的java五子棋小游戏.这个程序我前前后后也是改动了几次,这次发出来的是最终版本了,虽然还是有很多不足,但本人已经没有精力 ...

  9. Java课程设计-简单五子棋

    五子棋介绍 五子棋是起源于中国古代的传统黑白棋种之一.五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.五子棋既有现代休闲的明显特征"短.平.快",又有古典哲学的高 ...

  10. 如果用java swing编写一个五子棋(人人对战)

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书. 很感谢能有这样一个平 ...

最新文章

  1. OpenCV中图像窗口的鼠标事件
  2. 蓝桥杯-c++_ch04_02_修正版(java)
  3. 有幸见到一朵花的绽放
  4. Bash脚本教程之条件判断
  5. (转)HTTP 长连接和短连接
  6. 三星Galaxy S22系列发布会准确时间曝光:2月9日正式揭晓
  7. (八)ASP.NET自定义用户控件(1)
  8. Java8 新JavaScript脚本引擎Nashorn小试
  9. 挑战性题目DSCT401:全源最短路径Floyd算法的并行实现
  10. Java自学免费视频教程
  11. Win11繁体中文字体显示不全如何解决?
  12. Kafka Eagle安装详情及问题解答
  13. QTreeView+自定义Model实现示例
  14. 必须知道的C语言知识细节:单引号和双引号正确用法
  15. 腾讯万亿级 Elasticsearch
  16. LINQ Group Query
  17. Java毕业设计_图书馆信息管理系统
  18. 刷问卷星调查问卷_如何通过回答快速调查问卷从Google获得免费资金
  19. kylin官方给出的优化 以及各个步骤容易出现的问题
  20. ld --whole-archive 和 --no-whole-archive学习记录

热门文章

  1. idea启动项目报错 --To prevent a memory leak, the JDBC Driver has been forcibly unregistered
  2. QQ聊天机器人--基于酷Q写的插件
  3. 爱了爱了!丰巢智能政务柜真的太实用了
  4. vnc支持用计算机民远程吗,使用vnc连接远程计算机
  5. 对比分析高速传输和同步软件:Aspera 与 镭速(Raysync)
  6. 基于Python实现Jacobi迭代法、Gauss-Seidel迭代法和SOR法方程组(二)
  7. 雷诺手表如何查真假?如何判断雷诺手表是否为真品?
  8. 【文智背后的奥秘】系列篇——文本聚类系统
  9. windows的特殊对话框
  10. RocketMQ 问题记录