MMORPG大型游戲設計與開發(服務器 游戲場景 掉落與網絡連接)


時間一點點的消逝,伴着自己空閑日子將要結束的時候我盡量的學習和分享場景和AI的知識給朋友們,不過很遺憾的是這些文章還有不足的地方,就是有的難點沒有完全的分析到。掉落在游戲中必不可少的,同時網絡連接也是網絡游戲中的核心部分,那么這兩個東西又怎么和場景關聯起來的?

一張截圖

掉落(管理器)

  1、初始化(init)

    根據地圖的長寬初始化掉落點數據。

  2、是否可掉落(is can drop)

    傳入坐標返回該點是否可以掉落。

  3、設置掉落點(set drop position)

    傳入一個坐標,並將該點設置為掉落點。

  4、清除掉落點(clear drop position)

    根據掉落點清除數據。

網絡連接(管理器)

  同一般的網絡連接管理器一樣,該管理器主要負責網絡連接的管理,以及網絡連接數據的處理。

  每個場景對應一個場景網絡連接管理器。  

  1、網絡偵測(select)

    套接字狀態更新處理。

  2、處理輸入(process input)

    數據的接收處理函數,與普通管理器不同的是這里不處理連接接受的情況,由場景管理器統一處理。

  3、處理輸出(process output)

    處理輸出(發送)的數據。

  4、處理異常(process exception)

    處理網絡異常情況。

  5、消息處理(process command)

    接收到的消息將在這里進行處理。

  6、循環邏輯處理(heart beat)

    循環處理網絡連接的邏輯。

  7、設置場景ID(set scene id)

    傳入場景ID,並將此ID和該對象關聯。

  8、獲得場景ID(get scene id)

    獲得當前管理器對應的場景ID。

  9、增加網絡連接(add connection)

    傳入網絡連接對象指針並將該網絡連接加入到管理器中。

  10、增加套接字信息(add socket)

    將套接字的信息加入管理器中。

  11、刪除網絡連接(delete connection)

    在管理器中去除網絡連接,但是不斷開網絡連接,可能是切換到別的場景。

  12、刪除套接字信息(delete socket)

    刪除套接字的信息。

  13、移除網絡連接(remove connection)

    移除玩家的網絡連接並清理數據,通知場景對象被移除。

  14、移除所有網絡連接(remonve all)

    將所有網絡連接從管理器中移除,一般是用於異常和停機時候調用。

算法(遞推算法)

  遞推算法分為順推法和逆推法,所謂順推法就是從開始的數據開始向后根據數據的規則推算出公式,而逆推法恰恰相反從后面的數據開始按照規律找出數據組成的公式。

  遞推算法雖然原理比較簡單,但是卻可以考驗一個人的歸納總結的能力。

  1、斐波那契數列

    斐波那契數列定義:

    從數列的第三項開始,每一項正好等於前兩者之和。

    F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2) (n表示數列的n項,且n >= 2)。

    code.

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

/**
 * 斐波那契數列定義:
 * 從數列的第三項開始,每一項正好等於前兩者之和。
 * F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2) (n表示數列的n項,且n >= 2)
 */ 

/**
 * 問題:
 * 如果1對兔子每月能生一對小兔子,而每對兔子在它出生的第3個月又能開始生1對兔子,
 * 假定在不發生死亡的情況下,由一對兔子開始,1年后能繁殖成多少對兔子。
 *
 * 針對問題,我們可以將這些數據依次類推,可以發現它們剛好組成斐波那契數列。
 */ 

#define N 12

int32_t main(int32_t argc, char *argv[]) {
  int32_t array[N + 1], i;
  array[0] = 1;
  array[1] = 1;
  for (i = 2; i <= N; ++i)
    array[i] = array[i - 1] + array[i - 2];
  for (i = 1; i <= N; ++i)
    printf("the %d month total rabbit: %d\n", i, array[i]);
  return 0;
}

    result.

  2、進制數轉換二進制

    進制數可分為整數部分以及小數部分,將十進制數轉換為二進制數可以分別將整數和小數部分進行轉換。其中,將十進制整數轉換為二進制整數采用的方法是"除二取余",十進制小數轉換為二進制小數的主要方法是"乘二取余"。

    code.

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

/**
 * 十進制數轉換二進制
 * 十進制數可分為整數部分以及小數部分,將十進制數轉換為二進制數可以分別將整數
 * 和小數部分進行轉換。其中,將十進制整數轉換為二進制整數采用的方法是"除二取余",
 * 將十進制小數轉換為二進制小數的主要方法是"乘二取余"。
 */ 

#define N 8

void trans(float value, 
           int32_t a[], //保存整數部分
           int32_t &alength,
           int32_t b[], //保存小數部分
           int32_t blength);

int32_t main(int32_t argc, char *argv[]) {
  int32_t a[N + 1], b[N + 1];
  float x = .0f; 
  int32_t i;
  printf("please input a float number: ");
  scanf("%f", &x);
  int32_t alength = N;
  trans(x, a, alength, b, N);
  printf("the binary numbers: ");
  for (i = alength; i > 0; --i)
    printf("%d", a[i]);
  printf(".");
  for (i = 1; i <= N; ++i) {
    if (0 == b[i]) {
      printf("0");
    } else {
      printf("1");
    }
  }
  printf("\n");
  return 0;
}

