struct TroopItem { int id; int type; int level; int load; int force; int own_num; int select_num; }; List<TroopItem> QuickSelectTroopList(int res_max, int march_size_max, List<TroopItem> own_troop_list) { List<TroopItem> selected_troop_list; int remaining_load = res_max; int remaining_march_size = march_size_max; // 计算每种士兵可以派出的最大数量 for (int i = 0; i < own_troop_list.Count; i++) { own_troop_list[i].select_num = Math.Min(own_troop_list[i].own_num, remaining_march_size / own_troop_list[i].load); own_troop_list[i].select_num = Math.Min(own_troop_list[i].select_num, remaining_load / own_troop_list[i].load); remaining_march_size -= own_troop_list[i].select_num * own_troop_list[i].load; remaining_load -= own_troop_list[i].select_num * own_troop_list[i].load; selected_troop_list.Add(own_troop_list[i]); } return selected_troop_list; }中的own_troop_list[i].select_num = Math.Min(own_troop_list[i].own_num, remaining_march_size / own_troop_list[i].load);这段代码啥意思
时间: 2024-04-23 22:25:28 浏览: 225
这段代码的意思是计算当前类型士兵在满足最大载重和最大人数限制下能够派遣的最大数量。具体实现如下:
首先,own_troop_list[i].own_num 表示你拥有的该类型士兵的数量,remaining_march_size 表示剩余的最大人数,own_troop_list[i].load 表示每个士兵的载重。
remaining_march_size / own_troop_list[i].load 表示当前剩余最大人数下,该类型士兵最多可以派遣的数量(根据载重算出来的)。
Math.Min(own_troop_list[i].own_num, remaining_march_size / own_troop_list[i].load) 取当前该类型士兵拥有数量和根据载重计算出来的最大可派遣数量的较小值,因为你不能派出超过你拥有的数量的士兵,也不能派出超过载重限制的士兵。
最后,把计算出来的该类型士兵的最大可派遣数量赋值给 own_troop_list[i].select_num,以便后续计算被选择的总士兵数量。
相关问题
struct TroopItem { int id; int type; int level; int load; int force; int own_num; int select_num; }; List<TroopItem> QuickSelectTroopList(int res_max, int march_size_max, List<TroopItem> own_troop_list) { List<TroopItem> selected_troop_list; int remaining_load = res_max; int remaining_march_size = march_size_max; // 计算每种士兵可以派出的最大数量 for (int i = 0; i < own_troop_list.Count; i++) { own_troop_list[i].select_num = Math.Min(own_troop_list[i].own_num, remaining_march_size / own_troop_list[i].load); own_troop_list[i].select_num = Math.Min(own_troop_list[i].select_num, remaining_load / own_troop_list[i].load); remaining_march_size -= own_troop_list[i].select_num * own_troop_list[i].load; remaining_load -= own_troop_list[i].select_num * own_troop_list[i].load; selected_troop_list.Add(own_troop_list[i]); } return selected_troop_list; }解释一下这段代码
这段代码实现了一个函数 QuickSelectTroopList,它的作用是从一个士兵列表(List<TroopItem> own_troop_list)中选择出一部分士兵,使得它们的总载重和总人数都不超过给定的限制(res_max 和 march_size_max)。
具体实现过程如下:
1. 初始化一个空的列表 selected_troop_list,用于存储被选择的士兵。
2. 初始化剩余的载重和人数为 res_max 和 march_size_max。
3. 遍历士兵列表 own_troop_list,对于每一个士兵,计算它可以派遣的最大数量:
a. 首先,它能够派遣的最大数量取决于当前剩余的载重和人数,因此先计算出它能够派遣的最大数量 select_num1。
b. 其次,它能够派遣的最大数量还受到自己的数量限制,因此需要再次计算出它能够派遣的最大数量 select_num2,取两者的较小值。
c. 累计被选择的士兵的总载重和总人数,更新剩余的载重和人数。
d. 把这个士兵加入到被选择的列表中。
4. 返回被选择的士兵列表 selected_troop_list。
这段代码使用了一个 TroopItem 结构体来表示每一个士兵的属性,包括 id、type、level、load、force、own_num 和 select_num。其中,id、type 和 level 表示士兵的基本信息,load 表示每个士兵的载重,force 表示每个士兵的战斗力,own_num 表示你拥有的该类型士兵的数量,select_num 表示被选择的该类型士兵的数量。
现在游戏中需要实现一个“快速选择”(右图标识1)的功能,自动帮助用户选择出兵数量,需求如下: 资源地的资源量是有上限的(右图标识2处的分母值),若士兵数量充足,尽量把资源拉完,且尽量减少派兵数量; 单次出兵的数量也是有限制的(右图标识3处的分母值),派出的士兵数量不能超过这个限制; 请使用熟悉的程序语言,实现这样的函数 输入参数:资源地load上限,出兵数量上限,拥有的士兵种类列表 返回值:自动选择出来的士兵列表(士兵类型,数量) 函数定义:List<TroopItem> QuickSelectTroopList(int res_max, int march_size_max, List<TroopItem> own_troop_list) 士兵结构定义如下: struct TroopItem { int id; int type; int level; int load; int force; int own_num; int select_num; }
下面是使用 C# 语言实现这个函数的示例代码:
```csharp
List<TroopItem> QuickSelectTroopList(int res_max, int march_size_max, List<TroopItem> own_troop_list) {
List<TroopItem> selected_troop_list = new List<TroopItem>();
int remaining_load = res_max;
int remaining_march_size = march_size_max;
own_troop_list = own_troop_list.OrderBy(troop => troop.load).ToList(); // 按照载重从小到大排序
foreach (TroopItem troop in own_troop_list) {
if (remaining_load <= 0 || remaining_march_size <= 0) {
// 如果资源或者出兵数量已经用完,跳出循环
break;
}
int max_num_load = remaining_load / troop.load; // 根据载重计算可以派出的最大数量
int max_num_march_size = remaining_march_size / troop.load;
int max_num = Math.Min(troop.own_num, Math.Min(max_num_load, max_num_march_size)); // 取三者中的最小值
if (max_num > 0) {
troop.select_num = max_num;
remaining_load -= max_num * troop.load;
remaining_march_size -= max_num * troop.load;
selected_troop_list.Add(troop);
}
}
return selected_troop_list;
}
```
该函数首先按照士兵的载重从小到大进行排序,这样可以优先选择载重小的士兵。然后遍历每一种士兵,按照需求计算出可以派出的最大数量,并将其存储在 `select_num` 中。最后将选择出的士兵存储在 `selected_troop_list` 中并返回。注意需要在循环中判断资源或者出兵数量是否已经用完,如果用完了就跳出循环。
阅读全文