wip: add simple ai and a full game test with ai

This commit is contained in:
2021-06-04 07:47:54 +02:00
parent 0eaa0c5ea1
commit dce1aed9ad
3 changed files with 214 additions and 0 deletions

View File

@ -0,0 +1,97 @@
package uulm.teamname.marvelous.gamelibrary.gamelogic;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import uulm.teamname.marvelous.gamelibrary.ai.AI;
import uulm.teamname.marvelous.gamelibrary.entities.EntityType;
import uulm.teamname.marvelous.gamelibrary.events.Event;
import uulm.teamname.marvelous.gamelibrary.json.JSON;
import uulm.teamname.marvelous.gamelibrary.messages.*;
import uulm.teamname.marvelous.gamelibrary.messages.client.*;
import uulm.teamname.marvelous.gamelibrary.messages.server.*;
import uulm.teamname.marvelous.gamelibrary.requests.*;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.*;
class AITest extends BaseGameLogicTest {
private static JSON json;
private static ExecutorService executor;
private static GameInstance server;
private static AI clientA;
private static AI clientB;
@BeforeAll
static void setUp() {
generate();
json = new JSON(characterConfig);
executor = new SimpleErrorSensitiveThreadPoolExecutor();
server = new GameInstance(partyConfig, characterConfig, scenarioConfig);
clientA = new AI(EntityType.P1, partyConfig, characterConfig, scenarioConfig);
clientB = new AI(EntityType.P2, partyConfig, characterConfig, scenarioConfig);
}
@Test
void main() throws InterruptedException {
serverSend(server.startGame(player1Selection, player2Selection).toArray(new Event[0]));
Thread.sleep(1000);
System.out.println(server.toString());
}
private void clientSend(Request[] requests) {
RequestMessage message = new RequestMessage();
message.messages = requests;
Optional<String> data = json.stringify(message);
if(data.isPresent()) {
executor.submit(() -> serverReceive(data.get()));
}
}
private void clientReceive(String data) {
Optional<BasicMessage> message = json.parse(data);
if(message.isPresent()) {
Optional<List<Request>> resultA = clientA.handle(((EventMessage)message.get()).messages);
Optional<List<Request>> resultB = clientB.handle(((EventMessage)message.get()).messages);
if(resultA.isPresent()) {
executor.submit(() -> clientSend(resultA.get().toArray(new Request[0])));
}
if(resultB.isPresent()) {
executor.submit(() -> clientSend(resultB.get().toArray(new Request[0])));
}
}
}
private void serverSend(Event[] events) {
EventMessage message = new EventMessage();
message.messages = events;
Optional<String> data = json.stringify(message);
if(data.isPresent()) {
executor.submit(() -> clientReceive(data.get()));
}
}
private void serverReceive(String data) {
Optional<BasicMessage> message = json.parse(data);
if(message.isPresent()) {
Optional<List<Event>> result = server.checkRequestsAndApply(((RequestMessage)message.get()).messages);
if(result.isPresent()) {
executor.submit(() -> serverSend(result.get().toArray(new Event[0])));
}
}
}
}

View File

@ -0,0 +1,30 @@
package uulm.teamname.marvelous.gamelibrary.gamelogic;
import java.util.concurrent.*;
public final class SimpleErrorSensitiveThreadPoolExecutor extends ThreadPoolExecutor {
public SimpleErrorSensitiveThreadPoolExecutor() {
super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
}
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Future<?> future = (Future<?>) r;
if (future.isDone()) {
future.get();
}
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
if (t != null) {
t.printStackTrace();
}
}
}