双人游戏根据胜负关系匹配
生活随笔
收集整理的這篇文章主要介紹了
双人游戏根据胜负关系匹配
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
匹配規(guī)則:
上一場次勝:匹配優(yōu)先級(勝>平>負(fù)>已匹配過的對手)
上一場次負(fù):匹配優(yōu)先級(平>負(fù)>勝>已匹配過的對手)
上一場次平:匹配優(yōu)先級(勝平負(fù)>已匹配過的對手)
實現(xiàn)思路:
將玩家根據(jù)上一場次勝負(fù)情況將玩家分為勝、平、負(fù)、三個池子,優(yōu)先匹配勝者池中的選手,匹配每一個選手時將改玩家已經(jīng)對陣過的選手排除掉,然后根據(jù)匹配優(yōu)先級從對應(yīng)池中選出合適的選手進(jìn)行匹配,匹配成功后需要將玩家從對應(yīng)的池中刪除掉,再進(jìn)行下一玩家的匹配,最后如果:勝平負(fù)三輪匹配完成后仍有未匹配的玩家,則將剩余玩家進(jìn)行隨機(jī)匹配
代碼實現(xiàn):
import cn.hutool.core.util.IdUtil;import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;/*** 雙人游戲玩家匹配*/ public class TwoPlayerPickSolution {public static void main(String[] args) {pick();}/*** 匹配*/private static void pick(){//勝者池List<Integer> collectWin = new ArrayList<>();for (int i=0;i<1000;i++){collectWin.add(i);}//敗者池List<Integer> collectLoss = new ArrayList<>();for(int i=10000;i<11000;i++){collectLoss.add(i);}//平者池List<Integer> collectTie = new ArrayList<>();for(int i=100000;i<101000;i++){collectTie.add(i);}//匹配勝者池Map<String,List<Integer>> winMap = handlerWinPool(collectWin, collectLoss, collectTie);List<Integer> winLeftUsers = winMap.get("left");List<Integer> winList = winMap.get("win");List<Integer> lossList = winMap.get("loss");List<Integer> tieList = winMap.get("tie");collectWin.removeAll(winList);collectLoss.removeAll(lossList);collectTie.removeAll(tieList);//匹配敗者池Map<String,List<Integer>> lossMap = handlerLossPool(collectWin, collectLoss, collectTie);List<Integer> lossLeftUsers = lossMap.get("left");List<Integer> winList2 = lossMap.get("win");List<Integer> lossList2 = lossMap.get("loss");List<Integer> tieList2 = lossMap.get("tie");collectWin.removeAll(winList2);collectLoss.removeAll(lossList2);collectTie.removeAll(tieList2);//匹配平者池Map<String,List<Integer>> tieMap = handlerTiePool(collectWin, collectLoss, collectTie);List<Integer> tieLeftUsers = tieMap.get("left");List<Integer> winList3 = tieMap.get("win");List<Integer> lossList3 = tieMap.get("loss");List<Integer> tieList3 = tieMap.get("tie");collectWin.removeAll(winList3);collectLoss.removeAll(lossList3);collectTie.removeAll(tieList3);//最低優(yōu)先級匹配List<Integer> leftUsers = Stream.of(winLeftUsers, lossLeftUsers, tieLeftUsers).flatMap(Collection::stream).collect(Collectors.toList());handlerLeftUser(leftUsers);}/*** 勝者池匹配* @param collectWin 勝者池* @param collectLoss 敗者池* @param collectTie 平者池*/private static Map<String,List<Integer>> handlerWinPool(List<Integer> collectWin,List<Integer> collectLoss,List<Integer> collectTie) {List<Integer> leftUsers = new ArrayList<>();List<Integer> winList = new ArrayList<>();List<Integer> lossList = new ArrayList<>();List<Integer> tieList = new ArrayList<>();while (collectWin.size()>0) {Integer currentUserId = collectWin.get(0);winList.add(currentUserId);//獲取當(dāng)前用戶已經(jīng)匹配過的選手集合(此處為空集合,可從db,rds或其他存儲引擎獲取)Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId);//排除當(dāng)前玩家已經(jīng)匹配過的用戶List<Integer> winCanSelects = collectionFilter(collectWin,pickedUsers);List<Integer> lossCanSelects = collectionFilter(collectLoss,pickedUsers);List<Integer> tieCanSelects = collectionFilter(collectTie,pickedUsers);if (winCanSelects.size() > 0) {//匹配成功Integer pickUserId = handlerPickSuccess( currentUserId, winCanSelects);collectWin.remove(currentUserId);collectWin.remove(pickUserId);winList.add(pickUserId);}else if (tieCanSelects.size()>0){Integer pickUserId = handlerPickSuccess(currentUserId,tieCanSelects);collectWin.remove(currentUserId);collectTie.remove(pickUserId);tieList.add(pickUserId);} else if (lossCanSelects.size()>0) {Integer pickUserId = handlerPickSuccess(currentUserId,lossCanSelects);collectWin.remove(currentUserId);collectLoss.remove(pickUserId);lossList.add(pickUserId);} else {collectWin.remove(currentUserId);leftUsers.add(currentUserId);}}Map<String,List<Integer>> map = new HashMap<>();map.put("win",winList);map.put("loss",lossList);map.put("tie",tieList);map.put("left",leftUsers);return map;}/*** 敗者池匹配* @param collectWin 勝者池* @param collectLoss 敗者池* @param collectTie 平者池*/private static Map<String,List<Integer>> handlerLossPool(List<Integer> collectWin,List<Integer> collectLoss,List<Integer> collectTie) {List<Integer> leftUsers = new ArrayList<>();List<Integer> winList = new ArrayList<>();List<Integer> lossList = new ArrayList<>();List<Integer> tieList = new ArrayList<>();while (collectLoss.size()>0) {Integer currentUserId = collectLoss.get(0);lossList.add(currentUserId);//獲取當(dāng)前用戶已經(jīng)匹配過的選手集合Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId);List<Integer> winCanSelects = collectionFilter(collectWin,pickedUsers);//排除當(dāng)前用戶已經(jīng)匹配過的選手List<Integer> lossCanSelects = collectionFilter(collectLoss,pickedUsers);List<Integer> tieCanSelects = collectionFilter(collectTie,pickedUsers);if (tieCanSelects.size()>0){Integer pickUserId = handlerPickSuccess(currentUserId,tieCanSelects);collectLoss.remove(currentUserId);collectTie.remove(pickUserId);tieList.add(pickUserId);} else if (lossCanSelects.size()>0) {Integer pickUserId = handlerPickSuccess(currentUserId,lossCanSelects);collectLoss.remove(currentUserId);collectLoss.remove(pickUserId);lossList.add(pickUserId);} else {collectLoss.remove(currentUserId);leftUsers.add(currentUserId);}}Map<String,List<Integer>> map = new HashMap<>();map.put("win",winList);map.put("loss",lossList);map.put("tie",tieList);map.put("left",leftUsers);return map;}/*** 平者池匹配* @param collectWin 勝者池* @param collectLoss 敗者池* @param collectTie 平者池*/private static Map<String,List<Integer>> handlerTiePool(List<Integer> collectWin,List<Integer> collectLoss,List<Integer> collectTie) {List<Integer> leftUsers = new ArrayList<>();List<Integer> winList = new ArrayList<>();List<Integer> lossList = new ArrayList<>();List<Integer> tieList = new ArrayList<>();while (collectTie.size()>0) {Integer currentUserId = collectTie.get(0);tieList.add(currentUserId);//獲取當(dāng)前用戶已經(jīng)匹配過的選手集合Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId); // List<Integer> winCanSelects = collectionFilter(collectWin,pickedUsers);//排除當(dāng)前用戶已經(jīng)匹配過的選手List<Integer> lossCanSelects = collectionFilter(collectLoss,pickedUsers);List<Integer> tieCanSelects = collectionFilter(collectTie,pickedUsers);if (tieCanSelects.size()>0){Integer pickUserId = handlerPickSuccess(currentUserId,tieCanSelects);collectTie.remove(currentUserId);collectTie.remove(pickUserId);tieList.add(pickUserId);} else if (lossCanSelects.size()>0) {Integer pickUserId = handlerPickSuccess(currentUserId,lossCanSelects);collectTie.remove(currentUserId);collectLoss.remove(pickUserId);lossList.add(pickUserId);} else {collectTie.remove(currentUserId);leftUsers.add(currentUserId);}}Map<String,List<Integer>> map = new HashMap<>();map.put("win",winList);map.put("loss",lossList);map.put("tie",tieList);map.put("left",leftUsers);return map;}/*** 匹配成功處理* @param currentUserId* @param winCanSelects*/private static Integer handlerPickSuccess(Integer currentUserId, List<Integer> winCanSelects) {Integer pickUserId = winCanSelects.get(0);long sessionId = IdUtil.getSnowflakeNextId();System.out.println("匹配成功:currentUserId=" + currentUserId + ",pickUserId=" + pickUserId + ",sessionId=" + sessionId);return pickUserId;}/*** 匹配剩余選手(最低優(yōu)先級匹配)* @param users*/private static void handlerLeftUser(List<Integer> users){if(null != users && users.size()>0){int size = users.size();for(int i=0;i<size/2;i++){int currentUserId = users.get(i);int pickUserId = users.get(size-1-i);long sessionId = IdUtil.getSnowflakeNextId();System.out.println("匹配成功:currentUserId=" + currentUserId + ",pickUserId=" + pickUserId + ",sessionId=" + sessionId);}}}public static <T> List<T> collectionFilter(List<T> list,Set<T> list2){List<T> result = new ArrayList<>();for(int i=0;i<list.size();i++){T t = list.get(i);if(!list2.contains(t)){result.add(t);}}return result;} }總結(jié):
個人覺得以上算法效率仍有可以改進(jìn)的空間,希望各位博友能提出有效的改進(jìn)方案
總結(jié)
以上是生活随笔為你收集整理的双人游戏根据胜负关系匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MPLS 配置静态LSP
- 下一篇: PDFEdit编辑器使用教程为PDF增加