MMORPG大型遊戲設計與開發(服務器 AI 控制器)

上一篇咱們說了基礎接口的組成,想必你們對AI中的基礎方法有了必定的瞭解,而基礎接口只能一個通用的,要實現不一樣的類別還需子類中實現,這就造成了玩家、主動、被動、木樁這些類型。不一樣類型的AI須要有一個統一的接口來調用與控制,這就是咱們今天要進一步瞭解的AI控制器,試想一下一部機器若是沒有控制器會怎樣,一我的若是沒有大腦又該怎樣?這就能充分的體驗控制器的重要性了。算法

遊戲截圖

控制器

  一、初始化(init)

    初始化控制器數據,主要是設置AI對象的類型。數組

  二、釋放(release)

    卸載控制器,清理全部垃圾。函數

  三、循環邏輯處理(activate)

    一些須要循環處理的邏輯放到該方法內處理。spa

  四、中止(stop)

    中止控制器,即將控制器運行標識設置爲false。3d

  五、從新開始(restart)

    從新開始控制器,會將一切動做重設。指針

  六、控制器是否在運行(is running)

    獲取控制器是否在運行的標記。rest

  七、設置AI類型(set ai type)

    方法並無名字上看的那麼簡單,不只設置內部AI對象的類型,並且根據制定的AI類型來初始化AI對象指針。code

  八、得到AI類型(get ai type)

    得到當前控制器的AI類型。對象

  九、設置AI主狀態(set main state)

    根據狀態類型來設置AI的主狀態,而且作一些邏輯操做。blog

  十、得到AI主狀態(get main state)

    得到當前AI的主狀態。

  十一、設置原點(set origin point)

    設置AI的原點,做爲返回用。

  十二、得到原點(get origin point)

    得到AI觸發的原點。

  1三、設置AI參數(set ai param)

    不一樣的AI配置基本上已經放在了模板列表中,只要傳入須要設置的模板ID便可設置AI的參數。

  1四、得到AI事件下一幀(get ai event next frame)

    得到AI事件下一幀,即下一個定時器。

  1五、得到AI對象指針(get ai)

    得到內部的AI對象指針。

  1六、得到AI的狀態(get ai state)

    得到AI的當前狀態。

  1七、得到AI參數指針(get ai template param)

    得到AI參數對象指針。

  1八、其餘(other)

    狀態切換、事件、屬性、命令等與基礎接口一致,其餘須要的函數能夠看狀況增長。

算法(遞歸)

  遞歸是一種分而治之、將複雜問題轉換爲簡單問題的求解方法。

  遞歸算法有如下優缺點:

    優勢:使用遞歸編寫的程序簡潔、結構清晰,程序的正確性很容易證實,不須要了解其具體的細節。

    缺點:遞歸函數在調用過程當中,每一層調用都須要保存臨時變量和返回地址、傳遞參數,所以遞歸數的執行效率低。

  一、求階乘

    code.

#include <stdio.h>
#include <inttypes.h>


/**
 * 遞歸是一種分而治之、將複雜問題轉換爲簡單問題的求解方法。遞歸算法有如下優缺點:
 * 優勢:使用遞歸編寫的程序簡潔、結構清晰,程序的正確性很容易證實,不須要了解其具體的細節。
 * 缺點:遞歸函數在調用過程當中,每一層調用都須要保存臨時變量和返回地址、傳遞參數,所以遞歸
 *       函數的執行效率低。
 */ 

/**
 * 求階乘
 */ 

int64_t fact(int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input a int number: ");
  scanf("%d", &n);
  printf("%d!=%d\n", n ,fact(n));
}

int64_t fact(int32_t n) {
  int32_t x;
  int64_t y;
  if (n < 0) { //小於0階乘無心義
    printf("param error!\n");
    return -1;
  }
  if (0 == n) { //最後一次返回1
    return 1;
  } else {
    return n * fact(n - 1); //遞歸求n的階乘
  }
}

    result.

  二、斐波那契數列的第N項

    code.

#include <stdio.h>
#include <inttypes.h>


/**
 * 遞歸求斐波那契數列的n項
 */ 

int32_t fib(int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input the number: ");
  scanf("%d", &n);
  printf("the %d option value is: %d\n", n, fib(n));
  return 0;
}

int32_t fib(int32_t n) {
  if (0 == n) return 0;
  if (1 == n) return 1;
  if (n > 1) return fib(n - 1) + fib(n - 2);
}

    result.

  三、十進制轉二進制

    code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 十進制轉二進制
 */ 

void dect_tobin(int32_t number);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input a int number: ");
  scanf("%d", &n);
  printf("the binary is: ");
  dect_tobin(n);
  printf("\n");
  return 0;
}

void dect_tobin(int32_t number) {
  if (0 == number) return;
  dect_tobin(number / 2);
  printf("%d", number % 2);
}

    result.

  四、最數組中的最大值

    code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 遞歸求數組中的最大值
 */ 

int32_t findmax(int32_t array[], int32_t n);
void displayarray(int32_t array[], int32_t length);

int32_t main(int32_t argc, char *argv[]) {
  int32_t array[] = {23, 56, 35, 67, 86, 28, 1, 27, 11};
  int32_t length, i;
  length = sizeof(array) / sizeof(array[0]);
  displayarray(array, length);
  printf("the max value in array is: %d\n", findmax(array, length));
  return 0;
}

int32_t findmax(int32_t array[], int32_t n) {
  int32_t m;
  if (n <= 1) return array[0];
  m = findmax(array, n - 1);
  return array[n - 1] >= m ? array[n - 1] : m;
}

void displayarray(int32_t array[], int32_t length) {
  int32_t i;
  for (i = 0; i < length; ++i)
    printf("%3d", array[i]);
  printf("\n");
}

    result.

  五、求兩個數的最大公約數

    code.

#include <stdio.h>
#include <inttypes.h>


/**
 * 求最大公約數
 */ 

int32_t gcd(int32_t m, int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t m, n;
  printf("please input two int number: ");
  scanf("%d,%d", &m, &n);
  printf("the max common divisor is: %d\n", gcd(m, n));
  return 0;
}

int32_t gcd(int32_t m, int32_t n) {
  if (m > n) {
    return gcd(m - n, n);
  } else if (m < n) {
    return gcd(m, n - m);
  } else {
    return m;
  }
}

    result.

相關文章
相關標籤/搜索