用Unity實現AR類爐石傳說遊戲——開發框架(一)
遊戲流程圖
玩家類
每場對戰中有兩個玩家例項
每個玩家擁有:
- 卡組
- 牌庫
- 手牌
- 場上的英雄
- 生命值,能量值等屬性
卡組
vector作為容器儲存
vector<Card> CardsCombination;
由玩家自行組合
牌庫
使用棧來作為容器,在對局開始時,用洗亂的玩家卡組作為玩家的牌庫
stack<Card> CardsStack;
玩家與牌庫的互動:
- 每個玩家回合開始時,取出牌庫頂端的若干張牌放入玩家的手牌中。
- 若玩家觸發丟棄/獲得手牌的效果,依據效果丟棄/獲得手牌
手牌
因為需要頻繁增刪,使用List作為容器儲存
List<Card> CardsInHand;
玩家與手牌互動:玩家使用卡牌,根據卡牌型別(效果牌、英雄牌)來決定使用方式
- 若是英雄牌:生成英雄例項,並push_back到玩家的Heroes容器中
- 若是效果牌:直接造成效果
場上的英雄:
同樣地,頻繁增刪,使用List容器來儲存玩家場上的英雄
List<Hero> Heroes(10);
這個容器應實現自動移位:如當前有5個英雄,分別儲存在Heroes[0……4]中,英雄Heroes[2]陣亡後,3,4應自動前移;
場景中對應的變化是:
ps:數字表示英雄存在於場上的槽位,英雄死亡後,在容器中的位置處於死亡英雄後的那些英雄都應向左移一個槽位。此例中,皇子和蓋倫都會向左走一個槽位(需要動畫)
生命值,能量值等屬性
int型別
注意對屬性值的修改操作要使用一個public的函式,而不應該直接用運算子更改,並做保證不超過上限/下限的處理
能量
- 初始值為1
- 使用卡牌時消耗
- 通過卡牌效果獲得能量
能量上限
- 初始值為1
- 每個回合增加一點上限
- 通過卡牌效果增加上限
生命值
- 初始值為30
- 受到敵方傷害時減少
- 通過卡牌效果增加或減少
玩家類總結
using System;
using System.Collections.Generic;
public class Player
{
/// <summary>
/// 當前生命值
/// </summary>
private int HP;
/// <summary>
/// 當前能量值
/// </summary>
private int MP;
/// <summary>
/// 最大生命值
/// </summary>
private int MaxHP;
/// <summary>
/// 最大能量值
/// </summary>
private int MaxMP;
/// <summary>
/// 卡組,由玩家在對局外自行組合
/// </summary>
private List<Card> CardsCombination;
/// <summary>
/// 牌庫,對局開始時打亂卡組獲得
/// </summary>
private Stack<Card> CardStack;
/// <summary>
/// 手牌,玩家從牌庫中獲得
/// </summary>
private LinkedList<Card> CardsInHand;
/// <summary>
/// 場上的英雄,玩家召喚而來
/// </summary>
private LinkedList<Hero> HeroesOnCourt;
Player();
/// <summary>
/// 使用卡牌,根據卡牌型別不同決定是召喚英雄還是施展卡牌效果,使用後卡牌從手牌中刪去
/// </summary>
/// <param name="card">使用的那一張卡牌</param>
public void UseCard(Card card);
/// <summary>
/// 玩家召喚英雄,召喚後英雄加入HeroesOnCourt中,並出現在場上
/// 英雄的獲取通過呼叫card.InitHero();
/// </summary>
/// <param name="hero">召喚的英雄</param>
public void SummonHero(Hero hero);
/// <summary>
/// 玩家結束回合,導演進行回合結算後,將出牌權轉移給另一玩家
/// </summary>
public void EndTurn();
/// <summary>
/// 修改玩家當前HP,注意不能溢位上下界,返回是否修改成功
/// </summary>
/// <param name="hp">正數則增,負數則減</param>
/// <returns></returns>
public bool AlterHP(int hp);
/// <summary>
/// 修改玩家當前MP,注意不能溢位上下界,返回是否修改成功
/// </summary>
/// <param name="mp">正數則增,負數則減</param>
/// <returns></returns>
public bool AlterMP(int mp);
/// <summary>
/// 判斷玩家當前MP是否大於mp
/// </summary>
/// <param name="mp"></param>
/// <returns></returns>
public bool EnoughMP(int mp);
/// <summary>
/// 玩家從牌庫棧頂獲得牌,加入手牌中
/// </summary>
public void DrawCard();
/// <summary>
/// 玩家認輸
/// </summary>
/// <returns>投降成功/失敗</returns>
public bool Yield();
/// <summary>
/// 將手牌棄至牌庫
/// </summary>
/// <param name="card">要丟棄的卡牌</param>
/// <returns>棄牌成功/失敗</returns>
public bool DropCard(Card card);
/// <summary>
/// 指揮英雄attacker攻擊英雄目標target
/// </summary>
/// <param name="Attacker">攻擊英雄</param>
/// <param name="target">受擊英雄</param>
/// <returns></returns>
public bool CommandHeroAttackHero(Hero Attacker, Hero target);
/// <summary>
/// 指揮英雄attacker攻擊玩家目標target
/// </summary>
/// <param name="Attacker">攻擊英雄</param>
/// <param name="target">受擊玩家</param>
/// <returns></returns>
public bool CommandHeroAttackPlayer(Hero Attacker, Player target);
/// <summary>
/// 將效果施用在英雄目標上
/// </summary>
/// <param name="target">英雄目標</param>
/// <returns></returns>
public bool CastEffectOnTarget(Hero target);
/// <summary>
/// 將效果施用在玩家目標上
/// </summary>
/// <param name="target">玩家目標</param>
/// <returns></returns>
public bool CastEffectOnTarget(Player target);
}
每個玩家開啟遊戲時便有一個一直存在的玩家例項,主要是為了儲存玩家的自定義卡組。
在“對局開始”事件觸發時,應對玩家屬性進行一定的設定,如補滿生命;初始化能量及上限;隨機生成牌庫;清空手牌,場上英雄等操作。
卡牌類
using System;
using System.Collections.Generic;
public class Card
{
/// <summary>
/// 卡牌名稱
/// </summary>
private string Name;
/// <summary>
/// 卡牌型別:英雄牌/效果牌
/// </summary>
private int CardType;
/// <summary>
/// 卡牌耗費
/// </summary>
private int Cost;
/// <summary>
/// 效果牌專有:卡牌效果
/// </summary>
private Effect effect;
/// <summary>
/// 英雄牌專有:英雄血量
/// </summary>
private int HeroHP;
/// <summary>
/// 英雄牌專有:英雄傷害
/// </summary>
private int HeroDamage;
/// <summary>
/// 英雄牌專有:英雄效果
/// </summary>
private Effect HeroEffect;
/// <summary>
/// 施展效果,通過effect.CastEffect()實現
/// </summary>
public void CastEffect();
/// <summary>
/// 根據卡牌屬性生成一個英雄例項並返回
/// </summary>
/// <returns>英雄例項,用於被玩家召喚</returns>
public Hero InitHero();
}
英雄類
using System;
using System.Numerics;
public class Hero
{
/// <summary>
/// 英雄的位置
/// </summary>
private Vector3 Pos;
/// <summary>
/// 當前生命值
/// </summary>
private int HP;
/// <summary>
/// 當前攻擊力
/// </summary>
private int Damage;
/// <summary>
/// 最大生命值
/// </summary>
private int MaxHP;
/// <summary>
/// 英雄名字
/// </summary>
private string Name;
/// <summary>
/// 英雄特效
/// </summary>
private Effect HeroEffect;
/// <summary>
/// 本回合可攻擊次數,每回合重置
/// </summary>
private int AttackCount;
/// <summary>
/// 每回合最大可攻擊次數,固有屬性/通過特效改變
/// </summary>
private int MaxAttackCount;
/// <summary>
/// 施展英雄特效,通過HeroEffect.CastEffect()實現
/// </summary>
public void CastEffect();
/// <summary>
/// 攻擊目標英雄
/// </summary>
/// <param name="target">攻擊目標</param>
public void Attack(Hero target);
/// <summary>
/// 攻擊目標玩家
/// </summary>
/// <param name="target">攻擊目標</param>
public void Attack(Player target);
}
效果類
using System;
public class Effect
{
private string Name;
public virtual void CastEffect();
public virtual void CastEffectOnHero(Hero target);
public virtual void CastEffectOnPlayer(Player
}
UML圖
相關推薦
用Unity實現AR類爐石傳說遊戲——開發框架(一)
遊戲流程圖 玩家類 每場對戰中有兩個玩家例項 每個玩家擁有: 卡組 牌庫 手牌 場上的英雄 生命值,能量值等屬性 卡組 vector作為容器儲存 vector<Card> CardsCombination; 由
用ajax實現檢測註冊使用者名稱是否重複的完整例子(一)
網上搜索了很多案例,但都和自己的需求不一樣。 最終實現了下面的例子實現了對註冊使用者名稱的校驗。採用的架構是servelet+jsp. ValidateName.java程式碼如下所示,並且採用userIsExist查詢資料庫看是否存在相同的使用者名稱。 Java程式碼
用Python實現一個簡易的“聽歌識曲”demo(一)
0. 背景 最近兩年,“聽歌識曲”這個應用在國內眾多的音樂類APP火熱上線,比如網易雲音樂,QQ音樂。使用者可以通過這個功能識別當前環境里正在播放的歌曲名字,聽起來很酷。其實“聽歌識曲”這個想法最早是由一家叫Shazam的國外公司提出的。 - 20
實現自己的大發888平臺開發框架(采用Java Socket)
exe provide lang 輸出流 reflect cati trace 客戶端 hand 大發888平臺開發實現原理圖: 1、Service API對應服務接口。 HelloService.java代碼如下: package com.shan.rpc.service
遊戲開發經驗談(二):對戰類全球服遊戲的設計與實現
bbr tro 機房 產品 sql 服務器 通過 簡單 自己實現 上篇文章《遊戲開發經驗談(一):遊戲架構裏隱藏的五個坑及其應對方案》,我們主要講解了遊戲架構設計當中隱藏的一些坑及其應對方案,錯過的小夥伴可以點擊鏈接回溯之前的內容。本期內容,將會重點介紹對戰類全球服遊戲的設
quartz任務排程框架實現任務定時執行,不傳參的配置(一)
quartz是一個任務排程框架,可以用它來實現一些需要定時執行的任務。 本次實現的是spring配置整合quartz 1.配置如下:目標bean和bean中的方法需要自己定義,這個方法就是要執行
爐石傳說 C# 開發筆記 (原始碼整理公開)
原始碼已經整理過了,去除了不需要的專案。注意:以前文章中出現過的Git已經變更過了,請以前關注過,Fork過的朋友,重新Fork一下。GitHub地址卡牌XML檔案的做成:(Git上面是沒有XML檔案的,原因是數量比較多,更新比較頻繁,所以,運行遊戲前,請自行生成)程式碼
Unity《ATD》塔防RPG類3D遊戲架構設計(一)
目錄 《ATD》 遊戲簡介 《ATD》 整體結構 《ATD》 遊戲機制 Buff機制 Skill機制 結語 《ATD》 遊戲簡
開發問題(一)在windows和linux端口占用問題
logs ets 情況 toc 端口占用 所有 註意 linu eclips 前言 今天在MyEclipse中使用tomcat發現tomcat端口8080竟然被占用了,所以就找了一下解決辦法共參考! 在網絡程序的調試過程中,經常發生一些出乎意料的事情,比如創建一
ARKit For Unity windows開發教程(一)
windows開發 安裝步驟 html vmware 黑蘋果 ios1 。。 土豪 war 現在常常看見網上有一些ARKit教程,本人也是新人小白一枚,如果寫錯了,請見諒指正。。。。QQ:362057738 閑話不多說,如果你想了解ARkit框架,自行度娘去就行,網
JVM類載入器與雙親委派模型(一)
(1)動態載入 類載入器是 Java 語言的一個創新,也是 Java 語言流行的重要原因之一。它使得 Java 類可以被動態載入到 Java 虛擬機器中並執行。類載入器從 JDK 1.0 就出現了,最初是為了滿足 Java Applet 的需要
Java類集框架(一):簡介及Collection介面
簡介 在實際專案中,涉及到儲存多個物件的操作往往會用到陣列。然而傳統的陣列存在一個問題:長度是固定的。Java 2提供了一個專門實現資料結構的開發框架——類集框架,框架的程式介面和類都儲存在java.util包中,其最為核心的用處就在於實現了動態物件陣列的操作,定義了大量的操作標準,核心
Android配置build.gradle實現Version Code編譯release包時自動增長(一)
Android配置build.gradle實現Version Code編譯release包時自動增長(一) 經常的,開發者在上線釋出之前要打出很多測試包給測試團隊測試,每次打出的release包為了區分不同的版本號,需要手動的修改Android裡面的配置檔案build.gradle的vers
使用akka實現一個簡單的RPC框架(一)
一、概述 目前大多數的分散式架構底層通訊都是通過RPC實現的,RPC框架非常多,比如前我們學過的Hadoop專案的RPC通訊框架,但是Hadoop在設計之初就是為了執行長達數小時的批量而設計的,在某些極端的情況下,任務提交的延遲很高,所有Hadoop的RPC顯得有些笨重。
類.class.classLoader.getResource(..)的基本認識(一)
URL resource = PermissonAnnoUtils.class.getClassLoader().getResource("com.qf.fayuan".replace(".", "/")); System.out.
技術筆記外傳——用whoosh搭建自己的搜尋框架(一)
在之前的博文中,我對haystack進行了諸多方面的吐槽,因此就產生了擺脫haystack的想法,而是利用whoosh搜尋庫自己實現搜尋功能。為了提升搜尋功能的通用性,我將其也設計成一個即插即用的app,算是自己實現了一個簡單的搜尋框架——blogsearchengine。
標準C++類string的Copy-On-Write技術(一)
寫時才拷貝(Copy-On-Write)技術,就是程式設計界“懶惰行為”——拖延戰術的產物。舉個例子,比如我們有個程式要寫檔案,不斷地根據網路傳來的資料寫,如果每一次fwrite或是fprintf都要進行一個磁碟的I/O操作的話,都簡直就是效能上巨大的損失,因此通常的做法是,每次寫檔案操作都寫在特定大小的一塊
IDEA 中 SVN 的上傳與檢出(一)
網上的文章中,都只有參考作用,實際操作過程中會遇到各種各樣的錯誤。 因為使用的 IDEA 和 SVN 的版本不同,網上文章中的介紹有很多不同的地方。 1.上傳 現在把SSH02 這個Module 上傳分享到SVN中,這是一個maven專案。 第一步;開啟 Settings ,選
go實現一個簡單的遊戲伺服器框架(lotou)基本設計
程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。 因為go語言原生支援高併發(goroutine)和通訊機制(channel),所以首先想到的就是使用這兩個東西來構建我的訊息分發機制。 核心思路: 有一個core模組維護了所有的服務 當有訊息傳送的時候
bootstrap File Input 多檔案上傳外掛使用記錄(一)配置及批量同步上傳
bootstrap file input 多檔案上傳工具,功能十分強大,也很完善,我也是在接觸了這個外掛後自己研究使用的,當然也踩了很多的坑,主要是官方API是英文的,可能沒興趣一行一行的讀,只能是用到了什麼需求然後再去看對應的API說明。所以本文主要是我在使用過程中的解決