用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) {

}

}

结束语

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

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

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

java五子棋游戏源代码_Java实现五子棋游戏的完整代码相关推荐

  1. java计算器简单源代码_java 简单的计算器程序实例代码

    java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class C ...

  2. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  3. 推箱子游戏 java源代码_java推箱子游戏源代码(含推箱子的判断)

    <java推箱子游戏源代码(含推箱子的判断)>由会员分享,可在线阅读,更多相关<java推箱子游戏源代码(含推箱子的判断)(6页珍藏版)>请在人人文库网上搜索. 1.第一个Ja ...

  4. java开发桌球游戏源代码_Java学习的开端小游戏----桌球游戏

    此小游戏只为让Java初学者感受到学习Java的乐趣,不为严谨. 以下是完整代码: package com.bjsxt.game; import java.awt.Graphics; import j ...

  5. java游戏+弹幕_JAVA 弹幕小游戏 1.0版本

    java 弹幕小游戏 最初版本 最近在学习javaSE,根据b站视频老师的讲解,也参考了他的代码,做了一个弹幕小游戏,也增添了一些自己的代码进去,因为只是最简单的游戏体,以后会慢慢做完整,所以如果有错 ...

  6. java如何开发游戏大厅_java仿qq游戏大厅的设计与实现

    摘要:由于生活节奏的越来越快,人们越来越少的外出游玩.现在的人们为了生活,为了工作,为了家庭无时无刻不在紧张的环境中度过.而一些简单的小游戏则成为了人们放松的主要方式,本文用java语言开发了客户端/ ...

  7. java模拟回合制游戏大小姐_java – 回合制游戏设计:事件驱动与游戏...

    我用Java创建了我的第一个游戏.这场比赛是垄断.我正在努力设计游戏以模拟其回合制结构(管理玩家转弯).我想允许单个人控和一个或多个AI控制的玩家玩游戏. 我的具体问题是我不知道是否实现游戏循环,这意 ...

  8. java开源项目源代码_java开源项目源代码

    java开源项目 源代码 http://www.codase.com/ http://java-source.net/ https://www.dev.java.net/ 名称 摘要 种类 appfu ...

  9. html钓鱼游戏源代码,钓鱼才是游戏本体,盘点五款优秀的内置钓鱼小游戏

    在挥舞着刀枪剑戟与怪物或者僵尸搏斗的间隙,或许你有时会想要换一下口味,享受一下别样的游戏挑战.而游戏内置的钓鱼游戏就恰好为我们带来了这种户外活动的轻度体验.虽然有的玩家不喜欢,但我认为钓鱼有着别样的乐 ...

最新文章

  1. while/do while /for 循环中continue
  2. css3宽度变大动画_学所 前端 | HTML5+CSS3
  3. MySQL 基础---数据库维护和性能提高
  4. mysql deadlock found when trying to get lock 问题排查
  5. covid 19如何重塑美国科技公司的工作文化
  6. 工作270:el-dialog的open回调
  7. xp系统服务器dns怎么设置在哪里设置,xp系统DNS怎么设置 DNS设置步骤
  8. linux 命令启动菜单栏,Linux守护进程的启动方法
  9. 计算机组成原理秦磊华 pdf,_计算机组成原理_设计性实践教学模式研究_秦磊华.pdf...
  10. 50: 加密与解密 、 AIDE入侵检测系统 、 扫描与抓包 、 总结和答疑
  11. 全国计算机一级word题库,2016全国计算机一级《MS Office》选择题题库
  12. TCP粘包/拆包--利用LineBasedFrameDecoder解决TCP粘包问题
  13. 如何处理条码打印机打出来是空白的故障
  14. Excel 自动计算房贷、月供 (附模板)
  15. Android课程表显示
  16. Arcgis 10.2坡度分析
  17. 酷酷资源社网站同款xiuno模板/知乎蓝魔改版源码/附多个插件
  18. 怎样记账才能清楚、简单
  19. gitlab配置126邮箱发送邮件
  20. Java子线程异常及异常处理

热门文章

  1. 解决navicat premium连接数据库自动断开问题
  2. 解决navicat 连接数据库隔段时间后自动断开连接问题
  3. 定义一个变量存储年份: int year = 2023;通过程序判断该年份是否为闰年,如果是闰年,则输出“闰年“否则输出“平年“
  4. NOIP2016 普及组第四题 魔法阵magic 题解
  5. 【每日早报】2020/02/15
  6. train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz 下载
  7. 《炬丰科技-半导体工艺》 硅蚀刻及其在太阳能电池制造过程中的应用
  8. 【大学物理实验】冷却法测金属比热容
  9. 数据结构 彩虹瓶
  10. Xbox 负责人对谈微软 CEO:为什么微软选择全力押注游戏业务