【Java之五子棋】——java五子棋游戏
基本思路:
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五子棋游戏相关推荐
- JAVA 实现《五子棋单机版》游戏
前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围 ...
- 面向对象程序设计(Java)课程设计——五子棋小游戏
目录 一.团队成员及任务 二.项目简介 三.功能设计图 四.运行结果截图 五.核心源码 六.课程设计感想与展望 一.团队成员及任务 队长:管俊杰 计科(智能)22-1 202203200037 负责 ...
- 控制台五子棋java源代码_两套 五子棋小游戏源码(控制台+JavaSWing)
[实例简介] [实例截图] [核心代码] 五子棋 ├── 图形 │ ├── java五子棋小程序.doc │ ├── 五子棋 │ │ ├── bin │ │ │ └── c ...
- 五子棋java毕业设计论文_基于Java的五子棋游戏的设计毕业论文,课程设计,研究生文献...
2 课题相关基础 2.1 五子棋 2.1.1 棋盘和棋子 现代五子棋棋盘,经过国际棋联的多次修改,最终定为15 X 15路,即棋盘由横竖各15条平行线交叉组成,共有225个交叉点:棋盘上共有五个星位, ...
- 基于Java编写的网络五子棋
需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以 ...
- 五子棋java百度文库_JAVA课程设计 五子棋(内附完整代码).doc
JAVA课程设计 五子棋(内附完整代码) JAVA课程设计 设计题目:五子棋游戏 简要的介绍五子棋 五子棋的起源 五子棋,又被称为"连五子.五子连.串珠.五目.五目碰.五格.五石.五法.五联 ...
- 五子棋 java 课设,五子棋java课程设计
五子棋java课程设计 目目 录录 一.课程设计任务及要求 1 二.需求分析. 1 2.1 棋盘板块 .1 2.2 聊天板块 .1 2.3 ChatSever .1 2.4 编译环境 .1 2.5 参 ...
- java双人对战五子棋(socket通信)
学习java的时候一直想要做出一个像样的小游戏,所以就动手做了一个远程联网对战的java五子棋小游戏.这个程序我前前后后也是改动了几次,这次发出来的是最终版本了,虽然还是有很多不足,但本人已经没有精力 ...
- Java课程设计-简单五子棋
五子棋介绍 五子棋是起源于中国古代的传统黑白棋种之一.五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.五子棋既有现代休闲的明显特征"短.平.快",又有古典哲学的高 ...
- 如果用java swing编写一个五子棋(人人对战)
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书. 很感谢能有这样一个平 ...
最新文章
- OpenCV中图像窗口的鼠标事件
- 蓝桥杯-c++_ch04_02_修正版(java)
- 有幸见到一朵花的绽放
- Bash脚本教程之条件判断
- (转)HTTP 长连接和短连接
- 三星Galaxy S22系列发布会准确时间曝光:2月9日正式揭晓
- (八)ASP.NET自定义用户控件(1)
- Java8 新JavaScript脚本引擎Nashorn小试
- 挑战性题目DSCT401:全源最短路径Floyd算法的并行实现
- Java自学免费视频教程
- Win11繁体中文字体显示不全如何解决?
- Kafka Eagle安装详情及问题解答
- QTreeView+自定义Model实现示例
- 必须知道的C语言知识细节:单引号和双引号正确用法
- 腾讯万亿级 Elasticsearch
- LINQ Group Query
- Java毕业设计_图书馆信息管理系统
- 刷问卷星调查问卷_如何通过回答快速调查问卷从Google获得免费资金
- kylin官方给出的优化 以及各个步骤容易出现的问题
- ld --whole-archive 和 --no-whole-archive学习记录
热门文章
- idea启动项目报错 --To prevent a memory leak, the JDBC Driver has been forcibly unregistered
- QQ聊天机器人--基于酷Q写的插件
- 爱了爱了!丰巢智能政务柜真的太实用了
- vnc支持用计算机民远程吗,使用vnc连接远程计算机
- 对比分析高速传输和同步软件:Aspera 与 镭速(Raysync)
- 基于Python实现Jacobi迭代法、Gauss-Seidel迭代法和SOR法方程组(二)
- 雷诺手表如何查真假?如何判断雷诺手表是否为真品?
- 【文智背后的奥秘】系列篇——文本聚类系统
- windows的特殊对话框
- RocketMQ 问题记录