本游戏是突发一个想法写出来的,只写了个大概,大概如下:
游戏介绍:
- 游戏目录为src存放代码,lib存放jar包(build path加入jar),res存放资源
- 类列表:
GameConfig 游戏配置接口
MenuGame 游戏菜单(含有main方法创建new menuGame)
Player 玩家类
StarGame 游戏主界面
GameUtil 游戏工具类
BackpackJFrame 背包界面
EquipDetailJFrame 背包物品详情界面
PlayerJFrame 角色详情界面
UnitXLS 操作XLS工具类
-
方法注释:太多了有时间再写吧,认真学习的,加我QQ问也行(大部分我在代码中都有注释)
-
本来为了放数据,代码执行会在D盘建一个文字游戏的文件夹,然而,我并没有发现有啥用
最最重要的代码下载地址↓↓↓↓:
链接:https://pan.baidu.com/s/13f3wNIFudG8GwGdX6q34AA
提取码:0emf
注:开发不易,有票子的老铁可以在这下载→:
游戏接口:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 游戏接口
*
* @author 莫言情难忘 1179307527
*
*/
public interface GameConfig {
String[][] MAP = new String[10][10];// 新手村地图
String[][] MAPabout = new String[10][10];// 新手村地图注释
int[][][] coordinate = new int[10][10][10];// 10个新手村这么大的地图
Player player = new Player();
List<Map<String, String>> zhuangbeilist = new ArrayList<Map<String, String>>();// 所有装备
}
MenuGame.java
游戏菜单,main方法在里面,还有初始化装备列表
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
*
* @author 莫言情难忘
* QQ 1179307527
* 游戏菜单
*/
public class MenuGame implements GameConfig{
public static JFrame loginFrame;// 启动界面
public MenuGame() {
Initialization1();
loginFrame = new JFrame("文字游戏");
// 设置大小
loginFrame.setSize(200, 235);
// 设置窗体居中
loginFrame.setLocationRelativeTo(null);
// 设置不可最大化
loginFrame.setResizable(false);
// 设置没有标题栏
// loginFrame.setUndecorated(true);
// 设置图标
Image icon = Toolkit.getDefaultToolkit().getImage("images/icon.png");
loginFrame.setIconImage(icon);
// 设置关闭
loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置字体
Font font = new Font("楷体", 0, 16);
// 设置文本字体
UIManager.put("Label.font", font);
// 面板,用于添加按钮
JPanel jPanel = new JPanel();
Container container = loginFrame.getContentPane();
// 按钮实例化
JButton stargame = new JButton("开始游戏");
JButton duqugame = new JButton("读取游戏");
JButton guanyugame = new JButton("关于游戏");
JButton helpgame = new JButton("游戏帮助");
JButton tuichugame = new JButton("退出游戏");
// 面板添加5个菜单按钮
jPanel.add(stargame);
jPanel.add(duqugame);
jPanel.add(guanyugame);
jPanel.add(helpgame);
jPanel.add(tuichugame);
// 为按钮设置字体
stargame.setFont(font);
duqugame.setFont(font);
guanyugame.setFont(font);
tuichugame.setFont(font);
helpgame.setFont(font);
// 添加面板
container.add(jPanel);
// 开始游戏按钮监听
stargame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// 开始游戏
StartGame ks = new StartGame();
loginFrame.dispose();
}
});
// 读取游戏按钮监听
duqugame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// 警告信息框
JOptionPane.showMessageDialog(jPanel, "后续开发", "读取存档", JOptionPane.WARNING_MESSAGE);
}
});
// 关于按钮被单击
guanyugame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// 弹出文本内容
String guanyu = "本软件为文字类游戏,ok";
// 信息框
JOptionPane.showMessageDialog(null, guanyu, "关于", JOptionPane.PLAIN_MESSAGE);
}
});
// 帮助按钮被单击
helpgame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// 弹出文本内容
String help = "这是帮助";
// 信息框
JOptionPane.showMessageDialog(null, help, "帮助", JOptionPane.PLAIN_MESSAGE);
}
});
// 退出游戏监听
tuichugame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
int res = JOptionPane.showConfirmDialog(null, "我们正在努力添加游戏各种功能\n" + "敬请期待", "退出?",
JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI("http://www.520mylove.com"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);// 退出
}
}
});
// 显示窗口
loginFrame.setVisible(true);
}
/**
* 初始化1,判断是否存在游戏文档文件夹(游戏文档包括游戏存档等)
*/
void Initialization1() {
File file = new File("D:\\文字游戏");//游戏目录
File file1 = new File("D:\\文字游戏\\map");//游戏地图
File file2 = new File("D:\\文字游戏\\cundang");//游戏存档
if (!file.exists() && !file.isDirectory()) {
// 不存在此文件夹,建立此文件夹
file.mkdir();
}
if (!file1.exists() && !file1.isDirectory()) {
// 不存在此文件夹,建立此文件夹
file1.mkdir();
}
if (!file2.exists() && !file2.isDirectory()) {
// 不存在此文件夹,建立此文件夹
file2.mkdir();
}
}
public static void main(String[] args) {
//加载游戏装备列表
String 所有装备 = "res/装备匹配表.xls";
String 队列1[] = {"ID", "品质", "位置", "名称", "说明", "等级", "善恶", "门派", "生命", "攻击", "防御", "速度", "暴击",
"命中", "闪避", "生命加成", "攻击加成", "防御加成", "速度加成", "吸血"};
UnitXLS.AddXls(zhuangbeilist,所有装备,队列1);
//加载当前装备列表
String 角色装备 = "res/角色装备.xls";
String 队列2[] = {"ID", "名称"};
UnitXLS.AddXls(player.juesezhuangbeilist,角色装备,队列2);
new MenuGame();
}
}
StartGame.java
游戏主界面(地图移动,打开人物界面等)
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* 游戏初始界面
*
* @author 莫言情难忘 1179307527
*
*/
public class StartGame extends JFrame implements GameConfig {
// 游戏面板
JPanel panel;
int PlayerX = 1;
int PlayerY = 1;
JButton shang, xia, zuo, you, zhong;
/**
* 设置窗体
*/
public StartGame() {
// 读取游戏map
ReadMap();
this.setTitle("文字类");
this.setSize(450, 485);// 450*450 标题栏占35
this.setLayout(null);
// 设置关闭方式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗体居中
this.setLocationRelativeTo(null);
// 设置字体
Font font = new Font("楷体", 0, 20);
// 设置文本字体
UIManager.put("Label.font", font);
// 上
shang = new JButton("上城");
shang.setBounds(150, 0, 150, 150);
shang.setFont(font);
this.add(shang);
shang.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReMap(0);
}
});
// 下
xia = new JButton("下城");
xia.setBounds(150, 300, 150, 150);
xia.setFont(font);
this.add(xia);
xia.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReMap(1);
}
});
// 左
zuo = new JButton("左城");
zuo.setBounds(0, 150, 150, 150);
zuo.setFont(font);
this.add(zuo);
zuo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReMap(2);
}
});
// 右
you = new JButton("右城");
you.setBounds(300, 150, 150, 150);
you.setFont(font);
this.add(you);
you.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReMap(3);
}
});
// 中
zhong = new JButton("该城");
zhong.setBounds(150, 150, 150, 150);
zhong.setFont(font);
this.add(zhong);
zhong.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReMap(4);
}
});
// 人物
JButton renwu = new JButton("人物");
renwu.setBounds(0, 0, 150, 150);
renwu.setFont(font);
this.add(renwu);
renwu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new PlayerJFrame();
// String[] a = {"da","da","da"};
// int va =JOptionPane.showOptionDialog(StartGame.this, "人物详情", "标题",
// JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, a, "da");
}
});
// 背包
JButton backpack = new JButton("背包");
backpack.setBounds(300, 0, 150, 150);
backpack.setFont(font);
this.add(backpack);
backpack.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new BackpackJFrame();
}
});
// 设置
JButton shezhi = new JButton("设置");
shezhi.setBounds(0, 300, 150, 150);
shezhi.setFont(font);
this.add(shezhi);
shezhi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
// 特殊
JButton teshu = new JButton("特殊");
teshu.setBounds(300, 300, 150, 150);
teshu.setFont(font);
this.add(teshu);
teshu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String pojie = JOptionPane.showInputDialog("请输入密码");
if (pojie != null && pojie.equals("我爱文字游戏1179307527")) {
player.PoJie1();
JOptionPane.showMessageDialog(null, "输入key成功,开启贵族的待遇", "**success", JOptionPane.PLAIN_MESSAGE);
} else if (pojie != null && pojie.equals("我有故事你有酒吗")) {
String aString = "输入KEY值成功,我有故事你有酒吗?\n" + "真的,谁没有藏在心底的故事呢?";
JOptionPane.showMessageDialog(null, aString, "来,干杯", JOptionPane.PLAIN_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "输入key失败", "**失败", JOptionPane.PLAIN_MESSAGE);
}
}
});
shang.setText(MAP[PlayerX - 1][PlayerY]);
xia.setText(MAP[PlayerX + 1][PlayerY]);
zuo.setText(MAP[PlayerX][PlayerY - 1]);
you.setText(MAP[PlayerX][PlayerY + 1]);
zhong.setText(MAP[PlayerX][PlayerY]);
this.setResizable(false);
this.setVisible(true);
}
/**
* 读取地图及地图介绍 地图为res文件夹的MAP.txt 地图介绍为res文件夹的MAPabout.txt
*/
void ReadMap() {
// 加载地图
try {
File file = new File("res\\MAP.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(reader);
// 读取地图的主要操作
for (int i = 0; i < 10; i++) {
String[] iString = br.readLine().split(";");
for (int j = 0; j < 10; j++) {
MAP[i][j] = iString[j];
}
}
// 关闭输出流
reader.close();
} catch (Exception e) {
// 处理异常
}
// 加载地图介绍
try {
File file = new File("res\\MAPabout.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(reader);
// 读取地图的主要操作
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
String iString = br.readLine();
MAPabout[i][j] = iString;
}
}
// 关闭输出流
reader.close();
} catch (Exception e) {
// 处理异常
}
}
/**
* 刷新地图
*
* @param j
* 0=上 1=下 2=左 3=右 4=中 获取移动方向
*/
void ReMap(int key) {
switch (key) {
// 上
case 0:
if (MAP[PlayerX - 1][PlayerY] != null && !MAP[PlayerX - 1][PlayerY].equals("空")) {
PlayerX--;
shang.setText(MAP[PlayerX - 1][PlayerY]);
xia.setText(MAP[PlayerX + 1][PlayerY]);
zuo.setText(MAP[PlayerX][PlayerY - 1]);
you.setText(MAP[PlayerX][PlayerY + 1]);
zhong.setText(MAP[PlayerX][PlayerY]);
}
break;
// 下
case 1:
if (MAP[PlayerX + 1][PlayerY] != null && !MAP[PlayerX + 1][PlayerY].equals("空")) {
PlayerX++;
shang.setText(MAP[PlayerX - 1][PlayerY]);
xia.setText(MAP[PlayerX + 1][PlayerY]);
zuo.setText(MAP[PlayerX][PlayerY - 1]);
you.setText(MAP[PlayerX][PlayerY + 1]);
zhong.setText(MAP[PlayerX][PlayerY]);
}
break;
// 左
case 2:
if (MAP[PlayerX][PlayerY - 1] != null && !MAP[PlayerX][PlayerY - 1].equals("空")) {
PlayerY--;
shang.setText(MAP[PlayerX - 1][PlayerY]);
xia.setText(MAP[PlayerX + 1][PlayerY]);
zuo.setText(MAP[PlayerX][PlayerY - 1]);
you.setText(MAP[PlayerX][PlayerY + 1]);
zhong.setText(MAP[PlayerX][PlayerY]);
}
break;
// 右
case 3:
if (MAP[PlayerX][PlayerY + 1] != null && !MAP[PlayerX][PlayerY + 1].equals("空")) {
PlayerY++;
shang.setText(MAP[PlayerX - 1][PlayerY]);
xia.setText(MAP[PlayerX + 1][PlayerY]);
zuo.setText(MAP[PlayerX][PlayerY - 1]);
you.setText(MAP[PlayerX][PlayerY + 1]);
zhong.setText(MAP[PlayerX][PlayerY]);
}
break;
// 中
case 4:
int res = JOptionPane.showConfirmDialog(null, GameUtil.StringToHtml(MAPabout[PlayerX][PlayerY], 10),
"是否进入" + MAP[PlayerX][PlayerY] + "?", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {
// 此处处理进入方法
System.out.println("进入了" + MAP[PlayerX][PlayerY]);
} else {
// 此处可做不处理
System.out.println("没进入" + MAP[PlayerX][PlayerY]);
}
break;
default:
JOptionPane.showMessageDialog(this, "219", "default错误", JOptionPane.WARNING_MESSAGE);
break;
}
}
}
Player.java
玩家类,里面大多是变量,例如攻击防御等信息
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
*
* @author 莫言情难忘 1179307527
*
*/
public class Player {
String name = "情难忘";// 姓名
int age = 15;// 年龄(默认年龄在70岁死亡,冒险在15岁)
String sex = "男";// 性别(加入帮派限制)(转职?)
String designation = "无";// 称号
int leave = 0;// 等级,每级增加
int jingyan = 0;// 当前经验
int[] shengjijingyan = { 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600,
999999 };// 升级所需的经验
int life = 100;// 生命值
int attack = 20;// 攻击(攻击算法)
int defend = 10;// 防御(防御算法)
int speed = 5;// 速度(速度大的先手)
int violent = 2; // 暴击率(2倍)(百分比,最大100,最小0)
int goodevil = 0;// 善恶值 可触发一些事件任务
int prestige = 0;// 声望值 到达某些指定声望值时,购买东西可打折
int faction = 0;// 门派 在门派可以学习很多东西,当然要用门派的积分来换,有些门派任务是有时限的
int lucky = 5;// 幸运值,掉宝几率大,暴击加成(掉宝加成具体宝贝具体算法,暴击=原有暴击+幸运值*0.5)
boolean burns1;// 1级烧伤,每回合2%
boolean burns2;// 2级烧伤,每回合5%
boolean burns3;// 3级烧伤,每回合10%
boolean frostbite1;// 1级冻伤,每回合2%
boolean frostbite2;// 2级冻伤,每回合5%
boolean frostbite3;// 3级冻伤,每回合10%
boolean poisoning1;// 1级中毒,每回合2%
boolean poisoning2;// 2级中毒,每回合5%
boolean poisoning3;// 3级中毒,每回合10%
boolean deceleration;// 减速
List<Map<String, String>> juesezhuangbeilist = new ArrayList<Map<String, String>>();// 角色装备列表
String[] backpackcontent = new String[99];// 背包内容
String equipment1;// 装备1,武器
String equipment2;// 装备2,头盔
String equipment3;// 装备3,上衣甲
String equipment4;// 装备4,下裤甲
String equipment5;// 装备5,鞋子
String equipment6;// 装备6,首饰
boolean pojie1 = true;
/**
* **方法 增加10倍于0级的生命值 攻击 防御 速度 增加 幸运点数20
*/
public void PoJie1() {
if (pojie1) {
life = life + 1000;
attack = attack + 200;
defend = defend + 100;
speed = speed + 50;
lucky = lucky + 20;
pojie1 = false;
}
}
boolean pojie2 = true;
/**
* **方法 增加20倍于0级的生命值 攻击 防御 速度 增加 幸运点数50
*/
public void PoJie2() {
if (pojie2) {
life = life + 2000;
attack = attack + 400;
defend = defend + 200;
speed = speed + 100;
lucky = lucky + 50;
pojie2 = false;
}
}
}
PlayerJFrame.java
玩家界面,里面是玩家的各种信息
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* 人物界面
*
* @author 莫言情难忘
*
*/
public class PlayerJFrame extends JFrame implements GameConfig {
public PlayerJFrame() {
JFrame playerjframe = new JFrame("人物详情");
JPanel playerJPanel = new JPanel();
// 设置字体
Font font = new Font("楷体", 0, 20);
// 设置文本字体
UIManager.put("Label.font", font);
// 称号
JLabel jLabel_designation = new JLabel("称号:" + player.designation, JLabel.CENTER);
jLabel_designation.setFont(font);
jLabel_designation.setBounds(0, 0, 200, 20);
// 名字
JLabel jLabel_name = new JLabel(player.name, JLabel.CENTER);
jLabel_name.setFont(font);
jLabel_name.setBounds(0, 20, 200, 20);
// 年龄
JLabel jLabel_age = new JLabel(String.valueOf(player.age) + "岁", JLabel.CENTER);
jLabel_age.setFont(font);
jLabel_age.setBounds(0, 40, 100, 20);
// 性别
JLabel jLabel_sex = new JLabel(player.sex, JLabel.CENTER);
jLabel_sex.setFont(font);
jLabel_sex.setBounds(100, 40, 100, 20);
// 等级
JLabel jLabel_leave = new JLabel("等级:" + String.valueOf(player.leave), JLabel.CENTER);
jLabel_leave.setFont(font);
jLabel_leave.setBounds(0, 60, 200, 20);
// 经验
JLabel jLabel_jingyan = new JLabel("经验:" + String.valueOf(player.jingyan), JLabel.CENTER);
jLabel_jingyan.setFont(font);
jLabel_jingyan.setBounds(0, 80, 200, 20);
// 生命值
JLabel jLabel_life = new JLabel("生命" + String.valueOf(player.life), JLabel.CENTER);
jLabel_life.setFont(font);
jLabel_life.setBounds(0, 100, 200, 20);
// 攻击
JLabel jLabel_attack = new JLabel("攻击" + String.valueOf(player.attack), JLabel.CENTER);
jLabel_attack.setFont(font);
jLabel_attack.setBounds(0, 120, 100, 20);
// 防御
JLabel jLabel_defend = new JLabel("防御" + String.valueOf(player.defend), JLabel.CENTER);
jLabel_defend.setFont(font);
jLabel_defend.setBounds(100, 120, 100, 20);
// 速度
JLabel jLabel_speed = new JLabel("速度" + String.valueOf(player.speed), JLabel.CENTER);
jLabel_speed.setFont(font);
jLabel_speed.setBounds(0, 140, 100, 20);
// 暴击
JLabel jLabel_violent = new JLabel("暴击" + String.valueOf(player.violent), JLabel.CENTER);
jLabel_violent.setFont(font);
jLabel_violent.setBounds(100, 140, 100, 20);
// 善恶
JLabel jLabel_goodevil = new JLabel("善恶" + String.valueOf(player.goodevil), JLabel.CENTER);
jLabel_goodevil.setFont(font);
jLabel_goodevil.setBounds(0, 180, 200, 20);
// 声望
JLabel jLabel_prestige = new JLabel("声望" + String.valueOf(player.prestige), JLabel.CENTER);
jLabel_prestige.setFont(font);
jLabel_prestige.setBounds(0, 200, 200, 20);
// 门派
JLabel jLabel_faction = new JLabel("门派" + String.valueOf(player.faction), JLabel.CENTER);// 门派
jLabel_faction.setFont(font);
jLabel_faction.setBounds(0, 220, 200, 20);
// 幸运
JLabel jLabel_lucky = new JLabel("幸运" + String.valueOf(player.lucky), JLabel.CENTER);
jLabel_lucky.setFont(font);
jLabel_lucky.setBounds(0, 240, 200, 20);
// 装备列表
JLabel[] jLable_zhuangbei = new JLabel[6];
for (int i = 0; i < 6; i++) {
jLable_zhuangbei[i] = new JLabel();
}
jLable_zhuangbei[0].setText("装备1:" + "空");
jLable_zhuangbei[0].setFont(font);
jLable_zhuangbei[0].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[1].setText("装备2:" + "空");
jLable_zhuangbei[1].setFont(font);
jLable_zhuangbei[1].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[2].setText("装备3:" + "空");
jLable_zhuangbei[2].setFont(font);
jLable_zhuangbei[2].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[3].setText("装备4:" + "空");
jLable_zhuangbei[3].setFont(font);
jLable_zhuangbei[3].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[4].setText("装备5:" + "空");
jLable_zhuangbei[4].setFont(font);
jLable_zhuangbei[4].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[5].setText("装备6:" + "空");
jLable_zhuangbei[5].setFont(font);
jLable_zhuangbei[5].setHorizontalAlignment(JLabel.CENTER);
jLable_zhuangbei[0].setBounds(0, 260, 200, 20);
jLable_zhuangbei[1].setBounds(0, 280, 200, 20);
jLable_zhuangbei[2].setBounds(0, 300, 200, 20);
jLable_zhuangbei[3].setBounds(0, 320, 200, 20);
jLable_zhuangbei[4].setBounds(0, 340, 200, 20);
jLable_zhuangbei[5].setBounds(0, 360, 200, 20);
// 关闭人物详情界面
JButton close = new JButton("关闭界面");
close.setFont(font);
close.setBounds(20, 380, 160, 35);
// 关闭人物详情界面的按钮触发
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
playerjframe.dispose();
}
});
// 面板添加组件
playerJPanel.add(jLabel_designation);
playerJPanel.add(jLabel_name);
playerJPanel.add(jLabel_age);
playerJPanel.add(jLabel_sex);
playerJPanel.add(jLabel_leave);
playerJPanel.add(jLabel_jingyan);
playerJPanel.add(jLabel_life);
playerJPanel.add(jLabel_attack);
playerJPanel.add(jLabel_defend);
playerJPanel.add(jLabel_speed);
playerJPanel.add(jLabel_violent);
playerJPanel.add(jLabel_goodevil);
playerJPanel.add(jLabel_prestige);
playerJPanel.add(jLabel_faction);
playerJPanel.add(jLabel_lucky);
playerJPanel.add(jLable_zhuangbei[0]);
playerJPanel.add(jLable_zhuangbei[1]);
playerJPanel.add(jLable_zhuangbei[2]);
playerJPanel.add(jLable_zhuangbei[3]);
playerJPanel.add(jLable_zhuangbei[4]);
playerJPanel.add(jLable_zhuangbei[5]);
playerJPanel.add(close);
// 设置布局格式
playerJPanel.setLayout(null);
// JFame添加面板
playerjframe.add(playerJPanel);
playerjframe.setSize(200, 450);
// 设置在最前显示
playerjframe.setAlwaysOnTop(true);
// 关闭方式,DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
playerjframe.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// 设置窗体居中
playerjframe.setLocationRelativeTo(null);
// 大小不可变
playerjframe.setResizable(false);
// 显示界面
playerjframe.setVisible(true);
}
}
BackpackJFrame.java
背包界面,内容为你的背包的东西
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
/**
* 背包界面
*
* @author 莫言情难忘 1179307527
*
*/
public class BackpackJFrame extends JFrame implements GameConfig {
public BackpackJFrame() {
JFrame backpackjframe = new JFrame("背包详情");
JPanel backpackJPanel = new JPanel();
// 设置字体
Font font = new Font("楷体", 0, 20);
// 设置文本字体
UIManager.put("Label.font", font);
// 设置布局格式
backpackJPanel.setLayout(null);
// 面板添加组件
JButton[] JButton_zhuangbei = new JButton[99];
for (int i = 0; i < 33; i++) {
for (int j = 0; j < 3; j++) {
JButton_zhuangbei[i * 3 + j] = new JButton();
JButton_zhuangbei[i * 3 + j].setText(GameUtil.StringToHtml(
GameUtil.取指定文本(UnitXLS.取内容(player.juesezhuangbeilist, i * 3 + j), "名称=", "}"), 3));
JButton_zhuangbei[i * 3 + j].setFont(font);
backpackJPanel.add(JButton_zhuangbei[i * 3 + j]);
// 设置位置
JButton_zhuangbei[i * 3 + j].setBounds(j * 100, i * 100, 100, 100);// i=纵 j=横
}
}
ActionListener jbutton = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int k = -1;
// html标准格式头
String strhtmltou = "<html>";
// html标准格式尾
String strhtmlwei = "</html>";
// 循环判断点击的按钮的
for (int i = 0; i < 99; i++) {
if (!GameUtil.取指定文本(e.getSource().toString(), "text=", ",").equals("空")) {
if (GameUtil.HtmlToString(GameUtil.取指定文本(e.getSource().toString(), strhtmltou, strhtmlwei))
.equals(GameUtil.取指定文本(UnitXLS.取内容(zhuangbeilist, i), "名称=", ","))) {
k = i;
}
}
}
// 打开该ID的装备信息
if (k != -1) {
new EquipDetailJFrame(k);
}
}
};
for (int i = 0; i < JButton_zhuangbei.length; i++) {
JButton_zhuangbei[i].addActionListener(jbutton);
}
// JFame添加面板
// backpackJPanel.setSize(300, 3300);采用下面的方法设置大小
backpackJPanel.setPreferredSize(new Dimension(300, 3300));
// 向jscrollpane中添加背包面板
JScrollPane jsp = new JScrollPane(backpackJPanel);
// Jfame添加JScerollPane
backpackjframe.add(jsp);
// 设置大小
backpackjframe.setSize(324, 335);
// 关闭方式,DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
backpackjframe.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// 设置在最前显示
backpackjframe.setAlwaysOnTop(true);
// 设置窗体居中
backpackjframe.setLocationRelativeTo(null);
// 大小不可变
backpackjframe.setResizable(false);
// 显示界面
backpackjframe.setVisible(true);
}
}
EquipDetailJFrame.java
物品详情界面
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* 物品详情界面
*
* @author 莫言情难忘 1179307527
*/
public class EquipDetailJFrame implements GameConfig {
/**
* 物品详情界面,ID为物品ID
*
* @param ID
*/
public EquipDetailJFrame(int ID) {
JFrame equipdetailjframe = new JFrame("详情");
JPanel equipdetailJPanel = new JPanel();
equipdetailJPanel.setLayout(null);
// 设置字体
Font font = new Font("楷体", 0, 20);
// 设置文本字体
UIManager.put("Label.font", font);
// attribute属性
String[] attribute = { "ID", "品质", "位置", "名称", "说明", "等级", "善恶", "门派", "生命", "攻击", "防御", "速度", "暴击", "命中", "闪避",
"生命加成", "攻击加成", "防御加成", "速度加成", "吸血" };
// JLabel 品质,位置,名称,说明,等级,善恶,帮派,幸运,生命,攻击,防御,速度,暴击,命中,闪避,生命加成,攻击加成,防御加成,速度加成,吸血;
// 品质=new JLabel(GameUtil.取指定文本(UnitXLS.取内容(ID),"品质",","));
// 武器=new JLabel(GameUtil.取指定文本(UnitXLS.取内容(ID),"武器",","));
// 上面那种太麻烦,改为下面的
JLabel[] JLabel_attribute = new JLabel[20];
for (int i = 0, k = JLabel_attribute.length; i < k; i++) {
// for循环直接初始化
if (i == k - 1) {
JLabel_attribute[i] = new JLabel(
GameUtil.取指定文本(UnitXLS.取内容(zhuangbeilist, ID), attribute[i] + "=", "}"), JLabel.CENTER);
} else {
JLabel_attribute[i] = new JLabel(
GameUtil.取指定文本(UnitXLS.取内容(zhuangbeilist, ID), attribute[i] + "=", ","), JLabel.CENTER);
}
// 添加字体
JLabel_attribute[i].setFont(font);
}
// 设置位置,ID
JLabel_attribute[0].setText(attribute[0] + ":" + GameUtil.取点前(JLabel_attribute[0].getText()));
JLabel_attribute[0].setBounds(0, 0, 250, 20);
// 名称
JLabel_attribute[3].setText(JLabel_attribute[3].getText());
JLabel_attribute[3].setBounds(0, 20, 250, 20);
// 品质
JLabel_attribute[1].setText(attribute[1] + ":" + JLabel_attribute[1].getText());
JLabel_attribute[1].setBounds(0, 40, 130, 20);
// 位置
JLabel_attribute[2].setText(attribute[2] + ":" + JLabel_attribute[2].getText());
JLabel_attribute[2].setBounds(130, 40, 130, 20);
// 攻击
JLabel_attribute[9].setText(attribute[9] + ":" + GameUtil.取点前(JLabel_attribute[9].getText()));
JLabel_attribute[9].setBounds(0, 60, 130, 20);
// 防御
JLabel_attribute[10].setText(attribute[10] + ":" + GameUtil.取点前(JLabel_attribute[10].getText()));
JLabel_attribute[10].setBounds(130, 60, 130, 20);
// 速度
JLabel_attribute[11].setText(attribute[11] + ":" + GameUtil.取点前(JLabel_attribute[11].getText()));
JLabel_attribute[11].setBounds(0, 80, 130, 20);
// 暴击
JLabel_attribute[12].setText(attribute[12] + ":" + GameUtil.取点前(JLabel_attribute[12].getText()));
JLabel_attribute[12].setBounds(130, 80, 130, 20);
// 命中
JLabel_attribute[13].setText(attribute[13] + ":" + GameUtil.取点前(JLabel_attribute[13].getText()));
JLabel_attribute[13].setBounds(0, 100, 130, 20);
// 闪避
JLabel_attribute[14].setText(attribute[14] + ":" + GameUtil.取点前(JLabel_attribute[14].getText()));
JLabel_attribute[14].setBounds(130, 100, 130, 20);
// 吸血
JLabel_attribute[19].setText(attribute[19] + ":" + GameUtil.取点前(JLabel_attribute[19].getText()));
JLabel_attribute[19].setBounds(0, 120, 130, 20);
// 生命加成
JLabel_attribute[15].setText(attribute[15] + ":" + GameUtil.取点前(JLabel_attribute[15].getText()));
JLabel_attribute[15].setBounds(0, 140, 130, 20);
// 攻击加成
JLabel_attribute[16].setText(attribute[16] + ":" + GameUtil.取点前(JLabel_attribute[16].getText()));
JLabel_attribute[16].setBounds(130, 140, 130, 20);
// 防御加成
JLabel_attribute[17].setText(attribute[17] + ":" + GameUtil.取点前(JLabel_attribute[17].getText()));
JLabel_attribute[17].setBounds(0, 160, 130, 20);
// 速度加成
JLabel_attribute[18].setText(attribute[18] + ":" + GameUtil.取点前(JLabel_attribute[18].getText()));
JLabel_attribute[18].setBounds(130, 160, 130, 20);
// 等级
JLabel_attribute[5]
.setText(attribute[5] + "需求:" + GameUtil.ZeroToWu(GameUtil.取点前(JLabel_attribute[5].getText())));
JLabel_attribute[5].setBounds(0, 180, 260, 20);
// 善恶
JLabel_attribute[6]
.setText(attribute[6] + "需求:" + GameUtil.ZeroToWu(GameUtil.取点前(JLabel_attribute[6].getText())));
JLabel_attribute[6].setBounds(0, 200, 260, 20);
// 帮派
JLabel_attribute[7]
.setText(attribute[7] + "需求:" + GameUtil.Faction(GameUtil.取点前(JLabel_attribute[7].getText())));
JLabel_attribute[7].setBounds(0, 220, 260, 20);
// 说明
JLabel_attribute[4].setText(
GameUtil.StringToHtml(attribute[4] + ":" + GameUtil.Faction(JLabel_attribute[4].getText()), 12));
JLabel_attribute[4].setBounds(0, 240, 260, 100);
/**
* { "ID", "品质", "位置", "名称", "说明", "等级", "善恶", "帮派", , "生命", "攻击", "防御", "速度",
* "暴击", "命中", "闪避", "生命加成", "攻击加成", "防御加成", "速度加成", "吸血" };
*/
// JLabel_attribute[14].setText(attribute[14] + ":"
// +GameUtil.取点前(JLabel_attribute[14].getText()));
// JLabel_attribute[14].setBounds(0, 120, 130, 20);
for (int i = 0, k = JLabel_attribute.length; i < k; i++) {
equipdetailJPanel.add(JLabel_attribute[i]);
}
JButton 装备 = new JButton("装备");
JButton 卸下 = new JButton("卸下");
装备.setFont(font);
卸下.setFont(font);
装备.setBounds(0, 350, 130, 40);
卸下.setBounds(130, 350, 130, 40);
equipdetailJPanel.add(装备);
equipdetailJPanel.add(卸下);
// JFame添加面板
equipdetailjframe.add(equipdetailJPanel);
// 设置大小
equipdetailjframe.setSize(260, 420);
// 关闭方式,DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
equipdetailjframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 设置在最前显示
equipdetailjframe.setAlwaysOnTop(true);
// 设置窗体居中
equipdetailjframe.setLocationRelativeTo(null);
// 大小不可变
equipdetailjframe.setResizable(false);
// 显示界面
equipdetailjframe.setVisible(true);
}
}
UnitXLS.java
读取XLS的工具类
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* XLS操作
*
* @author 莫言情难忘
*
*/
public class UnitXLS implements GameConfig {
public static void AddXls(List<Map<String, String>> list, String filePath, String[] queue) {
// Excel文档
Workbook wb = null;
// Excel文档中的一个sheet
Sheet sheet = null;
// 对应一个sheet中的一行
Row row = null;
String cellData = null;
// 将xls赋值到wb
wb = readExcel(filePath);
if (wb != null) {
// 用来存放表中数据
// list = new ArrayList<Map<String, String>>();
// 获取第一个sheet
sheet = wb.getSheetAt(0);
// 获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
// 获取第一行
row = sheet.getRow(0);
// 获取最大列数
int colnum = row.getPhysicalNumberOfCells();
for (int i = 1; i < rownum; i++) {
Map<String, String> map = new LinkedHashMap<String, String>();
row = sheet.getRow(i);
if (row != null) {
for (int j = 0; j < colnum; j++) {
cellData = (String) getCellFormatValue(row.getCell(j));
map.put(queue[j], cellData);
}
} else {
break;
}
list.add(map);
}
}
// 遍历解析出来的list
// for (Map<String,String> map : list) {
// for (Entry<String,String> entry : map.entrySet()) {
// System.out.print(entry.getKey()+":"+entry.getValue()+",");
// }
// System.out.println();
// }
}
/**
* @param ID
*
* @return string类型的全部信息
*/
// ID为第几行,仅仅使用这个方法,在使用这个方法前,要调用下AddXls初始化
public static String 取内容(List<Map<String, String>> list, int ID) {
return String.valueOf(list.get(ID));
}
// 读取excel
public static Workbook readExcel(String filePath) {
Workbook wb = null;
// 如果没有该文档
if (filePath == null) {
return null;
}
// 取文件后缀名
String extString = filePath.substring(filePath.lastIndexOf("."));
InputStream is = null;
try {
is = new FileInputStream(filePath);
if (".xls".equals(extString)) {
return wb = new HSSFWorkbook(is);
} else if (".xlsx".equals(extString)) {
return wb = new XSSFWorkbook(is);
} else {
return wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
/**
* 获取单元格中的值并转化成string
*
* @param cell
* 单元格
* @return
*/
public static Object getCellFormatValue(Cell cell) {
Object cellValue = null;
if (cell != null) {
// 判断cell类型
switch (cell.getCellType()) {
case NUMERIC: {
cellValue = String.valueOf(cell.getNumericCellValue());
break;
}
case STRING: {
cellValue = cell.getRichStringCellValue().getString();
break;
}
default:
cellValue = "";
}
} else {
cellValue = "";
}
return cellValue;
}
}
GameUtil.java
游戏工具类
/**
*
* @author 莫言情难忘 1179307527
*
*/
public class GameUtil {
// 求减少生命值的方法 方法用static 修饰 ,调用时 类名.方法名
public static int getLoseLife(int attack, int defend) {
return attack - defend;
}
// 求a-b之间随机数方法
public static int getNumber(int a, int b) {
// 求任意两个数之间的随机数(int)
return (int) (Math.random() * (b - a) + a);
}
/**
* 将文本中左边文本与右边文本中间的String取出来
*
* @param 文本
* @param 左边文本
* @param 右边文本
* @return String
*/
public static String 取指定文本(String 文本, String 左边文本, String 右边文本) {
// int indexOf(String str)
// 返回指定子字符串在此字符串中第一次出现处的索引。
// int indexOf(int ch, int fromIndex)
// 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
// String substring(int beginIndex, int endIndex)
// 返回一个新字符串,它是此字符串的一个子字符串
int 左边 = 文本.indexOf(左边文本);
int 右边 = 文本.indexOf(右边文本, 左边);
return 文本.substring(左边 + 左边文本.length(), 右边);
}
/**
* 因为JButton是不自动换行的,但是支持html中的换行,所以写这个为了方便换行
*
* @param str
* 文本
* @param length
* 每隔length长度换行
* @return
*/
public static String StringToHtml(String str, int length) {
// html换行符
String strhtmlbr = "<br>";
// html标准格式头
String strhtmltou = "<html>";
// html标准格式尾
String strhtmlwei = "</html>";
// 字符串总长度
int strlength = str.length();
// 循环次数
int k = strlength / length;
// 一开始的思路:
// 存放string每一小段
// String[] strings = new String[99];
// 初次循环取出str赋值到数组
// for (int i = 0; i < k; i++) {
// strings[i] = str.substring(i * length, i * length + length);
// }
// //连接头和第一个文本
// String strreturn = strhtmltou.concat(strings[0]);
// //for循环从1开始,依次连接
// for (int i = 1; i < k; i++) {
// strreturn = strreturn.concat(strhtmlbr + strings[i]);
// }
// //连接html尾
// strreturn = strreturn.concat(strhtmlwei);
// 此方法可以改进,改进方式如下:取消数组,两个for循环合并
// 如果小于则直接输出
if (strlength < length) {
return str;
}
String strreturn = strhtmltou.concat(str.substring(0 * length, 0 * length + length));
for (int i = 1; i < k; i++) {
strreturn = strreturn.concat(strhtmlbr + str.substring(i * length, i * length + length));
}
if (strlength - k * length != 0) {
strreturn = strreturn.concat(strhtmlbr + str.substring(k * length, strlength));
}
strreturn = strreturn.concat(strhtmlwei);
// 返回转化好的html
return strreturn;
}
/**
* 将html转化成string,<br>
* =null
*
* @param str
* html文本
* @return string
*/
public static String HtmlToString(String str) {
// html换行符
String strhtmlbr = "<br>";
// html标准格式头
String strhtmltou = "<html>";
// html标准格式尾
String strhtmlwei = "</html>";
String strreturn = str.replace(strhtmltou, "");
strreturn = strreturn.replace(strhtmlwei, "");
strreturn = strreturn.replaceAll(strhtmlbr, "");
// 返回转化好的html
return strreturn;
}
public static String 取点前(String str) {
String strreturn = str.substring(0, str.indexOf("."));
return strreturn;
}
/**
* 检测是否为文本型的0,如果是将文本转化成无
*
* @return "无"
*/
public static String ZeroToWu(String str) {
if (str.equals("0")) {
str = "无";
}
return str;
}
/**
*
* @param str
* 门派数字
* @return 门派名称
*/
public static String Faction(String str) {
switch (str) {
case "0":
str = "无";
break;
case "1":
str = "逆天者联盟";
break;
case "2":
str = "佣兵工会";
break;
case "3":
str = "刺客公会";
break;
case "4":
str = "战士公会";
break;
case "5":
str = "极寒宫";
break;
case "6":
str = "九霄宫";
break;
case "7":
str = "无极宫";
break;
case "8":
str = "火炎宫";
break;
case "9":
str = "金鼎宫";
break;
case "10":
str = "灵木宫";
break;
case "11":
str = "赤土宫";
break;
case "12":
str = "稳定宫";
break;
case "13":
str = "时空宫";
break;
default:
break;
}
return str;
}
}