- UID
- 72773
- 閱讀權限
- 20
- 主題
- 13
- 帖子
- 69
- 精華
- 5
- A幣
- 216
- 在線時間
- 163 小時
- 最後登錄
- 2024-11-22
初窺門道
- 主題
- 13
- 帖子
- 69
- 精華
- 5
- 綜合社群主題發文量
- 0
- 電玩社群主題發文量
- 0
- 娛樂社群主題發文量
- 0
- 技術社群主題發文量
- 13
- 閱讀權限
- 20
- 註冊時間
- 2019-8-9
TA的每日心情 | 衰 2021-6-8 20:12 |
---|
簽到天數: 14 天 連續簽到: 0 天 [LV.3]偶爾看看II
|
本帖最後由 a894985459 於 2023-8-2 03:53 編輯
久久沒發文 發個簡單的教學文
不清楚各版本商城優惠券功能是否可用
就先當不可用來處理好了
另外寫一個簡易的小功能出來解決
先在資料庫建立資料表
就叫他CDK吧,主要結構如下圖
接著來編譯主要的語法
找到
AbstractPlayerInteraction.java
在喜歡的地方建立以下幾段語法
1.取得CDK狀態
- public int getcdk(String cdk) {//取得CDK使用狀況 0 = 不存在 1 = 已建立(資料表) 2 = 已使用
- Connection con = DatabaseConnection.getConnection();
- try {
- int use = 0;
- PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
- ps.setString(1, cdk);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- use = rs.getInt("use");
- }
- rs.close();
- ps.close();
- return use;
- } catch (Exception Ex) {
- Ex.printStackTrace();
- return -1;
- }
- }
複製代碼 2.取得CDK給的道具(基本上跟上面長一樣)
- public int getcdkitem(String cdk) {//取得CDK要給的道具
- Connection con = DatabaseConnection.getConnection();
- try {
- int item = 0;
- PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
- ps.setString(1, cdk);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- item = rs.getInt("itemid");
- }
- rs.close();
- ps.close();
- return item;
- } catch (Exception Ex) {
- Ex.printStackTrace();
- return -1;
- }
- }
複製代碼 3.取得CDK給道具的數量(沒錯 還是跟上面幾乎長一樣)
- public int getcdkitemcount(String cdk) {
- Connection con = DatabaseConnection.getConnection();
- try {
- int count = 0;
- PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
- ps.setString(1, cdk);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- count = rs.getInt("count");
- }
- rs.close();
- ps.close();
- return count;
- } catch (Exception Ex) {
- Ex.printStackTrace();
- return -1;
- }
- }
複製代碼
當然這是最陽春的寫法撈三次資料對伺服器很不友善
可以自己想辦法改進,其實也很簡單
撈一次資料 丟去陣列儲存
在利用腳本去對陣列資料就行,不過是教學性質我就不多做改良了
留給各位思考
4.修改CDK使用狀態
- public void setcdk(String cdk, int use) {//改變CDK狀態
- PreparedStatement ps = null;
- Connection con = DatabaseConnection.getConnection();
- try {
- ps = con.prepareStatement("UPDATE cdk SET `use` = ? WHERE cdk = ?");
- ps.setInt(1, use);
- ps.setString(2, cdk);
- ps.executeUpdate();
- ps.close();
- } catch (Exception Ex) {
- Ex.printStackTrace();
- }
- }
複製代碼 語法使用方式:- cm.getcdk("你的CDK");
- cm.getcdkitem("你的CDK");
- cm.getcdkitemcount("你的CDK");
- cm.setcdk("你的CDK",2);
複製代碼
到此 主系統算完成了
再來我們轉向NPC腳本來處理吧
我就大概 隨便寫一下 我跟碼之間有一個能跑就行.jpg
- var cdk = "";
- function start() {
- status = -1;
- action(1, 0, 0);
- }
- function action(mode, type, selection) {
- if (mode == -1) {
- cm.dispose();
- } else {
- if (status >= 3 && mode == 0) {
- cm.sendOk("#e有任何需求歡迎再來。");
- cm.dispose();
- }
- if (mode == 1) {
- status++;
- } else if (mode != 1 && status >= 1){
- status--;
- } else {
- cm.sendOk("#e有任何需求歡迎再來。");
- cm.dispose();
- }
- if (status == 0) {
- cm.sendGetText("#e請輸入取得的CDK");
- } else if (status == 1) {
- cdk = cm.getText();//取得玩家輸入文字(CDK)
- if (cm.getcdk(cdk) == 0) {
- cm.sendOk("#e#r此CDK不存在,請檢查是否輸入錯誤。");
- cm.dispose();
- } else if (cm.getcdk(cdk) == 2) {
- cm.sendOk("#e#r此CDK已被使用過。");
- cm.dispose();
- } else {
- cm.sendYesNo("#e你確定要領取此CDK的獎勵嗎?\r\n此CDK的獎勵為#i" + cm.getcdkitem(cdk) + "##t" + cm.getcdkitem(cdk) + "#" + cm.getcdkitemcount(cdk) + "個");
- }
- } else if (status == 2) {
- cm.sendOk("#e#r你已領取CDK獎勵");
- cm.gainItem(cm.getcdkitem(cdk),cm.getcdkitemcount(cdk));
- cm.setcdk(cdk,2);
- cm.dispose();
- }
- }
- }
複製代碼
實際測試圖
1.輸入CDK
2.CDK存在,且沒被使用過
3.成功使用
4.輸入不存在的CDK
5.因有先比對,所以回傳不存在 結束對話
6.輸入已使用過CDK,結束對話
就這樣 一個簡單的系統就完成了
題外話
可以不光只要領取物品嗎?
可以方法也很簡單
} else if (status == 2) {
之下增加判斷就好
cm.getcdkitem(cdk) == 0 的話 要給什麼
cm.getcdkitem(cdk) == 1 的話 要給什麼
你可以給錢 給經驗 給等級 你想的到的都能給
題外話2
那CDK怎樣生產最快?難道還要我一個一個用手打嗎?
An,你要那樣做我也是不反對啦
我有幾個小方案可以選
1.寫個ˊ小語法去產生CDK直接丟進資料庫
2.一樣是寫語法,不過是寫在Js
可以利用https://jsfiddle.net/這個網站來幫你
核心與法大概是這樣啦,可以自己更改 要多組就自己加個迴圈去讓他生產
下面這段語法我已經排除I跟O了,想要的可自己加回去
- var SendStr = Array("1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z");
- var pws = "";
- for (var r = 0; r < 31; r++) {//決定CDK要多長 尾數+1=總長碼數
- pws += SendStr[Math.floor(Math.random() * SendStr.length)];
- }
-
- console.log(pws);
複製代碼 最後怎麼丟資料表比較快?
開個EXCEL把複製的資料先貼上去
然後把物品ID、數量都設定好
EXCEL有資料的地方複製起來
回到SQL資料表新增一行空白資料後,直接貼上
就新增完畢了EZ
個位看官怎麼喜歡怎麼來
簡易的功能往往能造就不同的玩法
還有任何問題可以下方提出
或是+我DC聊聊
DC:緋夜冷冽#9071
|
|