Skip to content

Commit 3590ab1

Browse files
2 parents 8b7dc1c + 001fdb3 commit 3590ab1

11 files changed

+297
-88
lines changed

src/controllers/Manager.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ public static Input getInput() {
150150
}
151151

152152
public static String getAIMove() {
153-
playingMatch.getPlayer2().decide();
154153
return playingMatch.getPlayer2().getDecision();
155154
}
156155

@@ -190,7 +189,7 @@ public static void setMatchData(boolean isAIMode, int gameMode, String username)
190189
if (!isOpponentNull()) {
191190
Account opponent;
192191
if (isAIMode) {
193-
opponent = Account.getAIAccount();
192+
opponent = AI.getAIAccount();
194193
}
195194
else
196195
opponent = Account.getAccounts().get(username);
@@ -211,6 +210,9 @@ public static void setMatchData(boolean isAIMode, int gameMode, String username)
211210
opponentUsername = "";
212211
}
213212
playingMatch.setAIMode(isAIMode);
213+
if (isAIMode) {
214+
((AI) opponent).setMatch(playingMatch);
215+
}
214216
}
215217
}
216218

@@ -335,4 +337,8 @@ public static List<UsableItem> getItem(List<Card> cards) {
335337
card -> (UsableItem) card)
336338
.collect(Collectors.toList());
337339
}
340+
341+
public static void setMapFlags(int result) {
342+
playingMatch.setFlagsInMap(result);
343+
}
338344
}

src/models/AI.java

+197-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,201 @@
11
package models;
22

