日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双人游戏根据胜负关系匹配

發布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双人游戏根据胜负关系匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匹配規則:

上一場次勝:匹配優先級(勝>平>負>已匹配過的對手)

上一場次負:匹配優先級(平>負>勝>已匹配過的對手)

上一場次平:匹配優先級(勝平負>已匹配過的對手)

實現思路:

將玩家根據上一場次勝負情況將玩家分為勝、平、負、三個池子,優先匹配勝者池中的選手,匹配每一個選手時將改玩家已經對陣過的選手排除掉,然后根據匹配優先級從對應池中選出合適的選手進行匹配,匹配成功后需要將玩家從對應的池中刪除掉,再進行下一玩家的匹配,最后如果:勝平負三輪匹配完成后仍有未匹配的玩家,則將剩余玩家進行隨機匹配

代碼實現:

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);//最低優先級匹配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);//獲取當前用戶已經匹配過的選手集合(此處為空集合,可從db,rds或其他存儲引擎獲取)Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId);//排除當前玩家已經匹配過的用戶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);//獲取當前用戶已經匹配過的選手集合Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId);List<Integer> winCanSelects = collectionFilter(collectWin,pickedUsers);//排除當前用戶已經匹配過的選手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);//獲取當前用戶已經匹配過的選手集合Set<Integer> pickedUsers = new HashSet<>();pickedUsers.add(currentUserId); // List<Integer> winCanSelects = collectionFilter(collectWin,pickedUsers);//排除當前用戶已經匹配過的選手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;}/*** 匹配剩余選手(最低優先級匹配)* @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;} }

總結:

個人覺得以上算法效率仍有可以改進的空間,希望各位博友能提出有效的改進方案

總結

以上是生活随笔為你收集整理的双人游戏根据胜负关系匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美视频二区 | 成人激情视频网站 | 国语av在线| 国产一区二区在线播放视频 | 国产一级内谢 | 人妻一区二区三区视频 | 越南少妇做受xxx片 亚洲av综合色区无码一二三区 | 亚洲精品视频播放 | 国产乱码视频 | 神马影院一区二区 | 国产精品VideoSex性欧美 | 日韩伊人久久 | 欧美色视频在线 | 国产成人在线一区 | av色欲无码人妻中文字幕 | 久久久在线观看 | 久久99九九| 国产又粗又猛又爽又黄的视频在线观看动漫 | a视频免费在线观看 | 十八禁一区二区三区 | 久久久www成人免费毛片 | 日批在线视频 | 免费在线不卡av | 国产美女无遮挡网站 | 久草五月| 在线观看免费高清视频 | 日韩免费在线观看 | 久久国产激情 | 天堂久久一区 | 亚洲 小说区 图片区 | 国产精品99久久久久久久久久久久 | 欧美黄色a | 精品在线99| 国产视频四区 | 免费三级大片 | 91福利视频免费观看 | 大尺度一区二区 | 日韩一级免费观看 | 久久人人草 | 欧美激情精品久久久久久蜜臀 | 国产精品第56页 | 久久久久麻豆 | 久久久人| 色在线播放 | 丰满人妻妇伦又伦精品国产 | 国产在线伊人 | 黄色小视频在线免费观看 | 99re这里只有精品在线观看 | 伊人啪啪网 | a色视频| 开心激情播播网 | 神马一区二区三区 | 成人在线一区二区三区 | 欧美黑人又粗又大的性格特点 | 中文字幕无码毛片免费看 | 精品国产999久久久免费 | 丁香婷婷一区二区三区 | 91久久精品日日躁夜夜躁欧美 | 欧美一区二区在线视频 | 成人午夜淫片100集 伊人久久国产 | 国产日韩免费视频 | 欧美 日韩 人妻 高清 中文 | 无码国产精品一区二区高潮 | 国产一区二区自拍 | 日本成片网 | 国内91视频| 欧美99视频 | 在线免费色 | 亚洲美女中文字幕 | 伊人久久激情 | www.涩涩爱 | 午夜激情福利视频 | 成人欧美在线视频 | 最新国产网址 | 欧美丰满少妇人妻精品 | 精品一区在线 | 欧美大黑bbbbbbbbb在线 | 9久久精品| 久久永久免费 | 中文写幕一区二区三区免费观成熟 | 男女69视频 | 天堂在线中文在线 | 一级网站在线观看 | 免费黄色小说视频 | 香蕉久久夜色精品升级完成 | 欧美成人不卡视频 | 国产不卡视频在线观看 | 欧美精品韩国精品 | 亚洲精品综合精品自拍 | 久久婷婷五月综合色国产香蕉 | 丁香婷婷激情 | 少妇精品无码一区二区免费视频 | 日韩欧美v | 亚洲欧美91 | 久久久国产打桩机 | 亚洲熟妇av一区二区三区漫画 | 国产最新视频在线 | 成人综合站 | 欧美精品做受xxx性少妇 |