游戲自動分配算法討論


比如一款麻將游戲。每個人點開始游戲后。系統會自動進行組合,選出4個人

作為一個房間,這個算法如何設計?

假設我點擊開始游戲后,將我申請進入一局游戲的請求發送給服務器,就進入

等待環節,服務器在可以組成一個房間后,向該房間成員發出通知。滿足要求

的人數不夠等無法組成房間時,就等待。玩家等不及了,可退出等待環節。

要求:
①保證同一IP玩家不會被分到一個房間里(防止個人作弊,防止距離很近的人

合伙算計他人)
②盡量使組成一個房間的四個人水平大致相當(假設有一個整數的屬性表明該

玩家水平,值越大水平越高)
③允許玩家提出附加要求,比如只和xx等級以上玩家玩(注意提出該要求的玩

家可以和符合該要求但未提出要求的玩家 或 同時符合雙方要求的玩家 組合)
④效率,復雜度,內存占用等。盡量不在數據庫中操作。

難度逐級增大啊,喜歡琢磨的琢磨一下吧。
PS.騰訊的游戲好像都是手動找座位的,國外的有些麻將游戲就是這樣分配的。

 

1,2,3其實是三條rule。簡單算法如下,

  1. 挑選一個人坐在某桌作為起始
  2. 首先抽取本桌candidate的集合set,(比如最近等待5分鍾的全部的人),
  3. 問題轉換為從一個set里面隨機抽取三個人滿足條件1,2,3的問題。
  4. 依次遍歷集合的每個人,最先符合條件的三個人坐下剩下的三個空位
  5. 剩下N-3的人用3/4的概率任意替換前面4人中的某人。集合遍歷結束可
  6. 以得到隨機的四個人。
  7. 為了速度和效率,在抽取candidate集合的可以用一些算法加快。比如實
  8. 現根據rank形成不同的隊列加快partition的過程。

本答案思路來自google的一道面試題:

You have a stream of infinite queries (ie: real time Google search queries

that people are entering). Describe how you would go about finding a

good estimate of 1000 samples from this never ending set of data and

then write code for it.

 

如果沒有第三條,算法比較簡單:有一個線程每隔一段時間把當前等待的人拿出來

按實力排好序,先確保上一輪未匹配的先配對(防止等待時間過長),然后從大到

小依次四個四個配對,遇到同IP配對的去掉相同的IP從后面選人遞補進來,最后剩

下的進入下一輪等待。

如果有第三條的話,根據是否滿足條件可以把等待選手變成一個有向圖,問題就要

復雜得多了,而且滿足第三條的時候可能會違背第二條。當然也可以簡化成 和上面

差不多的算法,發現對手不符合要求的時候就把提出要求的玩家踢掉重新匹配,然

后下一輪優先匹配,如果設置條件的玩家不多的話還行,多的話用這個算法 可能根

本就匹配不上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM