package FiveChessFrame;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class ChessFrame extends JFrame implements MouseListener, Runnable {
int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 获取屏幕宽度和宽度
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
BufferedImage bgimage = null;
// 保存棋子的坐标
int x = 0;
int y = 0;
float nx = 0;
float ny = 0;
// 保存之前所有下过棋子的坐标,0表示这个点没有棋子,1这个点有黑棋子,2这个点有白棋子
int[][] allChess = new int[16][16];
// 表识当前是黑棋还是白棋
boolean isBlack = true;
// 标识当前游戏是否可以继续
boolean canPlay = true;
String message = "黑方先行";
// 保存最多拥有多少时间(秒)线程操作
int maxTime = 0;
// 做倒计时线程类
Thread t = new Thread(this);
// 保存黑方与白方的剩余时间
int blackTime = 0;
int whiteTime = 0;
// 保存双方剩余时间的信息
String blackMessage = "无限制";
String whiteMessage = "无限制";
public ChessFrame() {
// 设置标题
this.setTitle("五子棋");
// 设置窗口大小
this.setSize(1080, 850);
// 设置窗口位置
this.setLocation((width - 1000) / 2, (height - 1000) / 2);// 设置窗口位置
// 将窗口设置为大小不改变
this.setResizable(false);
// 将窗体的关闭方式设置为默认关闭程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 为窗体加入监听
this.addMouseListener(this);
// 导入图片
try {
bgimage = ImageIO.read(getClass().getResource("Hz.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.setVisible(true);
t.start();
t.suspend();
// 刷新屏幕防止开始游戏时无法显示
this.repaint();
}
public void paint(Graphics g) {
// 双缓冲技术防止屏幕闪烁
BufferedImage bi = new BufferedImage(1080, 850, BufferedImage.TYPE_INT_ARGB);
Graphics g2 = bi.createGraphics();
// 绘制背景
g2.drawImage(bgimage, 0, 0, this);
// 输出标题信息
g2.setColor(Color.BLACK);
g2.setFont(new Font("黑体", Font.BOLD, 50));
g2.drawString("游戏信息:" + message, 70, 90);
g2.setFont(new Font("宋体", 30, 30));
g2.drawString("黑方时间:" + blackMessage, 75, 813);
g2.drawString("白方时间:" + whiteMessage, 440, 813);
g2.setColor(Color.WHITE);
g2.setFont(new Font("黑体", Font.BOLD, 30));
g2.drawString("开始游戏", 910, 130);
g2.drawString("游戏说明", 910, 240);
g2.drawString("退出游戏", 910, 590);
g2.drawString("认输", 940, 470);
g2.drawString("关于", 940, 360);
g2.setColor(Color.ORANGE);
g2.fillOval(900, 650, 150, 100);
g2.fillOval(880, 640, 50, 50);
g2.fillOval(1020, 640, 50, 50);
g2.setColor(Color.WHITE);
g2.drawString("游戏设置", 910, 710);
g2.setColor(Color.BLACK);
g2.setFont(new Font("黑体", Font.BOLD, 20));
g2.drawString("作者:信科2001蜜小桃", 850, 770);
g2.drawString("指导教师:王老师", 850, 800);
// 绘制棋盘
for (int i = 0; i <= 13; i++) {
g2.drawLine(150 + i * 50, 125, 150 + i * 50, 775);
g2.drawLine(150, 125 + i * 50, 800, 125 + i * 50);
}
// 绘制所有棋子
for (int i = 1; i <= 14; i++) {
for (int j = 1; j <= 14; j++) {
if (allChess[i][j] == 1) {
// 黑棋子
int tempx = (i - 1) * 50 + 150;
int tempy = (j - 1) * 50 + 125;
g2.fillOval(tempx - 20, tempy - 20, 40, 40);
}
if (allChess[i][j] == 2) {
// 白棋子
int tempx = (i - 1) * 50 + 150;
int tempy = (j - 1) * 50 + 125;
g2.setColor(Color.WHITE);
g2.fillOval(tempx - 20, tempy - 20, 40, 40);
g2.setColor(Color.BLACK);
g2.drawOval(tempx - 20, tempy - 20, 40, 40);
}
}
}
g.drawImage(bi, 0, 0, this);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
if (canPlay == true) {
nx = e.getX();
ny = e.getY();
if (nx >= 150 && nx <= 800 && ny >= 125 && ny <= 775) {
x = Math.round((nx - 150) / 50) + 1;
y = Math.round((ny - 125) / 50) + 1;
// 判断当前位置是否有棋子
if (allChess[x][y] == 0) {
// 判断当前下的是什么颜色的棋子
if (isBlack == true) {
allChess[x][y] = 1;
isBlack = false;
message = "轮到白方";
} else {
allChess[x][y] = 2;
isBlack = true;
message = "轮到黑方";
}
// 判断这个棋子是否与其他的棋子连成5个
boolean flagwin = this.CheckWin();
if (flagwin == true) {
JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜! ");
canPlay = false;
message = "游戏结束!";
}
} else {
JOptionPane.showMessageDialog(this, "当前位置已经有棋子了你不能在下了!");
}
this.repaint();
}
}
// 判断鼠标所点击的位置在哪个按钮的区域
boolean in = this.InRange(900, 85, 1050, 150, e.getX(), e.getY());
if (in == true) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏!");
// 现在重新开始游戏
if (result == 0) {
JOptionPane.showMessageDialog(this, "开始游戏!");
// 重新开始所要做的操作
// 1.棋盘清空,把allChess[][]归零;
for (int i = 1; i <= 14; i++) {
for (int j = 1; j <= 14; j++) {
allChess[i][j] = 0;
}
}
// 这里也可以用allChess=new int[16][16];但是会浪费空间
// 2.将游戏信息的显示改为初始;
message = "黑方先行";
// 3.将下一步下棋的人改为黑方isBlack=true;
isBlack = true;
blackTime = maxTime;
whiteTime = maxTime;
if (maxTime > 0) {
blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
} else {
blackMessage = "无限制";
whiteMessage = "无限制";
}
this.repaint();
}
} else {
in = this.InRange(900, 200, 1050, 260, e.getX(), e.getY());
if (in == true) {
JOptionPane.showMessageDialog(this, "这是一个五子棋小游戏,黑白双方轮流下棋,当某一方连到五子时游戏结束!");
} else {
in = this.InRange(900, 315, 1050, 380, e.getX(), e.getY());
if (in == true) {
JOptionPane.showMessageDialog(this,
"本游戏由信科2001蜜小桃,制作指导教师为我最敬爱的王老师,感谢老师!,如有问题可以加QQ:2632814845询问问题,我也不一定会,试试吧!");
} else {
in = this.InRange(900, 423, 1050, 485, e.getX(), e.getY());
if (in == true) {
int result = JOptionPane.showConfirmDialog(this, "是否确认认输!");
if (result == 0) {
JOptionPane.showMessageDialog(this,
(isBlack == true ? "黑方认输," : "白方认输,") + (isBlack == true ? "白方获胜!" : "黑方获胜!"));
canPlay = false;
}
} else {
in = this.InRange(900, 540, 1050, 605, e.getX(), e.getY());
if (in == true) {
JOptionPane.showMessageDialog(this, "退出游戏");
System.exit(0);
} else {
in = this.InRange(900, 670, 1050, 725, e.getX(), e.getY());
if (in == true) {
String input = JOptionPane.showInputDialog("请输入游戏的最大时间!(单位:分钟),输入0表示没有时间限制.");
try {
maxTime = Integer.parseInt(input) * 60;
if (maxTime < 0) {
JOptionPane.showMessageDialog(this, "请正确输入信息!不允许输入负数.");
}
if (maxTime == 0) {
int result = JOptionPane.showConfirmDialog(this, "设置完成!是否重新开始游戏!");
if (result == 0) {
for (int i = 1; i <= 14; i++) {
for (int j = 1; j <= 14; j++) {
allChess[i][j] = 0;
}
}
Java五子棋源码,包含背景图片
需积分: 0 59 浏览量
更新于2023-05-30
收藏 532KB ZIP 举报
【Java五子棋源码详解】
Java五子棋是一款经典的基于Java编程语言开发的桌面游戏,它允许两位玩家通过网络或本地对战,先连成五子直线者获胜。源码通常包括游戏逻辑、用户界面、网络通信等部分,下面我们将深入探讨其中的关键知识点。
1. **Java基础**
- **类与对象**:五子棋游戏中的每个棋子、棋盘、玩家等都可以抽象为Java类,每个类有自己的属性和方法。
- **继承与多态**:可能有基类如`Player`,其子类`HumanPlayer`和`AIPlayer`分别代表人类玩家和AI玩家,展示多态性。
- **异常处理**:在处理用户输入或网络通信时,异常处理机制确保程序的稳定运行。
2. **图形用户界面(GUI)**
- **Swing或JavaFX**:Java提供了Swing库用于构建GUI,或者使用更现代的JavaFX。这些库包含各种组件,如按钮、面板,可以用来构建棋盘和控制界面。
- **事件监听**:棋盘上的每个格子可能都有一个点击事件监听器,当用户点击时触发相应的棋子放置逻辑。
3. **游戏逻辑**
- **棋盘状态**:用二维数组表示棋盘,每个元素代表一个格子,存储当前格子的状态(空、黑棋、白棋)。
- **五子连珠判断**:编写算法检查是否有五个相同颜色的棋子在行、列、对角线上,决定游戏胜负。
- **回合制**:游戏逻辑需管理玩家的轮流下棋,可能通过计数器或交换玩家对象来实现。
4. **网络通信**
- **Socket编程**:如果支持网络对战,需要使用Java的Socket类进行客户端-服务器通信,传输棋盘状态和玩家动作。
- **数据序列化**:为了在网络间传输棋盘状态,可能需要用到对象的序列化和反序列化技术。
5. **资源管理**
- **背景图片**:`.project`、`.classpath`和`.settings`通常是Eclipse项目配置文件,而`bin`目录存放编译后的字节码文件。源码中可能包含加载并显示背景图片的方法,这涉及到Java的图像处理,如`ImageIcon`和` JLabel`。
6. **软件工程实践**
- **MVC模式**:可能采用了模型-视图-控制器架构,将游戏逻辑、用户界面和控制逻辑分离,便于维护和扩展。
- **版本控制**:项目可能使用了Git等版本控制系统,用于代码管理和协作。
7. **项目构建**
- **IDE配置**:`.project`是Eclipse项目的配置文件,`.classpath`定义了项目的类路径,`.settings`包含了项目的特定设置,这些都是在IDE中管理和构建项目所必需的。
以上就是Java五子棋源码涉及的主要技术点,学习和理解这些内容对于提升Java编程和游戏开发能力非常有帮助。如果你想要深入研究,可以尝试阅读源码,理解每个类和方法的功能,甚至可以尝试改进或添加新功能,如AI的难度等级或网络对战的优化。
笔写落去
- 粉丝: 419
- 资源: 2
最新资源
- 12-【培训PPT】-03-新员工入职培训.pptx
- 11-【其他】03-新进员工入职培训计划策划(通用版).pptx
- 12-【培训PPT】-02-新员工入职培训.pptx
- 12-【培训PPT】-05-员工入职培训PPT.pptx
- 12-【培训PPT】-04-新员工培训体系.pptx
- 12-【培训PPT】-06-新员工入职培训PPT.pptx
- 12-【培训PPT】-08-社交礼仪入职培训PPT.pptx
- 12-【培训PPT】-10-新员工入职培训(企业宣传介绍).pptx
- 12-【培训PPT】-09-新员工入职培训(公司介绍).pptx
- 基于Java的共享笔记系统的设计与实现
- 12-【培训PPT】-12-企业招聘公司介绍新员工入职培训.pptx
- 12-【培训PPT】-11-互联网公司介绍新员工入职培训.pptx
- 12-【培训PPT】-13-品牌宣讲企业介绍新员工入职培训PPT.pptx
- 基于javaweb的奖学金管理系统论文.doc
- 基于javaweb的网上订餐管理系统的设计与实现论文.doc
- 00-【管理制度】07-新员工入职培训管理制度.doc