用Java编写简单的五子棋

前言

   这两天在空闲时间做了个五子棋项目,分享给大家看一下,界面是这样的:
   
   呜呜呜,界面很丑我知道,本人虽有几年PS基础,但知识浅薄,审美观不尽人意,做到如此实属极限(其实我懒得做了),大家将就着看看吧。
   
   下面放出代码,为方便大家参考,我几乎每条代码都标有注释。
   

测试类代码


public class Test {public static void main(String[] args) {MyJFrame mj=new MyJFrame();mj.myJFrame();}
}

   

MyJFrame类代码

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class MyJFrame extends JFrame implements MouseListener {int qx = 20, qy = 40, qw = 490, qh = 490;//棋盘位置、宽高int bw = 150, bh = 50, bx = 570, by = 150;//按钮宽高、位置int x = 0, y = 0;//保存棋子坐标int[][] SaveGame = new int[15][15];//保存每个棋子int qc = 1;//记录白棋=2,黑棋=1int qn = 0;//判断棋子是否重复boolean canplay = true;//判断游戏是否开始和结束String go = "黑子先行";//游戏信息//---------------------------------------------------------------------------------------------------------------------//窗体public void myJFrame() {this.setTitle("五子棋"); //标题this.setSize(800, 550); //窗口大小this.setResizable(false); //窗口是否可以改变大小=否this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);//窗口关闭方式为关闭窗口同时结束程序int width = Toolkit.getDefaultToolkit().getScreenSize().width;//获取屏幕宽度int height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕高度
//        System.out.println("宽度:"+width);//测试
//        System.out.println("高度:"+height);//测试this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中this.addMouseListener(this);this.setVisible(true); //窗口是否显示=是}//---------------------------------------------------------------------------------------------------------------------//覆写paint方法,绘制界面public void paint(Graphics g) {//双缓冲技术防止屏幕闪烁BufferedImage bi = new BufferedImage(800, 550, BufferedImage.TYPE_INT_ARGB);Graphics g2 = bi.createGraphics();//获取图片路径BufferedImage image = null;try {image = ImageIO.read(new File("D:/#Java/五子棋/tp/wzqbj.jpg"));} catch (IOException e) {e.printStackTrace();}g2.drawImage(image, 10, 10, this);//显示图片g2.setColor(Color.BLACK);//设置画笔颜色g2.setFont(new Font("华文行楷", 10, 50));//设置字体g2.drawString("晓时五子棋", 525, 100);//绘制字符//棋盘g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//设置画笔颜色g2.fillRect(qx, qy, qw, qh);//绘制棋盘背景矩形//开始按钮g2.setColor(Color.WHITE);//设置画笔颜色g2.fillRect(bx, by, bw, bh);//绘制开始按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.black);//设置画笔颜色g2.drawString("开始", 615, 185);//绘制字符//悔棋按钮g2.setColor(Color.LIGHT_GRAY);//设置画笔颜色g2.fillRect(bx, by + 60, bw, bh);//绘制悔棋按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.WHITE);//设置画笔颜色g2.drawString("悔棋", 615, 245);//绘制字符//认输按钮g2.setColor(Color.GRAY);//设置画笔颜色g2.fillRect(bx, by + 120, bw, bh);//绘制认输按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.WHITE);//设置画笔颜色g2.drawString("认输", 615, 305);//绘制字符//游戏信息栏g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//设置画笔颜色g2.fillRect(550, 350, 200, 150);//绘制游戏状态区域g2.setColor(Color.black);//设置画笔颜色g2.setFont(new Font("黑体", 10, 20));//设置字体g2.drawString("游戏信息", 610, 380);//绘制字符g2.drawString(go, 610, 410);//绘制字符g2.drawString("作者:晓时谷雨", 560, 440);//绘制字符g2.drawString("联系方式:", 560, 465);//绘制字符g2.drawString("qq 717535996", 560, 490);//绘制字符g2.setColor(Color.BLACK);//设置画笔颜色//绘制棋盘格线for (int x = 0; x <= qw; x += 35) {g2.drawLine(qx, x + qy, qw + qx, x + qy);//绘制一条横线g2.drawLine(x + qx, qy, x + qx, qh + qy);//绘制一条竖线}//绘制标注点for (int i = 3; i <= 11; i += 4) {for (int y = 3; y <= 11; y += 4) {g2.fillOval(35 * i + qx - 3, 35 * y + qy - 3, 6, 6);//绘制实心圆}}//绘制棋子for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (SaveGame[i][j] == 1)//黑子{int sx = i * 35 + qx;int sy = j * 35 + qy;g2.setColor(Color.BLACK);g2.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆}if (SaveGame[i][j] == 2)//白子{int sx = i * 35 + qx;int sy = j * 35 + qy;g2.setColor(Color.WHITE);g2.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆g2.setColor(Color.BLACK);g2.drawOval(sx - 13, sy - 13, 26, 26);//绘制空心圆}}}g.drawImage(bi, 0, 0, this);//        g.drawRect(20, 20, 20, 20);//绘制空心矩形}//---------------------------------------------------------------------------------------------------------------------//判断输赢private boolean WinLose() {boolean flag = false;//输赢int count = 1;//相连数int color = SaveGame[x][y];//记录棋子颜色//判断横向棋子是否相连int i = 1;//迭代数while (color == SaveGame[x + i][y]) {count++;i++;}i = 1;//迭代数while (color == SaveGame[x - i][y]) {count++;i++;}if (count >= 5) {flag = true;}//判断纵向棋子是否相连count = 1;i = 1;//迭代数while (color == SaveGame[x][y + i]) {count++;i++;}i = 1;//迭代数while (color == SaveGame[x][y - i]) {count++;i++;}if (count >= 5) {flag = true;}//判断斜向棋子是否相连(左上右下)count = 1;i = 1;//迭代数while (color == SaveGame[x - i][y - i]) {count++;i++;}i = 1;//迭代数while (color == SaveGame[x + i][y + i]) {count++;i++;}if (count >= 5) {flag = true;}//判断斜向棋子是否相连(左下右上)count = 1;i = 1;//迭代数while (color == SaveGame[x + i][y - i]) {count++;i++;}i = 1;//迭代数while (color == SaveGame[x - i][y + i]) {count++;i++;}if (count >= 5) {flag = true;}return flag;}//---------------------------------------------------------------------------------------------------------------------//初始化游戏public void Initialize() {//遍历并初始化数组for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {SaveGame[i][j] = 0;}}//黑子先行qc = 1;go = "轮到黑子";}//---------------------------------------------------------------------------------------------------------------------@Override//鼠标点击public void mouseClicked(MouseEvent e) {}@Override//鼠标按下public void mousePressed(MouseEvent e) {//获取鼠标点击位置x = e.getX();y = e.getY();//判断是否已开始游戏if (canplay == true) {//判断点击是否为棋盘内if (x > qx && x < qx + qw && y > qy && y < qy + qh) {//计算点击位置最近的点if ((x - qx) % 35 > 17) {x = (x - qx) / 35 + 1;} else {x = (x - qx) / 35;}if ((y - qy) % 35 > 17) {y = (y - qy) / 35 + 1;} else {y = (y - qy) / 35;}//判断当前位置有没有棋子if (SaveGame[x][y] == 0) {SaveGame[x][y] = qc;qn = 0;} else {qn = 1;}//切换棋子if (qn == 0) {if (qc == 1) {qc = 2;go = "轮到白子";} else {qc = 1;go = "轮到黑子";}}this.repaint();//重新执行一次paint方法//弹出胜利对话框boolean wl = this.WinLose();if (wl) {JOptionPane.showMessageDialog(this, "游戏结束," + (SaveGame[x][y] == 1 ? "黑方赢了" : "白方赢了"));//弹出提示对话框canplay = false;}//            System.out.println(1);//测试} else {//            System.out.println(0);//测试}}//实现开始按钮//判断是否点击开始按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by && e.getY() < by + bh) {//判断游戏是否开始if (canplay == false) {//如果游戏结束,则开始游戏canplay = true;JOptionPane.showMessageDialog(this, "游戏开始");//初始化游戏Initialize();this.repaint();//重新执行一次paint方法} else {//如果游戏进行中,则重新开始JOptionPane.showMessageDialog(this, "重新开始");//初始化游戏Initialize();this.repaint();//重新执行一次paint方法}}//实现悔棋按钮//判断是否点击悔棋按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 60 && e.getY() < by + 60 + bh) {//判断游戏是否开始if (canplay == true) {//遍历棋盘上是否有棋子int z = 0;for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (SaveGame[i][j] != 0) {z++;}}}//判断是否有棋子if (z != 0) {JOptionPane.showMessageDialog(this, "下棋亦如人生,你走的每一步都没有回头路。");} else {JOptionPane.showMessageDialog(this, "棋盘上已无棋子");}} else {JOptionPane.showMessageDialog(this, "请先开始游戏");}}//实现认输按钮//判断是否点击认输按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 120 && e.getY() < by + 120 + bh) {//判断游戏是否开始if (canplay == true) {//判断是谁认输if (qc == 1) {JOptionPane.showMessageDialog(this, "黑方认输,白方获胜");canplay = false;} else if (qc == 2) {JOptionPane.showMessageDialog(this, "白方认输,黑方获胜");canplay = false;}} else {JOptionPane.showMessageDialog(this, "请先开始游戏");}}}@Override//鼠标抬起public void mouseReleased(MouseEvent e) {}@Override//鼠标进入public void mouseEntered(MouseEvent e) {}@Override//鼠标离开public void mouseExited(MouseEvent e) {}
}

   

