上一篇咱們說了基礎接口的組成,想必你們對AI中的基礎方法有了必定的瞭解,而基礎接口只能一個通用的,要實現不一樣的類別還需子類中實現,這就造成了玩家、主動、被動、木樁這些類型。不一樣類型的AI須要有一個統一的接口來調用與控制,這就是咱們今天要進一步瞭解的AI控制器,試想一下一部機器若是沒有控制器會怎樣,一我的若是沒有大腦又該怎樣?這就能充分的體驗控制器的重要性了。算法
初始化控制器數據,主要是設置AI對象的類型。數組
卸載控制器,清理全部垃圾。函數
一些須要循環處理的邏輯放到該方法內處理。spa
中止控制器,即將控制器運行標識設置爲false。3d
從新開始控制器,會將一切動做重設。指針
獲取控制器是否在運行的標記。rest
方法並無名字上看的那麼簡單,不只設置內部AI對象的類型,並且根據制定的AI類型來初始化AI對象指針。code
得到當前控制器的AI類型。對象
根據狀態類型來設置AI的主狀態,而且作一些邏輯操做。blog
得到當前AI的主狀態。
設置AI的原點,做爲返回用。
得到AI觸發的原點。
不一樣的AI配置基本上已經放在了模板列表中,只要傳入須要設置的模板ID便可設置AI的參數。
得到AI事件下一幀,即下一個定時器。
得到內部的AI對象指針。
得到AI的當前狀態。
得到AI參數對象指針。
狀態切換、事件、屬性、命令等與基礎接口一致,其餘須要的函數能夠看狀況增長。
遞歸是一種分而治之、將複雜問題轉換爲簡單問題的求解方法。
遞歸算法有如下優缺點:
優勢:使用遞歸編寫的程序簡潔、結構清晰,程序的正確性很容易證實,不須要了解其具體的細節。
缺點:遞歸函數在調用過程當中,每一層調用都須要保存臨時變量和返回地址、傳遞參數,所以遞歸數的執行效率低。
#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的階乘 } }
#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); }
#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); }
#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"); }
#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; } }