【发布时间】:2022-01-19 05:18:10
【问题描述】:
考虑一个游戏,其中N 玩家争夺一些奖品
玩家编号为1 到N,拥有A1...AN 的金额并在一个圆圈中移动
玩家1第一个行动
他可以下注a1<=A1或将转牌传给玩家2
如果玩家1 下注,那么玩家2 可以下更大的赌注a2>a1,鉴于a2<=A2,或者放弃
考虑到a3<=A3,下一个玩家可以下更大的赌注a3>a2,或者传球等等
如果棋手返回1,他可以将钱加到他的赌注中,以便(a1+added money)>ai,其中ai是最后一次赌注,因为a1+added money<=A1
每位玩家每场游戏仅限2 操作
游戏描述包括
-
每个项目包含
player ID,他的位置(1...N)和他的初始金额的玩家列表 -
每个项目包含
player ID、action(下注/pass)和amount(如果有)的有序操作列表
例子:
玩家名单:
| PlayerId | Position | Amount |
|---|---|---|
| P1 | 1 | 60 |
| P2 | 2 | 140 |
| P3 | 3 | 90 |
| P4 | 4 | 200 |
动作列表:
| PlayerId | Action | Amount |
|---|---|---|
| P1 | bet | 20 |
| P2 | pass | |
| P3 | raise | 30 |
| P4 | raise | 40 |
| P1 | raise | 60 |
| P3 | pass | |
| P4 | pass |
将游戏描述作为输入,我想将其转换为 N 个项目的列表,其中每个项目描述玩家在游戏中的行为:
- 玩家 ID,
- 可以先下注(如果玩家有机会开始下注,则为 true,否则为 false),
- 先下注(如果玩家开始下注则为 true,否则为 false)
- Could Raise(如果玩家有机会加注之前的赌注则为 true,否则为 false),
- 加注(如果玩家有机会加注之前的赌注则为 true,否则为 false),
- 可以再加注(如果玩家有机会再加注则为真,否则为假),
- 重新加注(如果玩家先下注、被加注并重新加注,则为 true,否则为 false),
- 玩家活跃的次数(下注、加注或再加注)
- 玩家在游戏中投入的总金额
上述示例的输出应该是:
- P1,真,真,假,假,真,真,2,60
- P2,假,假,假,假,假,假,0,0
- P3,假,假,真,真,真,假,1、30
- P4,假,假,真,真,真,假,1、40
理想情况下,代码将遍历操作列表一次,并通过使用每个操作更新玩家的统计对象来构建所需的结果。谁能推荐一个算法来解决这个问题?
【问题讨论】:
-
MCTS(蒙特卡罗树搜索)。或者,更简单一点,只是在游戏树上进行基本的深度搜索
-
@draz 这位 OP 不打算制作游戏 AI,他们问的是如何将整个游戏的动作列表汇总到每个玩家的统计数据列表中
-
hmm,如果你已经收集了玩家的行为,不需要计算,其实我看不出检索信息的问题(?)