Java实现五子棋游戏的完整代码

用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,黑棋=1
 int 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) {

 }
}

结束语

因为是我自己测试的,主要功能应该没问题,可能会忽略一些细节,如有不对的地方,请帮忙指出。

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-10-15

java实现单机版五子棋

这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~ 一.该游戏需要实现 1.设计主框架,界面. 2.利用ActionListener接口实现按钮事件的监听. 3.重新开始功能的实现. 4.悔棋功能的实现. 5.退出功能的实现. 6.棋盘中棋子点类的定义. 7.利用MouseListener接口实现事件监听,并实现接口里的所有方法. 8.当鼠标移动到棋盘上的交点上,且该点上无棋子时能够变成小手形状. 9.点击棋盘时

Java编程实现五子棋人人对战代码示例

利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

Java实现两人五子棋游戏(二) 画出棋盘

本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

java实现单人版五子棋游戏

本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

Java实现两人五子棋游戏(三) 画出棋子

上一篇文章讲的是Java实现两人五子棋游戏(二) 画出棋盘,已经画好棋盘,接下来要实现控制功能,主要功能: 1)选择棋子 2)画棋子 3)判断胜负 4)交换行棋方 先实现画棋子PART -------------画棋子代码示例如下-------------- 首先,定义一个棋子类,这个类有两个属性,棋子颜色(0-表示黑色,1-表示白色),是否落子(我计划用一个二维数组才存储棋子的落子信息) Chessman.java package xchen.test.simpleGobang; public

java基于swing实现的五子棋游戏代码

本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

java实现五子棋小游戏

java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

Java棋类游戏实践之单机版五子棋

本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 一.实践目标        1.掌握JavaGUI界面设计        2.掌握鼠标事件的监听(MouseListener,MouseMotionListener) 二.实践内容       设计一个简单的五子棋程序,能够实现五子棋下棋过程.如下图所示 1.五子棋棋盘类 package cn.edu.ouc.fiveChess; import java.awt.Color; import java.awt.Curs

Java实现五子棋AI算法

五子棋AI算法 也算是一个典型的游戏AI算法,一些棋类的AI算法都可以参考实现,下面是Java实现代码 棋盘抽象接口 import java.util.List; public interface IChessboard { //取得棋盘最大横坐标 public int getMaxX(); //最大纵坐标 public int getMaxY(); //取得当前所有空白点,这些点才可以下棋 public List<Point> getFreePoints(); } 棋子类实现 //棋子类 p

Java实现五子棋网络版

本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务器上创建新游戏或加入已创建的游戏 4.用户在下棋的时候可以进行聊天交流 由上可以知道需要实现的功能: ·提供服务器和客户端的功能 ·服务器将监听客户端的登录情况并允许多个客户端进行登录 ·用户通过客户端可以登录服

Java swing五子棋的实现方法

今天给大家介绍一下如何用Java swing实现五子棋的开发即用Java开发图形界面程序五子棋,代码由于太多,只贴部分,最下面会附上下载地址,废话不多说,下面我们先看一下运行结果: 接下来我们看代码: 首先是创建主frame框架界面: package org.liky.game.frame; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import

Java五子棋单机版源码分享

初学JavaGUI编程,就写了一个小游戏–五子棋. 目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊. 此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的. 源码已提交至GitHub,点击此处GitHub源码 以下列出其中的五子棋类: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; imp

Java实现两人五子棋游戏(七) 屏幕提示信息

之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现:Java实现两人五子棋游戏(六) 行棋方变换,可以点击查看. 接下来我们要实现的功能是在有五连珠的时候,在屏幕上提示信息.直接在mousePressed函数的isWin部分使用showMessageDialog即可. mousePressed函数代码如下: @Override //当用户按下鼠标按钮时发生 public void mousePr

Java实现两人五子棋游戏(六) 行棋方变换

之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好棋盘和棋子,并可以自由落子,且可以判断棋盘中是否有五连珠.接下来的工作是,每次落子后交换行棋方(即将下一棋子颜色由白->黑或黑->白),并将胜出判断增加颜色判断条件(棋盘上存在五连珠->棋盘上存在同色的五连珠). 主模块Main.java和棋子类Chessman.java不变,我们要对DrawChessB

Java实现两人五子棋游戏(五) 判断是否有一方胜出

之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘:Java实现两人五子棋游戏(三) 画出棋子:Java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看. 前面我们已经画好了棋盘.棋子并且可以自由的落子了,那么接下来要实现的功能是判断是否有五连珠(暂时不考虑行棋方). 我们采用遍历棋盘已经落子的位置,查看每个落子点,在它的上下,左右,左下右上,左上右下四个方向的任一方向上是否有五个连续的棋子. 第一步,对棋子类进行改造,之前我们的棋子类只有颜色信息和落子状态,现在要新增一个int型