簡體   English   中英

Java生成隨機播放器對

[英]Java generating random player pairs

我的問題是要生成具有相同游戲數量但限制游戲數量的隨機玩家對,以便所有玩家不必彼此玩。

可以將其想象成一個國際象棋游戲,將隨機的玩家設置為游戲,但是每個玩家不必與所有玩家一起玩(這將花費太多時間),但是他們都必須擁有相同數量的游戲才能參加比賽平心而論。

到目前為止,我已經為游戲生成了唯一的對,但是所有玩家都必須扮演所有人,這花費了太多時間。 我知道代碼不是很漂亮,但必須每月運行一次才能生成對:

    @RequestMapping("/voistlus/{id}")
    public String newGame(Model model, @PathVariable Long id) {
    Stage stage = stageService.findOneById(id);
    if (gameService.findByStage(stage).isEmpty()) {
        List<Paar> paars = paarService.getAllPaar();
        List<Game> pairs = new ArrayList<Game>();
        for (Paar one : paars) {
            for (Paar two : paars) {
                if (!one.equals(two)) {
                    Game newPair = new Game();
                    newPair.setPaar1(one);
                    newPair.setPaar2(two);
                    if (!pairs.contains(newPair)) {
                        if (pairs.isEmpty()) {
                            pairs.add(newPair);
                            newPair.setStage(stage);
                            gameService.save(newPair);
                        } else {
                            boolean exists = false;
                            for (Game game : pairs) {
                                if (game.getPaar1().equals(two) && game.getPaar2().equals(one)) {
                                    exists = true;
                                }
                            }
                            if (!exists) {
                                pairs.add(newPair);
                                newPair.setStage(stage);
                                gameService.save(newPair);
                            }
                        }
                    }
                }
            }
        }
    }
    model.addAttribute("pairs", gameService.findByStage(stage));
    return "newGame";
}

考慮該圖,其中每個玩家是一個頂點,玩家之間的邊緣表示這些玩家之間的游戲。 我們要做的是在此圖中找到周期,每個周期都遍歷所有參與者,即,我們要在此圖中找到漢密爾頓周期。

通常,找出圖是否具有哈密頓循環是NP完全的。 但是,由於我們在此問題中考慮的圖是一個完整的圖(每個頂點彼此之間都有一條邊),因此此問題非常容易。

我們可以使用以下偽代碼來做到這一點

Let V be the empty set
Let E be the empty set

Let init be a random vertex
Add init to V

While V does not contain all players
    Select a random vertex R that is not in V
    Add R to V
    Add the edge (init - R) to E
    Let init = R
End

E now contains the set of games to be played

通過多次執行此操作,您將能夠生成多個漢密爾頓循環,每個循環都是一組游戲,其中每個玩家與另外兩個不同的玩家進行比賽。

該算法的一個主要缺點是,它允許同一游戲多次出現。 (玩家1和玩家2可能必須進行不止一次的對戰。)

如果要避免這種情況,則必須在搜索下一個循環之前刪除從圖中找到的循環。 但是,這樣做會確定是否還有另一個循環,從而找到它,再次使NP完成。

如果您想解決這個問題, 這里這里都是一個很好的起點。

遍歷游戲數量並每次挑選隨機玩家怎么樣?

    int numberOfGames = 10;
    List<Paar> paars = paarService.getAllPaar();
    for (int game = 0; game < numberOfGames; game++) {
        // for each "game day", shuffle the list of players
        Collections.shuffle(paars);
        for (int playerIndex = 0; playerIndex < paars.size(); playerIndex+=2) {
            Game newPair = new Game();
            newPair.setStage(stage);
            newPair.setPaar1(paars.get(playerIndex));
            newPair.setPaar2(paars.get(playerIndex+1));
            gameService.save(newPair);
        }
    }

缺點是您不能避免同一對玩家多次對戰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM