作者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