AI: removed outdated AIMinimax project (#7075), removed some useless player classes, code and config files, improved docs;

This commit is contained in:
Oleg Agafonov 2024-01-15 03:14:42 +04:00
parent 6ac2f44cc1
commit 08b99fcbf7
40 changed files with 103 additions and 2462 deletions

View file

@ -38,7 +38,7 @@ public class MulliganTestBase {
private final int freeMulligans;
private final List<Step> steps = new ArrayList<>();
private PlayerProxy player1;
private MulliganStubPlayer player1;
public MulliganScenarioTest(MulliganType mulliganType, int freeMulligans) {
this.mulliganType = mulliganType;
@ -73,13 +73,13 @@ public class MulliganTestBase {
options.skipInitShuffling = true;
game.setGameOptions(options);
this.player1 = new PlayerProxy("p1", ONE);
this.player1 = new MulliganStubPlayer("p1", ONE);
player1.setSteps(steps);
Deck deck1 = generateDeck(player1.getId(), 40);
game.loadCards(deck1.getCards(), player1.getId());
game.addPlayer(player1, deck1);
PlayerProxy player2 = new PlayerProxy("p2", ONE);
MulliganStubPlayer player2 = new MulliganStubPlayer("p2", ONE);
Deck deck2 = generateDeck(player2.getId(), 40);
game.loadCards(deck2.getCards(), player2.getId());
game.addPlayer(player2, deck2);
@ -164,12 +164,12 @@ public class MulliganTestBase {
List<UUID> discardBottom(int count);
}
static class PlayerProxy extends StubPlayer {
static class MulliganStubPlayer extends StubPlayer {
private List<Step> steps = null;
private int current = 0;
public PlayerProxy(String name, RangeOfInfluence range) {
public MulliganStubPlayer(String name, RangeOfInfluence range) {
super(name, range);
}

View file

@ -11,10 +11,8 @@ import mage.target.Target;
import mage.target.TargetCard;
/**
* @author JayDi85
*/
/**
* AI: helper class for tests
* <p>
* Mock class to inject test player support in the inner choice calls, e.g. in PlayerImpl. If you
* want to set up inner choices then override it here.
* <p>
@ -29,9 +27,11 @@ import mage.target.TargetCard;
* <p>
* If you implement set up of random results for tests (die roll, flip coin, etc) and want to support AI tests
* (same random results in simulated games) then override same methods in SimulatedPlayer2 too
*
* @author JayDi85
*/
public class TestComputerPlayer extends ComputerPlayer {
public final class TestComputerPlayer extends ComputerPlayer {
private TestPlayer testPlayerLink;

View file

@ -11,12 +11,14 @@ import mage.target.Target;
import mage.target.TargetCard;
/**
* AI: helper class for tests
* <p>
* Copied-pasted methods from TestComputerPlayer, see docs in there
*
* @author JayDi85
*/
public class TestComputerPlayer7 extends ComputerPlayer7 {
public final class TestComputerPlayer7 extends ComputerPlayer7 {
private TestPlayer testPlayerLink;

View file

@ -11,12 +11,14 @@ import mage.target.Target;
import mage.target.TargetCard;
/**
* AI: helper class for tests
* <p>
* Copied-pasted methods from TestComputerPlayer, see docs in there
*
* @author JayDi85
*/
public class TestComputerPlayerMonteCarlo extends ComputerPlayerMCTS {
public final class TestComputerPlayerMonteCarlo extends ComputerPlayerMCTS {
private TestPlayer testPlayerLink;

View file

@ -63,6 +63,8 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* Basic implementation of testable player
*
* @author BetaSteward_at_googlemail.com
* @author Simown
* @author JayDi85

View file

@ -1,95 +0,0 @@
package org.mage.test.serverside;
import mage.cards.Card;
import mage.cards.Sets;
import mage.cards.decks.Deck;
import mage.constants.ColoredManaSymbol;
import mage.constants.MultiplayerAttackOption;
import mage.constants.RangeOfInfluence;
import mage.game.Game;
import mage.game.GameException;
import mage.game.GameOptions;
import mage.game.TwoPlayerDuel;
import mage.game.mulligan.MulliganType;
import mage.player.ai.ComputerPlayer;
import mage.players.Player;
import mage.players.PlayerType;
import mage.util.RandomUtil;
import org.junit.Ignore;
import org.junit.Test;
import org.mage.test.serverside.base.MageTestBase;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
* @author ayratn
*/
public class PlayGameTest extends MageTestBase {
private static final List<String> colorChoices = new ArrayList<>(Arrays.asList("bu", "bg", "br", "bw", "ug", "ur", "uw", "gr", "gw", "rw", "bur", "buw", "bug", "brg", "brw", "bgw", "wur", "wug", "wrg", "rgu"));
private static final int DECK_SIZE = 40;
@Ignore
@Test
public void playOneGame() throws GameException, FileNotFoundException, IllegalArgumentException {
Game game = new TwoPlayerDuel(MultiplayerAttackOption.LEFT, RangeOfInfluence.ALL, MulliganType.GAME_DEFAULT.getMulligan(0), 60, 20, 7);
Player computerA = createPlayer("ComputerA", PlayerType.COMPUTER_MINIMAX_HYBRID);
// Player playerA = createPlayer("ComputerA", "Computer - mad");
// Deck deck = Deck.load(Sets.loadDeck("RB Aggro.dck"));
Deck deck = generateRandomDeck();
if (deck.getMaindeckCards().size() < DECK_SIZE) {
throw new IllegalArgumentException("Couldn't load deck, deck size = " + deck.getMaindeckCards().size() + ", but must be " + DECK_SIZE);
}
game.addPlayer(computerA, deck);
game.loadCards(deck.getCards(), computerA.getId());
Player computerB = createPlayer("ComputerB", PlayerType.COMPUTER_MINIMAX_HYBRID);
// Player playerB = createPlayer("ComputerB", "Computer - mad");
// Deck deck2 = Deck.load(Sets.loadDeck("RB Aggro.dck"));
Deck deck2 = generateRandomDeck();
if (deck2.getMaindeckCards().size() < DECK_SIZE) {
throw new IllegalArgumentException("Couldn't load deck, deck size = " + deck2.getMaindeckCards().size() + ", but must be " + DECK_SIZE);
}
game.addPlayer(computerB, deck2);
game.loadCards(deck2.getCards(), computerB.getId());
// parseScenario("scenario1.txt");
// game.cheat(playerA.getId(), commandsA);
// game.cheat(playerA.getId(), libraryCardsA, handCardsA, battlefieldCardsA, graveyardCardsA);
// game.cheat(playerB.getId(), commandsB);
// game.cheat(playerB.getId(), libraryCardsB, handCardsB, battlefieldCardsB, graveyardCardsB);
//boolean testMode = false;
boolean testMode = true;
long t1 = System.nanoTime();
GameOptions options = new GameOptions();
options.testMode = true;
game.setGameOptions(options);
game.start(computerA.getId());
long t2 = System.nanoTime();
logger.info("Winner: " + game.getWinner());
logger.info("Time: " + (t2 - t1) / 1000000 + " ms");
/*if (!game.getWinner().equals("Player ComputerA is the winner")) {
throw new RuntimeException("Lost :(");
}*/
}
private Deck generateRandomDeck() {
String selectedColors = colorChoices.get(RandomUtil.nextInt(colorChoices.size())).toUpperCase(Locale.ENGLISH);
List<ColoredManaSymbol> allowedColors = new ArrayList<>();
logger.info("Building deck with colors: " + selectedColors);
for (int i = 0; i < selectedColors.length(); i++) {
char c = selectedColors.charAt(i);
allowedColors.add(ColoredManaSymbol.lookup(c));
}
List<Card> cardPool = Sets.generateRandomCardPool(45, allowedColors);
return ComputerPlayer.buildDeck(DECK_SIZE, cardPool, allowedColors);
}
}

View file

@ -1,14 +1,16 @@
package org.mage.test.serverside.tournament;
import mage.constants.RangeOfInfluence;
import mage.game.tournament.Round;
import mage.game.tournament.TournamentPairing;
import mage.game.tournament.TournamentPlayer;
import mage.game.tournament.pairing.RoundPairings;
import mage.game.tournament.pairing.SwissPairingMinimalWeightMatching;
import mage.players.Player;
import mage.players.StubPlayer;
import mage.util.RandomUtil;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.stub.PlayerStub;
import org.mage.test.stub.TournamentStub;
import java.util.ArrayList;
@ -21,15 +23,19 @@ import java.util.Set;
*/
public class SwissPairingMinimalWeightMatchingTest {
private Player createTourneyPlayer(int number) {
return new StubPlayer("Tourney player " + number, RangeOfInfluence.ALL);
}
@Test
public void FourPlayersSecondRoundTest() {
// 1 > 3
// 2 > 4
TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player1 = new TournamentPlayer(createTourneyPlayer(1), null);
TournamentPlayer player2 = new TournamentPlayer(createTourneyPlayer(2), null);
TournamentPlayer player3 = new TournamentPlayer(createTourneyPlayer(3), null);
TournamentPlayer player4 = new TournamentPlayer(createTourneyPlayer(3), null);
List<TournamentPlayer> players = new ArrayList<>();
players.add(player4);
players.add(player2);
@ -68,10 +74,10 @@ public class SwissPairingMinimalWeightMatchingTest {
// 1 > 2
// 3 > 4
TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player3 = new TournamentPlayer(createTourneyPlayer(3), null);
TournamentPlayer player2 = new TournamentPlayer(createTourneyPlayer(2), null);
TournamentPlayer player4 = new TournamentPlayer(createTourneyPlayer(4), null);
TournamentPlayer player1 = new TournamentPlayer(createTourneyPlayer(1), null);
List<TournamentPlayer> players = new ArrayList<>();
players.add(player4);
players.add(player2);
@ -116,10 +122,10 @@ public class SwissPairingMinimalWeightMatchingTest {
// 2 > 4
// 4 left the tournament
TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player1 = new TournamentPlayer(createTourneyPlayer(1), null);
TournamentPlayer player2 = new TournamentPlayer(createTourneyPlayer(2), null);
TournamentPlayer player3 = new TournamentPlayer(createTourneyPlayer(3), null);
TournamentPlayer player4 = new TournamentPlayer(createTourneyPlayer(4), null);
List<TournamentPlayer> players = new ArrayList<>();
//players.add(player4); -- player 4 is not active
players.add(player2);
@ -159,11 +165,11 @@ public class SwissPairingMinimalWeightMatchingTest {
// 2 > 3
// 4
TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player5 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player1 = new TournamentPlayer(createTourneyPlayer(1), null);
TournamentPlayer player2 = new TournamentPlayer(createTourneyPlayer(2), null);
TournamentPlayer player3 = new TournamentPlayer(createTourneyPlayer(3), null);
TournamentPlayer player4 = new TournamentPlayer(createTourneyPlayer(4), null);
TournamentPlayer player5 = new TournamentPlayer(createTourneyPlayer(5), null);
List<TournamentPlayer> players = new ArrayList<>();
players.add(player4);
players.add(player2);
@ -214,11 +220,11 @@ public class SwissPairingMinimalWeightMatchingTest {
// 5 left the tournament
TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player5 = new TournamentPlayer(new PlayerStub(), null);
TournamentPlayer player1 = new TournamentPlayer(createTourneyPlayer(1), null);
TournamentPlayer player2 = new TournamentPlayer(createTourneyPlayer(2), null);
TournamentPlayer player3 = new TournamentPlayer(createTourneyPlayer(3), null);
TournamentPlayer player4 = new TournamentPlayer(createTourneyPlayer(4), null);
TournamentPlayer player5 = new TournamentPlayer(createTourneyPlayer(5), null);
List<TournamentPlayer> players = new ArrayList<>();
//players.add(player5); -- player 5 is not active
players.add(player4);
@ -268,7 +274,7 @@ public class SwissPairingMinimalWeightMatchingTest {
List<TournamentPlayer> players = new ArrayList<>();
for (int i = 0; i < playersCount; i++) {
players.add(new TournamentPlayer(new PlayerStub(), null));
players.add(new TournamentPlayer(createTourneyPlayer(i + 1), null));
}
List<TournamentPairing> playedPairs = new ArrayList<>();

File diff suppressed because it is too large Load diff