结束语

   因为是我自己测试的,主要功能应该没问题,可能会忽略一些细节,如有不对的地方,请帮忙指出。
   我一直坚持“分享知识”的原则,免费透明的将全部代码公开展示,如果帮到了你,请顺手点个赞吧(#.#)。

更新了!

2021-1-25
   实现悔棋功能
   其实这个功能在完成这个项目后不久就做出来了,但是有很多同学不知道,找了很久。都怪我没有贴出来,我的锅(大哭)。
   
2022-02-04
   增加了人机对战功能
   收到大家反馈需要这个功能,趁着年假有时间,花了一下午将这个功能做了出来,送给大家作为新年礼物。
   
   
   
   

Java五子棋全代码相关推荐

  1. Java五子棋全代码-增加了人机对战功能

    用Java编写简单的五子棋--人机对战! 前言 2022-02-04,农历正月初四   首先在这祝大家新年快乐.   距离上两个版本的更新已经过去了很久,因为年前工作非常忙,经常熬到凌晨,导致我看大家 ...

  2. java五子棋悔棋代码_小猿圈前端编写JS五子棋游戏

    前段时间发的飞机大战的游戏很多小伙伴都私聊让再做个游戏,今天小猿圈web前端讲师为大家分享的是JS五子棋的游戏,想玩的小伙伴记得自己运行一下呦. JS五子棋游戏代码: 五子棋 canvas { dis ...

  3. 新手java五子棋完整代码判断落子落在线上_Java初学者,编写小游戏五子棋的问题?...

    首先你需要掌握GUI编程,事件处理,已经监听器,你就掌握Swing的知识就好了Swing框架,JFrame,JPanel,鼠标.键盘监听事件 Java基础,面向对象,异常处理,集合,IO流 网络编程, ...

  4. 新手java五子棋完整代码判断落子落在线上_JAVA五子棋开发

    让我们来思考一个问题:如何用Java来开发出一个五子棋项目?首先,没有界面其它的也就无从谈起,这里需要用到Java的SWING与AWT组件:有了五子棋界面,我们要能在界面上画出黑白棋子:最后,能够对输 ...

  5. java五子棋gui代码_java GUI实现五子棋游戏

    本文实例为大家分享了java实现五子棋游戏GUI,供大家参考,具体内容如下 引用包 //{Cynthia Zhang} import java.awt.*; import java.awt.event ...

  6. java五子棋游戏代码,已获万赞

    美团一面: 收到了HR的信息,通知我去面试,说实话真的挺紧张的.自己准备了近一个月的时间,很担心面试不过,到时候又后悔不该"裸辞". 自我介绍 spring的IOC,AOP原理 s ...

  7. Java面试题库,java五子棋游戏代码

    前言 最其实不管什么时候,找工作都跑不了面试.目前很多小编都做了面试手册了,那就是别人家的孩子都有糖了,作为一个自觉的小编,必须搞. 容我先絮叨一下,制作这个面试手册差不多花了3个多星期时间,过程还是 ...

  8. Java五子棋最全教程

    Java五子棋最全教程 Ps:首先当我们做一个项目时应该培养这样一种思维即这个项目怎么开展,分为哪几个功能,这每个功能又该分为哪几步去实现,只有确定了基本路线,才有利于我们设计程序的基本结构,也让我们 ...

  9. Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战

    Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战 玩家对战模式 背景说明 代码实现 人机对战模式 背景说明 完整代码实现 电脑根据优势分数对战 背景说明 完整代码实现 小结 玩家 ...

  10. java五子棋棋盘_java绘制五子棋棋盘代码示例

    本篇文章小编给大家分享一下java绘制五子棋棋盘代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 代码如下: import javax.imag ...

最新文章

  1. C#中调用Windows API时的数据类型对应关系
  2. ubuntu通过apt-get方式搭建lnmp环境以及php扩展安装
  3. 阿里巴巴公布第二财季报告,净利润同比增长71%
  4. Java设计模式(二十二):原型设计模式
  5. C++运算符重载讲解与经典实例
  6. Hbase写数据,存数据,读数据的详细过程
  7. sql 某字段存储另一个表的多个id值并以逗号分隔,现根据id去中文并拼接同样以逗号分隔...
  8. 4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂
  9. 垃圾回收算法以及垃圾回收器_什么是垃圾回收?
  10. 辗转相除法--最大公约数/最大公倍数
  11. 为了实现自己的美好程序人生
  12. Ruby对象、变量和常量
  13. (二)原生JS实现 - 事件类方法
  14. 使用EasyRecovery轻松修复损坏的照片
  15. 语文学科html代码,语文教育专业介绍 [代码660201]
  16. PS钢笔工具使用方法简介
  17. DFD数据流图的基本要素及易错点详细介绍
  18. MOCTF-WRITE-UP(二)
  19. 软件开发流程中的测试及测试方法简介
  20. 1.6 建立Servers服务(2020-12-6)

热门文章

  1. python 幂次方_python次方运算
  2. 谈计算机财务管理的相关论文,有关计算机财务管理的思考论文
  3. python绘制emoji_在Python中将emoji转换为文本
  4. 桌面运维转网络要做什么准备,高级网工学习路线分享
  5. java docx4j 使用教程_使用Docx4j操作PPT指南系列(二)
  6. 数学建模——指派问题
  7. 一文小入门pyQt5 —— 从零到一完成一个Excel文件处理程序
  8. SoundPool详解
  9. Android List的混排 随机排序
  10. 实现内外网互通-概述