zoukankan      html  css  js  c++  java
  • MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步。动态场景和副本是场景中特殊的类型,副本在这里想必已经是无人不知无人不晓的,那么动态场景又是什么样的呢?

    游戏截图

    副本(管理器)

      1、初始化(init)

        副本管理器数据初始化。

      2、数据选择(select scene)

        根据传入的数据获得副本的创建者,并判断副本创建者关联的场景数据是否正确,再根据场景类型加入到副本场景节点列表中。

      3、放入场景节点(push node)

        将场景节点的数据放入到场景节点中。

      4、弹出场景节点(pop node)

        将场景节点数据弹出节点列表。

      5、心跳(heart beat)

        主要是弹出场景信息,并装载该场景数据进行处理,并向中心数据服务器发送消息。

    动态场景

      动态场景就如其名字一样是动态的,也就是说场景本身可能被改变,举个例子来说一间破土屋一下子变成了豪门大院。动态场景可以被创建,同时可能被销毁,与副本不同的是动态场景有存储的过程,一旦动态场景创建之后所有数据将被保存在服务器中,直到进行了删除操作。在天龙八部OL中动态场景的表现主要在城市的数据,即帮派城市上。

      1、数据

    typedef struct citynode_struct {
      scene::Base *scene; //场景指针
      int16_t port_sceneid; //入口场景ID
      int32_t player_guid; //玩家GUID
    } citynode_t; //城市节点数据结构
    
    typedef struct loadnode_struct {
      int16_t scene_datatype; //场景数据类型
      citynode_t citydata;
    } loadnode_t; //节点加载结构

      2、管理器

        1. 初始化(init)

          动态场景数据初始化。

        2. 数据选择(select scene)

          从场景配置文件中加载场景数据,需要符合城市数据的规则才能被正常加入到管理器中。

        3. 放入场景节点(push node)

          将场景节点的数据放入到节点列表中。

        4. 弹出场景节点(pop node)

          将场景节点的数据弹出节点列表。

        5. 心跳(heat beat)

          循环弹出处理节点列表中的数据,主要是场景数据的加载,以及向中心数据服务器请求场景数据。

    算法(精确迭代法)

      1、最大公约数和最大公倍数

        code.

    #include <stdio.h>
    #include <inttypes.h>
    
    /**
     * 精确迭代法指的是通过迭代可以得到一个精确的解
     */ 
    
    /**
     * 求两个正整数的最大公约数和最大公倍数
     * 利用辗转相除法求最大公约数,然后根据最大公约数得到最小公倍数
     * 假如这两个正整数是M和N
     * 1 用M对N求余,余数记作R,即R = M % N
     * 2 将除数作为被除数,余数作为除数求新的余数,即M = N, N = R
     * 3 重复执行步骤2,直到余数为0为止
     */ 
    
    int32_t main(int32_t argc, char *argv[]) {
      int32_t m, n, m1, n1, r;
      printf("please input two int nuber: ");
      scanf("%d,%d", &m, &n);
      m1 = m;
      n1 = n;
      r = m % n;
      while (r != 0) {
        m = n;
        n = r;
        r = m % n;
      }
      printf("%d and %d max common divisor is: %d
    ", m1, n1, n);
      printf("%d and %d min common multiple is: %d
    ", m1, n1, m1 * n1 / n);
      return 0;
    }

        result.

      2、十进制转二进制

        code.

    #include <stdio.h>
    #include <inttypes.h>
    
    /**
     * 十进制转二进制
     * 1 将该数除以2,得到商和余数。
     * 2 将商作为被除数,并除以2,得到新的商和余。
     * 3 重复执行步骤2,直到商为0为止。将余数反向排列即为所求。
     */ 
    
    int32_t main(int32_t argc, char *argv[]) {
      int32_t i, n, x, array[16];
      printf("please input a int number: ");
      scanf("%d", &x);
      n = 1;
      while (x != 0) {
        array[n] = x % 2;
        x = x /2;
        ++n;
      }
      printf("binary value: ");
      for (i = n - 1; i >= 1; --i)
        printf("%d", array[i]);
      printf("
    ");
      return 0;
    }

        result.

      3、质因数分解

        code.

    #include <stdio.h>
    #include <inttypes.h>
    
    /**
     * 质数:除了1乘以自身以外不能再分解为其他两个或两个以上相乘的数。(个人理解)
     */ 
    
    /**
     * 质因数分解
     * 假如待分解的整数为M,则分解过程如下:
     * 1 如果M不等于1,则从x = 2开始,让M除以x,如果能够被整除,则x是其中的一个因子,将
     * x存入数组array中,并用商代替M。
     * 2 如果M能被x整除,转到步骤1执行,否则x增加1。
     * 3 如果M不为1, 则转步骤1执行,否则算法结束。
     */ 
    
    int32_t main(int32_t argc, char *argv[]) {
      int32_t array[16], m, m0, x = 2, i = 0, j;
      printf("please input a number you want decompose: ");
      scanf("%d", &m0);
      m = m0;
      while (m != 1) {
        while (0 == (m % x)) {
          ++i;
          array[i] = x;
          m = m /x;
        }
        ++x;
      }
      printf("decompose result: %d = ", m0, i);
      for (j = 1; j < i; ++j)
        printf("%d*", array[j]);
      printf("%d", array[i]);
      printf("
    ");
      return 0;
    }

        result.

      4、谷角猜想

        code.

    #include <stdio.h>
    #include <inttypes.h>
    
    /**
     * 谷角猜想:
     * 前提是对象是一个自然数。
     * 任何偶数一直除以2,经过有限次之后总能得到1;任何奇数乘以3 + 1后一直除以2,经过
     * 有限次数后也能得到1。
     */ 
    
    int32_t main(int32_t argc, char *argv[]) {
      int32_t x;
      printf("please input a unsigned int number: ");
      scanf("%d", &x);
      printf("the gujiao process every number: 
    %d", x);
      while (x != 1) {
        if (0 == (x % 2)) { //偶数
          x /=2;
          printf("->%d", x);
        } else {
          x = x * 3 + 1;
          printf("->%d", x);
        }
      }
      printf("
    ");
      return 0;
    }

        result.

    总结

      这是场景讲解的最后一篇,已经将场景大部分的内容进行了一边粗略的讲解,不过设计很灵活,规则由人去运用,所以不需要生搬硬套。再次感谢各位读者的关注,我会不定期更新这些文章,使之更为成熟和严谨。顺便为自己的框架来个广告,一个设计的核心往往需要核心的底层支持,简约框架就是基于此为了方便和快捷而产生的。

      plain framework成员招募QQ群:348477824

  • 相关阅读:
    分布式数据库拆分表常用的方法
    linux服务器502错误详解【转载】
    全国各城市代码
    Linux下git安装
    linux上访问windows目录
    百度技术总监谈12306高性能海量并发网站架构设计
    Ubuntu 10.04 安装无线网卡驱动。
    晕菜, silverlight !
    linux 软件记录.
    硬盘安装 Ubuntu10.04
  • 原文地址:https://www.cnblogs.com/lianyue/p/4097384.html
Copyright © 2011-2022 走看看