Spring Boot——游戏成就系统设计DEMO
基本概念
成就:成就系統(tǒng)可以理解為對某個角色成長過程重大事件的記錄;玩家通過查看成就跟蹤角色涉及的重大事件。
問題分析
獲得成就需要一定的條件,也就是,玩家需要完成某種指定的動作后,才可以獲得需要的成就。下面我具體舉一個成就的例子,說明成就系統(tǒng)的實現(xiàn)方式。
??????成就名: ????勇者無畏
??????達(dá)成條件:戰(zhàn)斗勝利次數(shù)到達(dá)10次
??????戰(zhàn)斗獎勵:增加玩家的聲望值。
????實現(xiàn)以上需求,需要注意的問題:
????A ??需要統(tǒng)計玩家戰(zhàn)斗的次數(shù)
????B ?當(dāng)成就達(dá)到的時候,不能重復(fù)達(dá)到
????C ?完成成就后,可以增加玩家的聲望值
????D 進(jìn)行某種動作的時候,可能同時開啟兩個成就
業(yè)務(wù)邏輯
數(shù)據(jù)庫設(shè)計
?需要統(tǒng)計完成戰(zhàn)斗次數(shù)的表:user_state
? ??
我的成就表: user_achievement
成就的配置表:
解決方案
JAVA?
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zstu.metrocity.entity.Achievememt; import org.apache.ibatis.annotations.*;import java.util.List;/*** <p>* Mapper 接口* </p>** @author ShenTuZhiGang* @since 2020-04-09*/ public interface AchievememtMapper extends BaseMapper<Achievememt> {@Select("SELECT * FROM user_achievememt JOIN achievememt ON aid=achievememt.id WHERE uid=#{userId}")@Results(value = {@Result(property = "id",column = "aid")})List<Achievememt> getByUserId(Integer userId); }?
PHP
我的統(tǒng)計模型類:?
記錄需要統(tǒng)計的字段,如果字段發(fā)生改變,調(diào)用成就類里面的方法。
<?php/*** 我的統(tǒng)計 模型** @author zhangkai* $Id: Stats.php 4374 2013-07-30 07:26:26Z sunli $*/class Model_User_Stats extends Model_User_Trait {/*** 子類構(gòu)函** @return void*/protected function _initTrait(){$this->_prop = $this->DaoDs('UserStats')->get($this->_uid);}/*** 指定字段自增** @return bool*/public function increment($field, $offset = 1){// 注意這里 需要給這個屬性加成,否則,就算數(shù)據(jù)庫里面的字段已經(jīng)更新,還是不能獲取到最新信息$this->_prop[$field] += $offset;return $this->DaoDs('UserStats')->where(array('uid' => $this->_uid))->increment($field, $offset);}// 增加主動勝利場數(shù)public function addTotalWinTimes($num = 1){$this->increment('total_win_times', $num);$this->_user->achievement->checkBattleWinAchieve();}}我的成就類:
職能:?
檢測成就是否達(dá)成
改變我的成就的進(jìn)度
成就達(dá)成后,給予相應(yīng)的獎勵
/*** 我的成就**/class Model_User_Achievement extends Model_User_Trait {// 內(nèi)部方法,用于判斷是否達(dá)成了某種類型的成就private function _checkAchieve($field, $attrs){$times = $this->_user['stats'][$field];$result = array();foreach ($attrs as $data) {if ($times >= $data['line']) {$result[$data['achieve_id']] = $this->achieve($data['achieve_id']);}}return $result;}// 檢測是否達(dá)成了戰(zhàn)斗勝利的相關(guān)成就public function checkBattleWinAchieve(){$data = array();// 同時開啟兩個成就 line:表示成就需要的總進(jìn)度$data[] = array('line' => 100, 'achieve_id' => 721003);$data[] = array('line' => 10, 'achieve_id' => 721001);return $this->_checkAchieve('total_win_times', $data);}// 達(dá)成成就(不可重復(fù)達(dá)成)public function achieve($achieveId){// 已達(dá)成過直接退出 如果是第一次開啟成就,則插入此成就if ($this->DaoDs('UserAchievement')->isCreated($this->_uid, $achieveId)) {return false;}// 成就詳細(xì)$achieveInfo = Dao('Static_Achievement')->get($achieveId);// 實時彈出框$this->_user->tips->setTips('showGainAchievementTip', $achieveInfo);// 達(dá)成成就后 獎勵聲望$this->_user->base->addReputation($achieveInfo['reputation_award']);// 設(shè)置成就已經(jīng)完成return $this->DaoDs('UserAchievement')->createAchieve($this->_uid, $achieveId);} }?
參考文章
https://blog.csdn.net/xnn2s/article/details/6193722
https://blog.csdn.net/looksunli/article/details/9672841
總結(jié)
以上是生活随笔為你收集整理的Spring Boot——游戏成就系统设计DEMO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ——安装
- 下一篇: Spring Boot——集成Swagg