如何消除文本游戏lootbox逻辑中冗余的if-elseif语句?
优化库存物品添加逻辑,替代冗余的if-elseif语句
问题背景
开发小型文本类游戏时,击败地下城后的lootbox系统中,当前通过逐个检查invitem1至invitem7是否为空来添加物品,导致代码充斥大量重复的if-elseif分支,可读性和维护性差。
解决方案:用集合替代独立变量,通过循环简化逻辑
核心是将分散的invitem1~invitem7替换为数组或List集合,通过遍历集合找到第一个空位,彻底消除冗余分支。
1. 替换独立变量为数组
首先把原来的单个库存变量换成一个固定长度的数组(对应7个库存位):
// 初始化7个空位的库存,初始值为空字符串 string[] inventory = new string[7];
2. 简化物品添加逻辑
通过循环遍历数组,找到第一个空位后添加物品并提示;若遍历结束无空位,则提示库存已满。
优化后的完整代码:
if (whatitem == 1) { string obtainedItem = item5; Console.WriteLine($"You got {obtainedItem}(10%)"); bool added = false; for (int i = 0; i < inventory.Length; i++) { if (string.IsNullOrEmpty(inventory[i])) { inventory[i] = obtainedItem; Console.WriteLine($"The item has been added to your inventory. Added to slot {i + 1}"); added = true; break; // 找到空位后立即终止循环 } } if (!added) { Console.WriteLine("No space, Reward deleted"); } Console.WriteLine("Press ENTER to proceed"); }
3. 进阶优化:封装库存操作方法
如果需要处理多种物品类型(whatitem为2~5的情况),可以将库存添加逻辑封装成独立方法,避免重复代码:
// 封装库存添加逻辑,返回是否添加成功 bool AddItemToInventory(string item, string[] inventory) { for (int i = 0; i < inventory.Length; i++) { if (string.IsNullOrEmpty(inventory[i])) { inventory[i] = item; Console.WriteLine($"The item has been added to your inventory. Added to slot {i + 1}"); return true; } } Console.WriteLine("No space, Reward deleted"); return false; }
调用示例:
if (whatitem == 1) { string obtainedItem = item5; Console.WriteLine($"You got {obtainedItem}(10%)"); AddItemToInventory(obtainedItem, inventory); Console.WriteLine("Press ENTER to proceed"); } // whatitem为其他值时,直接调用方法即可 if (whatitem == 2) { string obtainedItem = itemX; // 对应其他物品 Console.WriteLine($"You got {obtainedItem}(XX%)"); AddItemToInventory(obtainedItem, inventory); Console.WriteLine("Press ENTER to proceed"); }
额外优化细节
- 使用字符串插值(
$"...")替代字符串拼接,代码更简洁易读 - 用
string.IsNullOrEmpty()替代直接判断== "",更严谨(能处理null的情况)
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

