java单机版软件源码_Java五子棋单机版源码分享
初学JavaGUI编程,就写了一个小游戏–五子棋。
目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。
此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的。
源码已提交至GitHub,点击此处GitHub源码
以下列出其中的五子棋类:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FiveInARow extends JFrame implements MouseListener {
Vector v = new Vector(); //所有的每步走棋信息
Vector white = new Vector(); //白方走棋信息
Vector black = new Vector(); //黑方走棋信息
boolean b; //用来判断白旗还是黑棋
int whiteCount, blackCount; //计算悔棋步数
int w = 25; //间距大小
int px = 100, py = 100; //棋盘的大小
int pxw = px + w, pyw = py + w;
int width = w * 16, height = w * 16;
int vline = width + px; //垂直线的长度
int hline = height + py; //水平线的长度
/**
* 构造方法
*/
public FiveInARow() {
super("单机版五子棋");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
Container con = this.getContentPane();
con.setLayout(new BorderLayout());
this.addMouseListener(this);//添加监听
this.setSize(600, 600);//设置窗体大小
this.setBackground(Color.orange);
this.setVisible(true);
}
/**
* 画棋盘和棋子
* @param e
*/
public void paint(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());//清除画板
g.setColor(Color.BLACK);//绘制网格颜色
g.drawRect(px, py, width, height);//网格大小
g.drawString("单机版五子棋小游戏,右击可以悔棋,欢迎使用", 180, 70);
for (int i=0; i<15; i++) {
g.drawLine(pxw+i*w, py, pxw+i*w, hline);//每条横线和竖线
g.drawLine(px, pyw+i*w, vline, pyw+i*w);
}
for (int x=0; x
String str = (String)v.get(x);
String tmp[] = str.split("-");
int a = Integer.parseInt(tmp[0]);
int b = Integer.parseInt(tmp[1]);
a = a * w + px;
b = b * w + py;
if (x%2 == 0) {
g.setColor(Color.WHITE);
} else {
g.setColor(Color.BLACK);
}
g.fillArc(a-w/2, b-w/2, w, w, 0, 360);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == e.BUTTON1) {
int x = e.getX();
int y = e.getY();
x = (x - x % w) + (x % w > w / 2 ? w : 0);
y = (y - y % w) + (y % w > w / 2 ? w : 0);
x = (x - px) / w;
y = (y - py) / w;
if (x >= 0 && y >= 0 && x <= 16 && y <= 16) {
if (v.contains(x+"-"+y)) {
System.out.println("已经有棋了!");
} else {
v.add(x+"-"+y);
this.repaint();
if (v.size() % 2 == 0) {
black.add(x+"-"+y);
this.victory(x, y, black);
// System.out.println("黑棋");
} else {
white.add(x+"-"+y);
this.victory(x, y, white);
// System.out.println("白棋");
}
// System.out.println(e.getX()+"-"+e.getY());
}
} else {
// System.out.println(e.getX()+"-"+e.getY()+"|"+x+"-"+y+"\t超出边界了");
}
}
if (e.getButton() == e.BUTTON3) { //右击悔棋的方法
// System.out.println("鼠标右击--悔棋");
if (v.isEmpty()) {
JOptionPane.showMessageDialog(this, "没有棋可悔");
} else {
if (v.size() % 2 == 0) { //判断是白棋悔棋,还是黑棋悔棋
blackCount++;
if (blackCount > 3) {
JOptionPane.showMessageDialog(this, "黑棋已经悔了3步");
} else {
v.remove(v.lastElement());
this.repaint();
}
} else {
whiteCount++;
if (whiteCount > 3) {
JOptionPane.showMessageDialog(this, "白棋已经悔了3步");
} else {
v.remove(v.lastElement());
this.repaint();
}
}
}
}
}
/**
* 判断胜利的方法
* @param x
* @param y
* @param contain
*/
private void victory(int x, int y, Vector contain) {
int cv = 0; //垂直方向棋子数量
int ch = 0; //水平方向棋子数量
int ci1 = 0; //斜面方向棋子数量1
int ci2 = 0; //斜面方向棋子数量2
//计算水平方向棋子数量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+y)) {
ch++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+y)) {
ch++;
} else {
break;
}
}
//计算垂直方向棋子数量
for (int i=1; i<5; i++) {
if (contain.contains(x+"-"+(y+i))) {
cv++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains(x+"-"+(y-i))) {
cv++;
} else {
break;
}
}
//计算45°斜面方向棋子数量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+(y+i))) {
ci1++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+(y-i))) {
ci1++;
} else {
break;
}
}
//计算135°斜面方向棋子数量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+(y-i))) {
ci2++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+(y+i))) {
ci2++;
} else {
break;
}
}
if (ch>=4 || cv>=4 ||ci1>=4 ||ci2>=4) {
System.out.println(v.size()+"步棋");
if (v.size() % 2 == 0) {
//判断是黑棋赢,还是白棋赢
JOptionPane.showMessageDialog(null, "黑棋赢了");
} else {
JOptionPane.showMessageDialog(null, "白棋赢了");
}
this.v.clear();
this.black.clear();
this.white.clear();
this.repaint();
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
PS:打算再写个网络版的五子棋,可惜对Java中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java单机版软件源码_Java五子棋单机版源码分享相关推荐
- java开发软件难吗_JAVA开发太难了呀!30K程序员到底要会哪些技术?
现在很多开发的人员只关注他们短期的工作前景,做的越久,发现自己越来越跟不上技术,所以,把时间和精力花在学习最能带来回报的新技术上是件非常重要的事情.这里是我们列举一些你需要马上开始学习的技术,让你不会 ...
- java编程软件手机版_Java编程软件(Alice 3)
Alice 3是一款优质的Java开发软件,也是一种创新的基于块的编程环境.可轻松创建动画,构建交互式叙述或以3D编程简单的游戏.与许多基于拼图的编码应用程序不同,爱丽丝通过创造力探索来激励学习.Al ...
- java 转码_JAVA自带转码方式的学习
最近工作中遇到一个问题,由于海外系统环境默认采用UTF-8格式编码,以支持多语言环境.而国内系统由于只需要支持中英文,故默认采用GBK编码格式.因此当把海外环境生成的交易报告单发送给国内的报表系统时, ...
- java五子棋源代码_java 五子棋游戏源码
[实例简介] [实例截图] [核心代码] package game; import java.applet.Applet; import java.applet.AudioClip; import j ...
- java 线程池 源码_java线程池源码分析
我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...
- java join 源码_java并发:join源码分析
join join join是Thread方法,它的作用是A线程中子线程B在运行之后调用了B.join(),A线程会阻塞直至B线程执行结束 join源码(只有继承Thread类才能使用) 基于open ...
- Java绘画板源码_Java 绘图板 示例源码下载(画板)
Java 绘图板 示例源码下载(画板) java 2020-8-21 下载地址 https://www.codedown123.com/36795.html package minidrawpad; ...
- java接口源码_java collection接口源码
package java.util; /* * 1.Collection接口是集合继承关系中的根接口(root interface),有些集合允许重复元素, * 有些集合有序,JDK不提供本接口的实现 ...
- java微信支付接口源码_java微信支付源码(WxPayAPI_JAVA_v3)
[实例简介] [实例截图] [核心代码] package com.github.wxpay.sdk; import java.util.HashMap; import java.util.Map; i ...
最新文章
- 微软发布新的Azure Pipelines功能和集成
- antd 动态添加表单_react Ant Design 动态生成表单,并带验证
- java面试题-精心准备
- java workerdone_【架构】Java并发编程——线程池的使用
- 为什么可以通过类名调用静态方法?
- bash: jps: command not found
- EMC VMAX的磁盘构成,fast policy(重要)
- 简洁的网页跑丢了动态动画404页面源码
- [日志]开车要掌握的十六大绝技
- SQL SERCER 控制 SERVERICE BROKER 服务
- 第三章·MySQL版本区别及管理
- 独家 | 全球 AI 量化金融机构全景图(附完整分析)
- cmd换行 windows_键盘键位修改及管理(Windows篇)
- 【数学建模】7 线性规划及例题详解
- 手撸CAPL(二)——OSEK网络管理N个节点建环机制(包含节点建环/丢失/跳过等)代码自取
- 他说,我可能以后不干安全了
- 反弹球消砖块C语言重构函数封装
- [附源码]JAVA+ssm计算机毕业设计城市公交系统(程序+Lw)
- 2019:自我觉醒的一年
- Ubuntu20.04LTS 安装配置
热门文章
- 贴片红外LED灯珠封装失效怎么应对
- 前端干货知识点!带你重温细致入微的前端内容!【长文·建议收藏】
- html识别文字转语音,Speech Synthesis API入门 - web前端识别文字转语音
- 如何用手机浏览电脑上的本地网站(PHP+Mysql+Apache环境)
- 浙江新2014挂历制作,供应温州挂历印刷公司
- 菜鸟说有线网络连接故障
- 春招进行时,当代大学生求职行为大赏
- 阿里90后程序员入选全球顶级开源社区技术委员会,网友:真大佬
- Google公共电话号码解析库: libphonenumber
- FlickR的雅虎通插件FlickengR:好友图片连环播