java游戏匹配

编程入门 行业动态 更新时间:2024-10-28 15:24:33

java<a href=https://www.elefans.com/category/jswz/34/1770081.html style=游戏匹配"/>

java游戏匹配

需求:玩家会随机加入游戏,当第一个玩家加入匹配后最多等待时间T,每局游戏固定人数N git代码库:.git

匹配接口

package company;

import java.util.Collection;

import java.util.Set;

/**

* 通用匹配

*

* @param

*/

public interface Match {

/**

* 添加匹配

* @param ele

*/

void add(T ele);

/**

* 匹配成功

* @param list

*/

void success(Collection list);

/**

* 匹配失败,未达到固定匹配人数

* @param list

*/

void fail(Collection list);

}

超时匹配实现

package company;

import java.util.HashSet;

import java.util.LinkedHashSet;

import java.util.Set;

import java.util.concurrent.*;

/**

* 超时匹配

* @param

*/

public abstract class TimeoutMatch extends Thread implements Match {

/**

* 匹配超时时间

*/

private final long timeout;

private final int capacity;

private final ExecutorService executorService;

private final LinkedBlockingDeque deque = new LinkedBlockingDeque<>();

public TimeoutMatch(int capacity, long timeout){

this(capacity,timeout,Executors.newSingleThreadExecutor());

}

public TimeoutMatch(int capacity, long timeout,ExecutorService executorService){

this.capacity = capacity;

this.timeout = timeout;

this.executorService = executorService;

start();

}

@Override

public void add(T ele){

deque.push(ele);

}

@Override

public void run() {

while (!Thread.currentThread().isInterrupted()){

try {

T start = deque.take();

System.out.println("匹配开始");

Future> submit = executorService.submit(new Task(start));

try {

Set list = submit.get(timeout, TimeUnit.SECONDS);

success(list);

}catch (TimeoutException e) {

submit.cancel(true);

}catch (Exception e){

e.printStackTrace();

}

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

}

private class Task implements Callable>{

private final T start;

public Task(T start){

this.start = start;

}

@Override

public Set call() {

Set list = new LinkedHashSet<>(capacity);

list.add(start);

System.out.println("放入临时匹配队列" + start);

try {

while (list.size() != capacity){

T ele = deque.take();

list.add(ele);

System.out.println("放入临时匹配队列" + ele);

}

}catch (InterruptedException e) {

fail(list);

}

return list;

}

}

}

测试用例

package company.test;

import company.TimeoutMatch;

import java.util.Collection;

import java.util.UUID;

public class TimeoutMatchTests {

public static void main(String[] args) throws InterruptedException {

TestTimeoutMatch match = new TestTimeoutMatch(3,3);

while (true){

int num = (int) (Math.random() * 3);

System.out.printf("加入【%d】人\r\n", num);

for (int i = 0; i < num; i++) {

match.add(UUID.randomUUID().toString());

}

Thread.sleep(1500);

}

}

static class TestTimeoutMatch extends TimeoutMatch {

public TestTimeoutMatch(int capacity, long timeout) {

super(capacity, timeout);

}

@Override

public void success(Collection list) {

System.out.println("匹配成功");

for (String item : list) {

System.out.println("\t" + item);

}

}

@Override

public void fail(Collection list) {

System.err.println("匹配失败");

for (String item : list) {

System.err.println("\t" + item);

}

}

}

}

测试结果

加入【1】人

匹配开始

放入临时匹配队列865cf9b3-fe43-4b88-89de-cc7c79fb5f84

加入【0】人

加入【1】人

放入临时匹配队列117b966c-d7b0-492d-aff2-cb31bffa207e

匹配失败

865cf9b3-fe43-4b88-89de-cc7c79fb5f84

117b966c-d7b0-492d-aff2-cb31bffa207e

加入【1】人

匹配开始

放入临时匹配队列7b944eaa-7e44-4895-8bec-0b3e011fb562

加入【2】人

放入临时匹配队列ac89eec4-5324-490b-a420-a454f59b2220

放入临时匹配队列44feee0c-eafa-4cdc-9223-6a43f5c24782

匹配成功

7b944eaa-7e44-4895-8bec-0b3e011fb562

ac89eec4-5324-490b-a420-a454f59b2220

44feee0c-eafa-4cdc-9223-6a43f5c24782

加入【2】人

匹配开始

放入临时匹配队列a5544b6d-4d22-4eb6-92ed-4bef946f6fa6

放入临时匹配队列69203001-0440-48e5-8247-f8775bc32cad

加入【1】人

放入临时匹配队列55a6dde9-8e82-42da-a3d5-50331ba11664

匹配成功

a5544b6d-4d22-4eb6-92ed-4bef946f6fa6

69203001-0440-48e5-8247-f8775bc32cad

55a6dde9-8e82-42da-a3d5-50331ba11664

加入【2】人

匹配开始

放入临时匹配队列11a6ae84-ba43-495a-af45-87f753424281

放入临时匹配队列37af5d04-e12e-4cf8-8685-738047984051

更多推荐

java游戏匹配

本文发布于:2024-03-13 15:38:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1734301.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:游戏   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!