3-
public class AI {
3+
import controllers.Manager;
4+
import models.map.Cell;
5+
import models.map.Map;
6+
import models.match.Match;
7+
import views.Output;
48

9+
import java.util.*;
10+
11+
public class AI extends Account {
12+
13+
Match match;
14+
private Queue<String> decisions = new LinkedList<>();
15+
/// state[distanceToHero][oppHealth][myHealth][action]
16+
int[][][][] state = new int[10][10][10][3];
17+
private final int ACTIONS_NUMBER = 3;
18+
int[] lastState = new int[3];
19+
20+
public AI(String username, String password) {
21+
super(username, password);
22+
}
23+
24+
private int distanceToOppHero() {
25+
int distance = 0;
26+
try {
27+
distance = Cell.manhattanDistance(match.getPlayer1().getHero().getCell(),
28+
match.getPlayer2().getHero().getCell()) - 1;
29+
if (distance >= 9)
30+
distance = 9;
31+
} catch (Exception ignored) {
32+
Output.err("Ignored in AI");
33+
}
34+
return distance;
35+
}
36+
37+
private int getHealth() {
38+
int health = 0;
39+
try {
40+
health = match.getPlayer2().getHero().getCurrentHealth() / 5;
41+
if (health >= 9)
42+
health = 9;
43+
} catch (Exception ignored) {
44+
Output.err("Ignored in AI");
45+
}
46+
return health;
47+
}
48+
49+
private int getOppHealth() {
50+
int health = 0;
51+
try {
52+
health = match.getPlayer1().getHero().getCurrentHealth() / 5;
53+
if (health >= 9)
54+
health = 9;
55+
} catch (Exception ignored) {
56+
Output.err("Ignored in AI");
57+
}
58+
return health;
59+
}
60+
61+
int t = 0;
62+
63+
public void decide() {
64+
reward();
65+
int distance = lastState[0] = distanceToOppHero();
66+
int myHealth = lastState[1] = getHealth();
67+
int oppHealth = lastState[2] = getOppHealth();
68+
int max = 0;
69+
for (int i = 0; i < ACTIONS_NUMBER; i++) {
70+
max = Math.max(max, state[distance][oppHealth][myHealth][i]);
71+
}
72+
if (max < 100) {
73+
chooseAction(new Random().nextInt() % 3);
74+
return;
75+
}
76+
for (int i = 0; i < ACTIONS_NUMBER; i++) {
77+
if (state[distance][oppHealth][myHealth][i] == max) {
78+
chooseAction(i);
79+
return;
80+
}
81+
}
82+
// if (t % 2 == 0)
83+
// this.decision = "show hand";
84+
// else
85+
// this.decision = "end turn";
86+
// t = (t + 1) % 2;
87+
}
88+
89+
private void reward() {
90+
91+
}
92+
93+
private void chooseAction(int action) {
94+
switch (action) {
95+
case 0:
96+
insertCard();
97+
break;
98+
case 1:
99+
moveCard();
100+
break;
101+
case 2:
102+
attack();
103+
break;
104+
default:
105+
decisions.add("end turn");
106+
}
107+
}
108+
109+
private void attack() {
110+
selectCard();
111+
try {
112+
decisions.add("attack " + match.getPlayer1().getHero().getID());
113+
} catch (Player.HeroDeadException e) {
114+
Output.err("ignored in attack in AI");
115+
}
116+
}
117+
118+
private void insertCard() {
119+
decisions.add("insert " + match.getPlayer2().getHand().getCards().get(Match.random(0, 4)).getID() + " in " +
120+
Match.random(1, Map.ROW_NUMBER) + ", " + Match.random(1, Map.COLUMN_NUMBER));
121+
}
122+
123+
private void selectCard() {
124+
try {
125+
decisions.add("select " + match.getPlayer2().getHero().getID());
126+
} catch (Player.HeroDeadException e) {
127+
Output.err("ignored in insertCard in AI");
128+
}
129+
}
130+
131+
private void moveCard() {
132+
selectCard();
133+
decisions.add("move to " + Match.random(1, Map.ROW_NUMBER) + ", " + Match.random(1, Map.COLUMN_NUMBER));
134+
}
135+
136+
137+
public String getDecision() {
138+
if (match.getPlayer2().getMana() < 2)
139+
return "end turn";
140+
if (decisions.size() == 0)
141+
decide();
142+
return decisions.poll();
143+
}
144+
145+
public void setMatch(Match playingMatch) {
146+
this.match = playingMatch;
147+
}
148+
149+
public static AI getAIAccount() {
150+
AI aiAccount = new AI("AI", "password");
151+
try {
152+
Shop.getInstance().buy(aiAccount, "rostam");
153+
Shop.getInstance().buy(aiAccount, "fire dragon");
154+
Shop.getInstance().buy(aiAccount, "eagle");
155+
Shop.getInstance().buy(aiAccount, "Hog Head Demon");
156+
Shop.getInstance().buy(aiAccount, "Persian Swordsman");
157+
Shop.getInstance().buy(aiAccount, "Persian Horse Rider");
158+
Shop.getInstance().buy(aiAccount, "Persian Horse Rider");
159+
Shop.getInstance().buy(aiAccount, "Persian Horse Rider");
160+
Shop.getInstance().buy(aiAccount, "Persian Horse Rider");
161+
Shop.getInstance().buy(aiAccount, "Persian Champion");
162+
Shop.getInstance().buy(aiAccount, "Persian Champion");
163+
Shop.getInstance().buy(aiAccount, "Turan Archer");
164+
Shop.getInstance().buy(aiAccount, "Turan Archer");
165+
Shop.getInstance().buy(aiAccount, "Turan Wand");
166+
Shop.getInstance().buy(aiAccount, "Turan Wand");
167+
Shop.getInstance().buy(aiAccount, "persian horse rider");
168+
Shop.getInstance().buy(aiAccount, "persian horse rider");
169+
Shop.getInstance().buy(aiAccount, "persian horse rider");
170+
Shop.getInstance().buy(aiAccount, "persian horse rider");
171+
Shop.getInstance().buy(aiAccount, "persian horse rider");
172+
Shop.getInstance().buy(aiAccount, "persian horse rider");
173+
aiAccount.addDeck(new Deck("AIDeck"));
174+
Deck deck = aiAccount.getDeck("AIDeck");
175+
Manager.addCardToDeck(aiAccount, deck, "rostam");
176+
Manager.addCardToDeck(aiAccount, deck, "fire dragon");
177+
Manager.addCardToDeck(aiAccount, deck, "eagle");
178+
Manager.addCardToDeck(aiAccount, deck, "Hog Head Demon");
179+
Manager.addCardToDeck(aiAccount, deck, "Persian Swordsman");
180+
Manager.addCardToDeck(aiAccount, deck, "Persian Horse Rider");
181+
Manager.addCardToDeck(aiAccount, deck, "Persian Horse Rider");
182+
Manager.addCardToDeck(aiAccount, deck, "Persian Horse Rider");
183+
Manager.addCardToDeck(aiAccount, deck, "Persian Horse Rider");
184+
Manager.addCardToDeck(aiAccount, deck, "Persian Champion");
185+
Manager.addCardToDeck(aiAccount, deck, "Persian Champion");
186+
Manager.addCardToDeck(aiAccount, deck, "Turan Archer");
187+
Manager.addCardToDeck(aiAccount, deck, "Turan Archer");
188+
Manager.addCardToDeck(aiAccount, deck, "Turan Wand");
189+
Manager.addCardToDeck(aiAccount, deck, "Turan Wand");
190+
Manager.addCardToDeck(aiAccount, deck, "persian horse rider");
191+
Manager.addCardToDeck(aiAccount, deck, "persian horse rider");
192+
Manager.addCardToDeck(aiAccount, deck, "persian horse rider");
193+
Manager.addCardToDeck(aiAccount, deck, "persian horse rider");
194+
Manager.addCardToDeck(aiAccount, deck, "persian horse rider");
195+
aiAccount.setMainDeck(deck);
196+
} catch (Exception e) {
197+
Output.err(e);
198+
}
199+
return aiAccount;
200+
}
5201
}

src/models/Account.java

+1-52
Original file line numberDiff line numberDiff line change
@@ -17,58 +17,7 @@ public class Account {
1717
private int drake = 15000;
1818
private int winCount = 0;
1919

20-
public static Account getAIAccount() {
21-
Account account = new Account("AI", "password");
22-
try {
23-
Shop.getInstance().buy(account, "rostam");
24-
Shop.getInstance().buy(account, "fire dragon");
25-
Shop.getInstance().buy(account, "eagle");
26-
Shop.getInstance().buy(account, "Hog Head Demon");
27-
Shop.getInstance().buy(account, "Persian Swordsman");
28-
Shop.getInstance().buy(account, "Persian Horse Rider");
29-
Shop.getInstance().buy(account, "Persian Horse Rider");
30-
Shop.getInstance().buy(account, "Persian Horse Rider");
31-
Shop.getInstance().buy(account, "Persian Horse Rider");
32-
Shop.getInstance().buy(account, "Persian Champion");
33-
Shop.getInstance().buy(account, "Persian Champion");
34-
Shop.getInstance().buy(account, "Turan Archer");
35-
Shop.getInstance().buy(account, "Turan Archer");
36-
Shop.getInstance().buy(account, "Turan Wand");
37-
Shop.getInstance().buy(account, "Turan Wand");
38-
Shop.getInstance().buy(account, "persian horse rider");
39-
Shop.getInstance().buy(account, "persian horse rider");
40-
Shop.getInstance().buy(account, "persian horse rider");
41-
Shop.getInstance().buy(account, "persian horse rider");
42-
Shop.getInstance().buy(account, "persian horse rider");
43-
Shop.getInstance().buy(account, "persian horse rider");
44-
account.addDeck(new Deck("AIDeck"));
45-
Deck deck = account.getDeck("AIDeck");
46-
Manager.addCardToDeck(account, deck, "rostam");
47-
Manager.addCardToDeck(account, deck, "fire dragon");
48-
Manager.addCardToDeck(account, deck, "eagle");
49-
Manager.addCardToDeck(account, deck, "Hog Head Demon");
50-
Manager.addCardToDeck(account, deck, "Persian Swordsman");
51-
Manager.addCardToDeck(account, deck, "Persian Horse Rider");
52-
Manager.addCardToDeck(account, deck, "Persian Horse Rider");
53-
Manager.addCardToDeck(account, deck, "Persian Horse Rider");
54-
Manager.addCardToDeck(account, deck, "Persian Horse Rider");
55-
Manager.addCardToDeck(account, deck, "Persian Champion");
56-
Manager.addCardToDeck(account, deck, "Persian Champion");
57-
Manager.addCardToDeck(account, deck, "Turan Archer");
58-
Manager.addCardToDeck(account, deck, "Turan Archer");
59-
Manager.addCardToDeck(account, deck, "Turan Wand");
60-
Manager.addCardToDeck(account, deck, "Turan Wand");
61-
Manager.addCardToDeck(account, deck, "persian horse rider");
62-
Manager.addCardToDeck(account, deck, "persian horse rider");
63-
Manager.addCardToDeck(account, deck, "persian horse rider");
64-
Manager.addCardToDeck(account, deck, "persian horse rider");
65-
Manager.addCardToDeck(account, deck, "persian horse rider");
66-
account.setMainDeck(deck);
67-
} catch (Exception e) {
68-
Output.err(e);
69-
}
70-
return account;
71-
}
20+
7221

7322
public int getDrake() {
7423
return drake;

src/models/Player.java

+21-17
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
import models.cards.Attacker;
44
import models.cards.Card;
55
import models.cards.Hero;
6-
import models.cards.Minion;
76
import models.cards.spell.Spell;
87
import models.items.CollectableItem;
8+
import models.items.Flag;
99
import models.items.Item;
1010
import models.map.Cell;
1111
import views.Error;
1212
import views.Input;
1313

1414
import java.util.ArrayList;
15-
import java.util.Collections;
1615
import java.util.List;
1716
import java.util.stream.Collectors;
1817

@@ -21,13 +20,12 @@ public class Player {
2120
private Deck deck;
2221
private Hand hand = new Hand();
2322
private Card selectedCard;
24-
private int flags;
23+
private int flagsNumber;
2524
private List<Item> collectedItems = new ArrayList<>();
2625
private ArrayList<Card> graveYard;
2726
private ArrayList<Attacker> activeCards = new ArrayList<>();
2827
private int mana;
2928
private Input input;
30-
private String decision;
3129
private CollectableItem selectedCollectableItem;
3230

3331
public Account getAccount() {
@@ -51,6 +49,11 @@ public Player(Account account) {
5149
this.setNextCard();
5250
}
5351

52+
public String getDecision() {
53+
AI ai = (AI)account;
54+
return ai.getDecision();
55+
}
56+
5457
public ArrayList<Card> getGraveYard() {
5558
return graveYard;
5659
}
@@ -95,7 +98,7 @@ public Deck getDeck() {
9598
}
9699

97100
public void incrementFlags() {
98-
this.flags += flags;
101+
this.flagsNumber += flagsNumber;
99102
}
100103

101104
public void setCollectedItems(Item collectedItems) {
@@ -149,18 +152,6 @@ public Attacker getActiveCard(String cardID) throws Collection.CardNotFoundExcep
149152
throw new Collection.CardNotFoundException("Card not found with this ID");
150153
}
151154
}
152-
int t = 0;
153-
public void decide() {
154-
if (t % 2 == 0)
155-
this.decision = "show hand";
156-
else
157-
this.decision = "end turn";
158-
t = (t + 1) % 2;
159-
}
160-
161-
public String getDecision() {
162-
return decision;
163-
}
164155

165156
public void selectCard(Card card) {
166157
this.selectedCard = card;
@@ -199,6 +190,19 @@ public boolean collectableItemIsSelected() {
199190
return selectedCollectableItem != null;
200191
}
201192

193+
public boolean hasFlag() {
194+
return this.flagsNumber > 0;
195+
}
196+
197+
public List<Flag> getFlags() {
198+
return activeCards.stream().map(Attacker::getFlag).collect(Collectors.toList());
199+
}
200+
201+
public int getFlagsNumber() {
202+
return flagsNumber;
203+
}
204+
205+
202206
public static class NotEnoughManaException extends Exception {
203207
public NotEnoughManaException(String message) {
204208
super(message);

0 commit comments

Comments
 (0)