JAVA GUI文字遊戲
阿新 • • 發佈:2018-11-28
本遊戲是突發一個想法寫出來的,只寫了個大概,大概如下:
遊戲介紹:
- 遊戲目錄為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/1-PViDjNVfdh58vagk63czw
提取碼: 6666
注:開發不易,有票子的老鐵可以在這下載→: https://download.csdn.net/download/qq_40176716/10727643
遊戲介面:
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;
}
}