void trans(float value, 
           int32_t a[], 
           int32_t &alength, 
           int32_t b[], 
           int32_t blength) {
  double ipart;
  int32_t _ipart;
  value = modf(value, &ipart);
  _ipart = static_cast<int32_t>(ipart);
  int32_t i;
  for (i = 0; i <= alength; ++i)
    a[i] = 0; //初始化
  for (i = 0; i <= blength; ++i)
    b[i] = 0; //初始化
  int32_t k = 0;
  while (_ipart) {
    a[k++] = _ipart % 2;
    _ipart /= 2;
  }
  alength = k;
  for (i = 1; i <= blength; ++i) {
    value *= 2;
    if (value > 1.0f) {
      value -= 1;
      b[i] = 1;
    } else {
      b[i] = 0;
    }
  }
}

    result.

  3、母牛生小牛

    有一頭母牛,每年年初生一頭小母牛,每頭小母牛從第3個年頭起,每年年初也生頭小母牛。求在第20年時共有多少頭牛。

    code.

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

/**
 * 問題:
 *    有一頭母牛,每年年初生一頭小母牛,每頭小母牛從第3個年頭起,每年年初也生
 *    一頭小母牛。求在第20年時共有多少頭牛。
 */

#define N 20

int32_t main(int32_t argc, char *argv[]) {
  int32_t x0[N + 1], x1[N + 1], x2[N + 1], x3[N + 1], i, s;
  x0[0] = 1; //初始時,只有一頭剛出生的母牛
  x1[0] = x2[0] = x3[0] = 0;
  for (i = 1; i <= N; ++i) {
    x0[i] = x3[i] = x2[i - 1] + x3[i - 1]; //滿2歲和滿3歲的母牛成為育齡牛,並且都生了小母牛
    x1[i] = x0[i - 1]; //剛生下的小母牛成為下一年的滿1歲的母牛
    x2[i] = x1[i - 1]; //滿1歲的小母牛成為下一年的滿2歲的母牛
    s = x0[i] + x1[i] + x2[i] + x3[i]; //第i年的母牛總數
    printf("the %d year ox nubers: %4d\n", i, s);
  }
  return 0;
}

    result.

  4、楊輝三角

    楊輝三角,具有二項展開式的二項式系數即組合數的性質,這是研究楊輝三角其他規律的基礎。

    code.

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


/**
 * 楊輝三角,具有二項展開式的二項式系數即組合數的性質,這是研究楊輝三角其他規律的基礎。
 * 1 每行數字左右對稱,由1開始逐漸增大,然后變小,回到1。
 * 2 第n行的數字個數為n個。
 * 3 第n行的數字和為2的n次方減1。
 * 4 每個數字等於上一行的左右兩個數字之和。
 * 5 第n行的第1個數為1,第二個數為1 x (n - 1),第3個數為1 x (n - 1) x (n - 2) / 2,
 *   依次類推。
 */ 

#define N 8

int32_t main(int32_t argc, char *argv[]) {
  int32_t array[N + 1][N + 1];
  int32_t i, j;
  for (i = 0; i <= N; ++i)
    array[i][i] = array[i][0] = 1;
  for (i = 2; i <= N; ++i) {
    for (j = 1; j < i; ++j)
      array[i][j] = array[i - 1][j] + array[i - 1][j - 1];
  }
  printf("%d yang hui angle is: \n", N + 1);
  for (i = 0; i <= N; ++i) {
    for (j = 0; j <= i; ++j)
      printf("%3d", array[i][j]);
    printf("\n");
  }
  return 0;
}

    result.

  5、猴子吃桃

    子第一天摘了若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃前一天的一半零一個。第十天的早上想再多吃時,只見剩下一個桃子了。求第一天共摘了多少桃子。

    code.

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

/**
 * 問題:
 *   猴子第一天摘了若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上
 *   又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃前一天的一半零一個。
 *   到第十天的早上想再多吃時,只見剩下一個桃子了。求第一天共摘了多少桃子。
 */ 

int32_t main(int32_t argc, char *argv[]) {
  //x為桃子的總數, y為當天猴子吃完剩下的桃子數量,x - (x / 2 + 1) = y; 可以反推出x = 2 * (y + 1)
  int32_t day, x, y;
  day = 10; //共10天
  y = 1; //最后一天剩下的桃子數量
  while (day > 1) {
    x = (y + 1) * 2;
    y = x;
    --day;
  }
  printf("the first total peachs: %d\n", x);
  return 0;
}

    result.

  6、存錢問題

    小明為自己的學生生活准備了一筆學費,一次性存入銀行,保證在每年年底取出1000元,到第3學習結束時剛好取完。假設銀行一年整存零取的月息為0.31%,請計算需要存多少錢?

    code.

/**
 * 小明為自己的學生生活准備了一筆學費,一次性存入銀行,保證在每年年底取出1000元,
 * 到第3學習結束時剛好取完。假設銀行一年整存零取的月息為0.31%,請計算需要存多少錢
 */

//首先第三年年初的存款為x那么有公式:x + x * 12 * 0.0031 = 1000
//則x = 1000 / (1 + 12 * 0.0031)
//同理可得第二年初的存款為(第三年初的銀行存款 + 1000)/ (1 + 12 * 0.0031)
//第一年年初的存款為(第二年年初的銀行存款 + 1000)/ (1 + 12 * 0.0031)

int32_t main(int32_t argc, char *argv[]) {
  int32_t i;
  float total = .0f;
  for (i = 0; i < 3; ++i)
    total = (total + 1000) / ( 1 + 12 * 0.0031);
  printf("the first year need save money: %.2f\n", total);
  return 0;
}

    result.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM