MMORPG大型遊戲設計與開發(服務器 AI 邏輯設定和狀態結點)

人工智能(AI)中每每都會有這麼一個問題,那就是我要作什麼?我該怎麼作?我須要什麼?因此這裏所謂的智能就是賦予AI對象的判斷力,以及它根據判斷獲得的相應反應。就比如,你去商店買東西,錢夠別人才賣給你,不夠不可能賣你,這裏就會觸發了兩種結果,若是你要強買的話,那麼店員就可能產生相應的措施了。其實這裏的店員,就至關於咱們所謂的人工智能,不過店員的反應和動做是根據他自身思考產生的,人工智能也有這個思考的過程,只不過比店員想的少不少。這個思考的過程,也就是邏輯設定與處理的過程,那麼什麼又是狀態結點呢?算法

遊戲截圖

邏輯設定(logic)

  一、內部接口

    建立(setup)

      邏輯設定初始化,初始化對應的類型,根據傳入的腳本ID中的建立方法。數組

    得到動做(get action)

      根據動做的ID查找對應的動做指針,注意這裏的動做列表是邏輯設定對象中的數據。網絡

    得到狀態(get state)

      根據狀態查找對象狀態表中對應的狀態數據指針。框架

    得到初始化狀態(get init state)

      得到初始化設置的狀態。less

    得到腳本ID(get script id)

      得到當前的腳本ID。學習

    調用動做(call action)

      根據角色的對象指針,以及動做處理,調用腳本相應的方法,並返回下一個動做。人工智能

  二、lua接口

    建立動做(new action)

      在lua中傳入兩個參數:動做ID和動做的鍵(回調),根據這兩個參數將動做加入到管理器中。lua

    增長狀態(new state)

      從lua中傳入一個狀態,並加入到狀態表中。spa

    設置初始化狀態(set init state)

      腳本中傳入一個狀態,並將該狀態設置爲初始狀態。指針

    註冊用戶動做(register user action)

      兩個參數:動做回調的key,動做回調的方法字符串,並將這兩個數據加入到用戶動做表中。

狀態結點(state)

  一、內部接口

    得到事件回調(get event handler)

    輸出狀態信息(print state info)

  二、lua接口

    處理事件(handle event)

算法(矩陣算法)

  反螺旋矩陣

    code.

#include <stdio.h>
#include <stdint.h>


/**
 * 反螺旋矩陣
 * 例如:5x5的反螺旋矩陣
 *
 * -   0   1   2   3   4  ---- 做爲列序號
 *   ————————————————————
 * 0 | 1   16  15  14  13
 * 1 | 2   17  24  23  12
 * 2 | 3   18  25  22  11
 * 3 | 4   19  20  21  10
 * 4 | 5   6   7   8   9
 * |
 * |
 * 做爲行序號
 *
 * 根據行與列,能夠將這樣的矩陣視做array[5][5]的數組
 * 首先咱們要知道反螺旋的規則,就是從某一點開始以1開始逆時針方向依次增長1
 * 其次咱們都知道螺旋,分爲一圈圈的,那麼一個螺旋就有其圈數,與圓形不一樣的是矩陣
 * 分爲4個方向,分別爲上、左、下、右(組成一圈的數據)
 * 再來從數據遞增的方向分析序號的規則
 * 左邊:行號依次遞增爲1,列號不變
 * 下邊:列號依次遞增爲1,行號不變
 * 右邊:行號依次遞減爲1,列號不變
 * 上邊:列號依次遞減爲1,行號不變
 * 若是定義行號爲i,列號爲j,圈數爲k的話,那麼這三個數據在每圈是否是都有類似的規則呢?
 * 首先咱們須要肯定圈數,其與矩陣的大小有關,即若是是NxN的矩陣的話,圈數m=(N + 1) / 2
 * 有了圈數,咱們纔好肯定咱們須要幾回循環來組成每圈的數據
 * 咱們將最外層的一圈的圈數設置爲0,讓其循環到最後一圈即k - 1爲止
 * 假設數據的變量爲value,從1開始
 * 數據從1開始從最外層一次加1,並依次從左、下、右、上造成圈的數據,到最後一層爲止
 * 左邊的數據規律:行的序號從圈數k開始,依次累加1,列號等於圈數k 
 *                 for (i = k; i < n - k; ++i) array[i][k] = value++;
 * 下邊的數據規律:列號從圈數k+1開始,循環到小於數據n - k爲止,其行數爲n - k - 1
 *                 for (j = k + 1; j < n - k; ++j) array[n - k - 1][j] = value++;
 * 左邊的數據規律:行號從n - k - 2開始,依次循環到不小於k爲止,其列數爲n - k - 1
 *                 for (i = n - k - 2; i <= k; --i) array[i][n - k - 1] = value++;
 * 上邊的數據規律:列號從n - k - 2開始,依次循環到k,其行數爲k
 *                 for (j = n - k - 2; j > k; --j) array[k][j] = value++;
 */ 

#define ARRAY_MAX 100 //最大支持的矩陣數

//生成矩陣
void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);
//打印矩陣
void display_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);

void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length) {
  int32_t i, j, k;
  int32_t value, circle_count;
  value = 1;
  int32_t &n = length;
  circle_count = (n + 1) / 2;
  for (k = 0; k < circle_count; ++k) {
    for (i = k; i < n - k; ++i) array[i][k] = value++; //left
    for (j = k + 1; j < n - k; ++j) array[n - k - 1][j] = value++; //bottom
    for (i = n - k - 2; i >= k; --i) array[i][n - k - 1] = value++; //right
    for (j = n - k - 2; j > k; --j) array[k][j] = value++; //top
  }
}

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

int32_t main(int32_t argc, char *argv[]) {
  int32_t n = 0;
  int32_t array[ARRAY_MAX][ARRAY_MAX];
  while (n <= 0 || n > ARRAY_MAX) {
    printf("please input a unsigned int number(less than 0 and not above %d): ", 
           ARRAY_MAX);
    scanf("%d", &n);
  }
  generate_array(array, n);
  printf("the anti spiral array is: \n");
  display_array(array, n);
  return 0;
}

    result.

 成員招募(長期有效)

  若是你也對開源知識比較感興趣,若是也對網絡應用或者網絡遊戲感興趣,若是你也對該框架感興趣,你能夠加入咱們的QQ羣(348477824)。

  歡迎你們進羣相互交流學習,同時也歡迎各位朋友對該框架供出本身的一份心力。

plain framework 商業版核心成員招募

  請加入上面的框架QQ羣,商業版核心成員的招募資格和形式將以博客或者文檔等的形式公佈(14年內確認人選)。

相關文章
相關標籤/搜索