V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Akiyu
V2EX  ›  问与答

如何将一个定死游戏玩家人数的游戏更改为可控制玩家人数的游戏

  •  
  •   Akiyu · 2018-06-14 09:48:28 +08:00 · 1475 次点击
    这是一个创建于 2360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单来说上面分下来一个任务, 将一个游戏房间的玩家人数改为可由房主自行选择
    但是我看到了一句让我崩溃的代码:

    #define GAME_PLAYER 4;

    也就是说, 这游戏压根没有考虑到可能会更改玩家人数
    然后又很多地方用到了它, 例如:

    bool m_bResponse[GAME_PLAYER];

    像这样用于数组定义的地方有不少, 我想了想我的解决方案:

    1. 将这个宏改为变量, 但是很多数组的定义都用到了它, 那些数组都得改(类型可能得改成 vector).
    2. 不改宏, 追踪每一个数组使用的地方, 需要更改的每一处都更改(处理数组用到了超过实际玩家人数下标的代码).
    3. 重构

    但是这三种方式我都不想选, 前两种麻烦易错不说, 改出来的东西坑坑洼洼的, 后面维护可能得累死我 (拆东墙补西墙...)

    第三种就不是改代码了, 时间和工作量都变了, 我该如何是好...

    第 1 条附言  ·  2018-06-14 12:00:29 +08:00
    这个问题最尴尬的地方在于:
    程序框架基于一个常量, 这个常量在程序中有许多耦合, 而现在你要将这个常量改为变量
    不可避免地, 之前所有依赖这个常量的地方可能都要修改
    雪上加霜的是, 它用作了数组, 而数组的元素数量不能是变量...(我很怀念 vector...)
    第 2 条附言  ·  2018-06-20 17:34:39 +08:00
    我不想写了...
    代码质量就不说了, 密密麻麻几十行, 一行注释都没有
    对接的人还离职了(公司 4 月中旬搬到现在的地方, 以前写代码的员工离职了)
    我感觉被拉去填坑了, 心疼...
    9 条回复    2018-06-14 14:45:46 +08:00
    whileFalse
        1
    whileFalse  
       2018-06-14 10:15:50 +08:00
    即使房主能自行选择游戏人数,这个人数也是有上限的。比如说是 8.
    那么你把目前的
    #define GAME_PLAYER 4;
    重构成
    #define GAME_PLAYER_MAX 8;
    房主选择的人数限制只是能够进入房间的人数而已。
    msg7086
        2
    msg7086  
       2018-06-14 10:20:24 +08:00
    #define GAME_PLAYER 1024;
    然后加上实际人数的变量,入口处控制一下下标上界。
    across
        3
    across  
       2018-06-14 10:23:13 +08:00
    觉得 2 楼的比较有操作性,不过大部分房主承载量也有限,上限 32、64 左右就差不多了吧,多了浪费空间,数组都是预分配的。
    across
        4
    across  
       2018-06-14 10:26:27 +08:00
    把 GamePlayer 有关的封装下,然后重载[],在重载里面控制访问,宏定义上限限制在封装类里面,外部接口再提供进一步的人数限制。
    Fishdrowned
        5
    Fishdrowned  
       2018-06-14 11:43:14 +08:00
    这样可不可以
    #define GAME_PLAYER get_game_player();

    没怎么玩 C,不知道这样会不会出错
    Akiyu
        6
    Akiyu  
    OP
       2018-06-14 11:53:08 +08:00
    @Fishdrowned
    会错, 相当于
    bool m_bResponse[GAME_PLAYER] -> bool m_bResponse[get_game_player()]

    除非 get_game_player()是一个被 constexpr 修饰的函数
    但如果是 constexpr 修饰的函数, 那就必须在编译时获得值

    你无法逃过 "定义数组时, 元素数量必须是常量" 这个限制
    shierji
        7
    shierji  
       2018-06-14 13:24:02 +08:00 via Android
    先把这个值改成 9999 然后再加一套逻辑限制人数 我简直是天才 哈哈哈
    shierji
        8
    shierji  
       2018-06-14 13:24:50 +08:00 via Android
    没看评论 看来大家想法一致啊哈哈
    LGA1150
        9
    LGA1150  
       2018-06-14 14:45:46 +08:00 via Android
    换一个支持变量长度数组的编译器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2517 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:54 · PVG 23:54 · LAX 07:54 · JFK 10:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.