作者enthos (影斯)
看板travian
标题Re: [闲聊] 一秒多攻之攻防研究
时间Mon Jun 22 21:54:28 2009
我认为 ppack 提出的同秒攻击, 插秒成功的事实是存在的。
示意表格,实际上可能是 c 的 struct。
CREATE TABLE "attack"
(
流水号 int,
攻击秒 int,
攻击村 int,
攻击者 int,
防守村 int,
防守者 int,
兵种A数量 int,
兵种B数量 int,
兵种C数量 int,
...
);
在同秒攻击时, 插秒唯一成功机率是防守者出兵的流水号
刚好在攻击者的流水号中间。
如果流水号是从 0 到 2147483647 的话,
刚好攻击者第一波是 2147483640, 攻击 10 波。
如果中途没有其他人的行动。
最後2波的流水号是 0,1。
防守者的流水号就可能是 1xxxx。
server 运算时先:
select * from attack where 攻击秒 is xxx;
再依流水号的大小依序执行动作。
此时攻击者的最後两波先到, 然後是防守者,
再来才是攻击者的前8波。
如果流水号的范围是 0 ~ 65535 或 0 ~ 32767
(2 bytes, 节省空间)
发生的机率更大一点。
以 10 波和流水号 3 万来计算。
发生的机率是三千分之一,应该很符合现况。
需要用流水号的原因是 DB select 时,
不会依照存入的顺序取出。
如果这个理论成立, 写个程式跑1万次,
应该就可以至少观测到1次这种现象。
=====================
另一种可能性: (机率低, 不过也有可能)
资料用 array 存放。
攻方 10 波: A01, A02, A03 ... A10
路人 2 波: K01, K02.
防守方 2 波: D01, D02
初期资料:
A01, A02, A03, K01, A04, K02, A05, A06 ... A10
路人取消一波:
A01, A02, A03, 空, A04, K02, A05, A06 ... A10
防守方正好插入:
A01, A02, A03, D01, A04, K02, A05, A06 ... A10, D02
发生条件: 必须有人取消攻击者行动中间的动作。
这比较容易实验:先同秒攻击15波,再取消正中间的5波,
看看是否防守者有机会插入。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.22.98
1F:推 airawesu:看不懂= =可是好专业的样子 06/22 22:01
2F:推 redsquad:我C语言快被当了..... 06/22 22:08
3F:推 cylo96:实验过第二种情况....尝试三次, 都没有插到 06/22 22:15
4F:→ devil99:你的想法是合理,如果成立,应属於程式的bug,但p大的想法 06/22 22:19
5F:→ devil99:是攻击时间记录至毫秒的想法,根本就完全不同。 06/22 22:19
6F:→ devil99:我的看法是每秒都有独立的伫列,不可能全部事件混合在一起 06/22 22:22
7F:→ devil99:同一秒的事件要达到2^31,应该是不可能的。 06/22 22:23
8F:→ devil99:我强调的是事件而非攻击,因为还包含了运送资源、建筑完成 06/22 22:25
9F:→ devil99:产兵、生资等等各种情况,在同一秒发生时,也会影响攻击 06/22 22:25
10F:→ devil99:结果。 06/22 22:25
11F:→ enthos:流水号只跟接收到的事件数量有关,跟时间无关.在推文中看到: 06/22 22:51
12F:→ enthos:常见防守方要插秒,结果第一个到.可见系统流水号最大值低。 06/22 22:51
13F:→ realmeat:回2F 这应该是资料库的语法 06/23 01:36
14F:→ realmeat:资料库取值还可以下指令sort... 06/23 01:37
15F:→ realmeat:如果经过sort的中间就算有人取消, 顺位还是没变啊.. 06/23 01:39
16F:→ realmeat:那代表会插秒进去的也不用另一个取消动作 06/23 01:40
17F:→ atsea:流水号我觉得有可能 之前伺服器就有出现等待序列3万多 06/23 22:44
18F:→ atsea:等排程排到 看谁先就先执行 06/23 22:44