1. 程式人生 > >用Unity實現AR類爐石傳說遊戲——開發框架(一)

用Unity實現AR類爐石傳說遊戲——開發框架(一)

遊戲流程圖

這裡寫圖片描述

玩家類

每場對戰中有兩個玩家例項

每個玩家擁有:

  1. 卡組
  2. 牌庫
  3. 手牌
  4. 場上的英雄
  5. 生命值,能量值等屬性

卡組

vector作為容器儲存

vector<Card> CardsCombination;

由玩家自行組合

牌庫

使用棧來作為容器,在對局開始時,用洗亂的玩家卡組作為玩家的牌庫

stack<Card> CardsStack;

玩家與牌庫的互動:

  1. 每個玩家回合開始時,取出牌庫頂端的若干張牌放入玩家的手牌中。
  2. 若玩家觸發丟棄/獲得手牌的效果,依據效果丟棄/獲得手牌

手牌

因為需要頻繁增刪,使用List作為容器儲存

List<Card> CardsInHand;

玩家與手牌互動:玩家使用卡牌,根據卡牌型別(效果牌、英雄牌)來決定使用方式

  1. 若是英雄牌:生成英雄例項,並push_back到玩家的Heroes容器中
  2. 若是效果牌:直接造成效果

場上的英雄:

同樣地,頻繁增刪,使用List容器來儲存玩家場上的英雄

List<Hero> Heroes(10);

這個容器應實現自動移位:如當前有5個英雄,分別儲存在Heroes[0……4]中,英雄Heroes[2]陣亡後,3,4應自動前移;
這裡寫圖片描述
場景中對應的變化是:
這裡寫圖片描述
ps:數字表示英雄存在於場上的槽位,英雄死亡後,在容器中的位置處於死亡英雄後的那些英雄都應向左移一個槽位。此例中,皇子和蓋倫都會向左走一個槽位(需要動畫)

生命值,能量值等屬性

int型別

注意對屬性值的修改操作要使用一個public的函式,而不應該直接用運算子更改,並做保證不超過上限/下限的處理

能量

  1. 初始值為1
  2. 使用卡牌時消耗
  3. 通過卡牌效果獲得能量

能量上限

  1. 初始值為1
  2. 每個回合增加一點上限
  3. 通過卡牌效果增加上限

生命值

  1. 初始值為30
  2. 受到敵方傷害時減少
  3. 通過卡牌效果增加或減少

玩家類總結

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》塔防RPG3D遊戲架構設計

目錄 《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說明。所以本文主要是我在使用過程中的解決