Dokumentacja gry Karciane Potyczki Magów

20.01.2013 - Kuba Kowalski
TrudnośćTrudność

Przykładowe boty

Poniżej, w czterech językach programowania, zamieszczone zostały kody źródłowe przykładowego bota. Potrafi on grać we wszystkie tryby rozgrywki i we wszystkie tak samo źle. Gra w losowy sposób pokazując zasady działania systemu i obsługę protokołu komunikacji. Bot ten jest dostępny w systemie pod nazwą KPM_DocumentationMagician.

Strategia działania przedstawionego bota jest następująca:

  1. Na początku pobiera informacje o rozmiarze talii oraz ilości zasobów.
  2. Kupuje losowe karty po jednej sztuce dbając o to, aby wystarczyło pieniędzy na kupienie reszty talii.
  3. W każdej turze pobiera dane o stanie swojego maga i kartach oraz losuje jedną z kart których może użyć.
  4. Jeśli takiej karty nie ma to wyrzuca losową kartę z ręki i kończy turę.
  5. Jeśli jest, to sprawdza czy karta której chce użyć ma efekt pozytywny czy nie.
  6. Kartę pozytywną rzuca na losowego sojusznika, zaś negatywną na losowego przeciwnika, po czym kończy turę.

Python
Pokaż/ukryj kod źródłowy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import random
 
deck = []
decksize = int(raw_input('Cards\n'))
for x in range(decksize):
   c = raw_input().split(',')
   deck.append( map(int, (c[0]+c[2]+c[3]).split()) )
print '#PRINT Pelna talia:', deck
 
mydeck = []
while True:
   cardsleft = int(raw_input('CardsLeft\n'))
   if cardsleft is 0:      
      break
   resources = int(raw_input('ResourcesLeft\n'))
   maxres = resources - cardsleft + 1
   cards = [c for c in deck if c[1] <= maxres]
   card = random.choice(cards)[0]
   mydeck.append(card)
   print "Buy", card
   ok = raw_input()
 
print "#PRINT Kupione karty:", mydeck
print "#END"
 
players = int(raw_input('NumberOfPlayers\n'))
myid = int(raw_input('Identifier\n'))
if (raw_input('GameMode\n').startswith('TeamDuel')):
   allies = [myid, (myid+1)%4+1]
   axis = [(myid+0)%4+1, (myid+2)%4+1]
else:
   allies = [myid]
   axis = range(1, players+1)
   axis.remove(myid)
 
while True:
   print 'Magicians'
   magicians = []
   for i in range(players):
      magicians.append(raw_input())
   me = magicians[myid-1].split(',')
   state = map(int, me[1].split())
   hand = map(int, me[2].split())
   print '#PRINT Stan maga:', state
   print '#PRINT Stan reki:', hand
   
   goodcards = []
   for c in [deck[c-1] for c in hand]:
      ok = True
      for i in range(6):
         if c[i+2] is not 0 and state[i] + c[i+2] < 0:
            ok = False
            break
      if ok: goodcards.append(c)
   print '#PRINT Mozliwe do rzucenia karty to', [c[0] for c in goodcards]
 
   if not goodcards:
      print 'Throw', random.choice(hand)
      print '#END'
      continue
 
   choice = random.choice(goodcards)
   if sum(choice[7:]) >= 0:
      target = random.choice(allies)
   else:
      target = random.choice(axis)
   print 'Cast', choice[0], target
   print '#END'


C++
Pokaż/ukryj kod źródłowy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int main ()
{
   srand ( time(NULL) );
   vector<vector<int> > deck;
   int decksize;
   cout << "Cards" << endl;
   cin >> decksize;
 
   string row;
   getline(cin, row);
   cout << "#PRINT Pelna talia:";
   for (int x = 0; x < decksize; x++)
   {
      int n;
      vector<int> card;
      string part;
      getline(cin, row);
      istringstream rowstream( row );
      getline(rowstream, part, ',');
      istringstream subpart1(part);
      for (int i=0; i < 2; i++) { subpart1 >> n; card.push_back(n);}
      getline(rowstream, part, ',');
      getline(rowstream, part, ',');
      istringstream subpart2(part);
      for (int i=0; i < 6; i++) { subpart2 >> n; card.push_back(n);}
      getline(rowstream, part, ',');
      istringstream subpart3(part);
      for (int i=0; i < 7; i++) { subpart3 >> n; card.push_back(n);}
      deck.push_back(card);
      
      cout << " [";
         for (int i = 0; i < card.size(); i++)
            cout << " " << card[i];
      cout << " ]";
   }
   cout << endl;
 
   vector<int> mydeck;
   while (true)
   {
      int cardsleft, resources, maxres, card, ok;
      vector<int> cards;
      cout << "CardsLeft" << endl;
      cin >> cardsleft;
      if (cardsleft == 0)
         break;
      cout << "ResourcesLeft" << endl;
      cin >> resources;
      maxres = resources - cardsleft + 1;
      for(int i = 0; i < deck.size(); i++)
         if (deck[i][1] <= maxres)
            cards.push_back(deck[i][0]);
      card = cards[rand()%cards.size()];
      mydeck.push_back(card);
      cout << "Buy " << card << endl;
      cin >> ok;
   }
   cout << "#PRINT Kupione karty: [";
   for (int i = 0; i < mydeck.size(); i++)
      cout << " " << mydeck[i];
   cout << " ]" << endl;   
   cout << "#END" << endl;
 
   int players, myid;
   cout << "NumberOfPlayers" << endl;
   cin >> players;
   cout << "Identifier" << endl;
   cin >> myid;
   vector<int> allies, axis;
   cout << "GameMode" << endl;
   string mode;
   getline(cin, mode);
   getline(cin, mode);
   if (mode.find("TeamDuel") == 0)
   {cout << "#PRINT TD" << endl;
      allies.push_back(myid); allies.push_back((myid+1)%4+1);
      axis.push_back((myid+0)%4+1); axis.push_back((myid+2)%4+1);
   }
   else
   { cout << "#PRINT NTD" << endl;
      allies.push_back(myid);
      for (int i = 1; i <= players; i++) if (i != myid) axis.push_back(i);
   }
 
   while (true)
   {
      vector<string> magicians;
      cout << "Magicians" << endl;
      for (int i = 0; i < players; i++)
      {
         string m;
         getline(cin, m);
         magicians.push_back(m);
      }
      
      int n;
      string part;
      vector<int> state, hand;
      istringstream me(magicians[myid-1]);
      getline(me, part, ',');
      getline(me, part, ',');
      istringstream subpart4(part);
      for (int i=0; i < 6; i++) { subpart4 >> n; state.push_back(n);}
      getline(me, part);
      istringstream subpart5(part);
      subpart5.get();
      while (subpart5.peek() > 0)
      {
         subpart5 >> n; hand.push_back(n);
         subpart5.get();
      }
      cout << "#PRINT Stan maga: [";
      for (int i = 0; i < state.size(); i++)
         cout << " " << state[i];
      cout << " ]" << endl;
      cout << "#PRINT Stan reki: [";
      for (int i = 0; i < hand.size(); i++)
         cout << " " << hand[i];
      cout << " ]" << endl;
      
      vector<vector<int> > goodcards;
      for (int j = 0; j < hand.size(); j++)
      {
         vector<int> c = deck[hand[j]-1];
         bool ok = true;
         for (int i = 0; i < 6; i++)
         {
            if (c[i+2] != 0 && state[i] + c[i+2] < 0)
            {
               ok = false;
               break;
            }
         }
         if (ok) goodcards.push_back(c);
      }
      cout << "#PRINT Mozliwe do rzucenia karty to";
      for (int i = 0; i < goodcards.size(); i++)
      {
         cout << " [";
         for (int j = 0; j < goodcards[i].size(); j++)
            cout << " " << goodcards[i][j];
         cout << " ]";
      }
      cout << endl;
      
      if (goodcards.size() == 0)
      {
         cout << "Throw " << hand[rand()%hand.size()] << endl;
         cout << "#END" << endl;
         continue;
      }
      
      vector<int> choice = goodcards[rand()%goodcards.size()];
      int sum = 0, target;
      for (int i = 8; i < choice.size(); i++) sum += choice[i];
      if (sum > 0)
         target = allies[rand()%allies.size()];
      else
         target = axis[rand()%axis.size()];
      cout << "Cast " << choice[0] << " " << target << endl;
      cout << "#END" << endl;
   }
}


C#
Pokaż/ukryj kod źródłowy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace MCGBot
{
    //Myslimy obiektowo: karta, to karta, a nie zbiór liczb.
    internal class Card
    {
        private string _originalValue;
 
        public int Id { get; set; }
 
        public int Cost { get; set; }
 
        public string Name { get; set; }
 
        //Tablica z liczbami kolejno: H,M,L,S,P,W
        public int[] Caster { get; private set; }
 
        //Tablica z liczbami kolejno: H,HP,M,L,S,P,W
        public int[] Target { get; private set; }
 
        //1 1 , Fire Arrows , 0 -4 0 0 0 0 , -5 0 0 0 0 0 0
        public Card(string parse)
        {
            _originalValue = parse;
            Caster = new int[6];
            Target = new int[7];
 
            string[] tab = parse.Split(',');
            string idStr = tab[0].Split(' ')[0];
            Id = int.Parse(idStr);
            string costStr = tab[0].Split(' ')[1];
            Cost = int.Parse(costStr);
 
            Name = tab[1].Trim();
 
            string[] c = tab[2].Trim().Split(' ');
            for (int i = 0; i < c.Length; i++)
            {
                Caster[i] = int.Parse(c[i]);
            }
 
            string[] t = tab[3].Trim().Split(' ');
            for (int i = 0; i < t.Length; i++)
            {
                Target[i] = int.Parse(t[i]);
            }
        }
 
        public override string ToString()
        {
            return _originalValue;
        }
    }
 
    internal class Magician
    {
        public Magician(string parse, Card[] fullDeck)
        {
            Hand = new Card[5];
            Stats = new int[6];
 
            string[] tab = parse.Split(',');
 
            //pierwsza wartoscia jest identyfikator.
            Id = int.Parse(tab[0].Trim());
 
            //kolejne to 6 statystyk.
            string[] c = tab[1].Trim().Split(' ');
            for (int i = 0; i < c.Length; i++)
            {
                Stats[i] = int.Parse(c[i]);
            }
 
            //ostatnia wartoscia jest lista kart w rece których moze byc 5 lub mniej.
            string[] h = tab[2].Trim().Split(' ');
            for (int i = 0; i < Hand.Length; i++)
            {
                int card;
                if (h.Length > i && int.TryParse(h[i], out card))
                    Hand[i] = fullDeck.FirstOrDefault(x => x.Id == card);
                else
                    Hand[i] = null;
            }
        }
 
        public int Id { get; set; }
 
        public int[] Stats { get; private set; }
 
        public Card[] Hand { get; private set; }
 
        public override string ToString()
        {
            StringBuilder str = new StringBuilder();
            str.Append("Stan Maga: ");
            for (int i = 0; i < Stats.Length; i++)
            {
                str.Append(Stats[i]);
                str.Append(" ");
            }
            str.Append("Stan Ręki: ");
            for (int i = 0; i < Hand.Length; i++)
            {
                if (Hand[i] != null)
                {
                    str.Append(Hand[i].Id);
                    str.Append(" ");
                }
            }
            return str.ToString();
        }
    }
 
    internal class Program
    {
        private static void Main(string[] args)
        {
            //znak nowej linii dopisuje nam klasa pomocnicza.
            //Zapytanie 'Cards' zwraca w pierwszej linii zwraca pojedynczą liczbę 'n' oznaczającą liczbę
            //wszystkich kart i w 'n' kolejnych liniach zwraca definicje kart.
 
            #region Inicjalizacja kart
 
            Write("Cards");
            int deckSize = ReadInt();
            string[] deckStr = ReadLines(deckSize);
 
            //Tworzymy najprostszy zbiór kart, wszystko zapisujemy jako liczby w tablicy tablic.
            Card[] deck = new Card[deckSize];
            for (int i = 0; i < deckStr.Length; i++)
            {
                string cardStr = deckStr[i];
                deck[i] = new Card(cardStr);
            }
 
            Print("Pełna Talia:");
            foreach (Card card in deck)
            {
                Print(card);
            }
 
            #endregion Inicjalizacja kart
 
            #region Kupowanie kart
 
            //Lista kart, które zakupiliśmy. Początkowo pusta
            List<Card> myDeck = new List<Card>();
 
            //Karty będziemy kupować pseudo-losowo.
            Random random = new Random();
            while (true)
            {
                //Zapytanie, które mówi w pierwszej turze, ile kart pozostało do kupienia.
                Write("CardsLeft");
                int cardsLeft = ReadInt();
 
                //Jeśli pozostało 0 kart do kupienia, kończymy zakupy.
                if (cardsLeft == 0) break;
 
                //Zapytanie, które zwraca pojedynczą liczbę mówiącą o liczbie posiadanych zasobów.
                Write("ResourcesLeft");
                int resources = ReadInt();
 
                //Obliczamy maksymalną liczbę zasobów, które możemy wydać na pojedynczą kartę
                //Ponieważ najtańsza karta kosztuje 1, możemy przyjąć, że dysponujemy wszystkimi
                //zasobami - karty, które musimy jeszcze kupić.
                int maxRes = resources - cardsLeft + 1;
 
                //Wybieramy karty, spośród których możemy robić zakupy.
                Card[] availableCards = deck.Where(x => x.Cost <= maxRes).ToArray();
 
                //Losujemy liczbę z przedziału [0, liczbakart) i wybieramy kartę.
                Card card = availableCards[random.Next(availableCards.Length)];
 
                //Zapytanie, które pozwala zakupić kartę.
                WriteFormat("Buy {0}", card.Id);
 
                //Zwraca liczbę zakupionych kart, jeśli zwróciło 1, jest ok i możemy dodać kartę do talii.
                int ok = ReadInt();
                if (ok == 1) myDeck.Add(card);
            }
 
            Print("Kupione Karty:");
            foreach (Card card in myDeck)
            {
                Print(card);
            }
 
            //Kończymy ruch.
            End();
 
            #endregion Kupowanie kart
 
            #region Poznawanie przeciwników
 
            //Zapytanie o liczbę uczestników gry, zwraca pojedynczą liczbę.
            Write("NumberOfPlayers");
            int players = ReadInt();
 
            //Zapytanie o pozycję tego bota, zwraca pojedynczą liczbę.
            Write("Identifier");
            int myId = ReadInt();
 
            //Lista naszych sojuszników i przeciwników.
            List<int> allies = new List<int>();
            List<int> enemies = new List<int>();
            for (int i = 1; i < players + 1; i++)
                enemies.Add(i);
 
            //Zapytanie, które zwraca informację o trybie w jakim gramy.
            Write("GameMode");
            string gameMode = ReadLine();
 
            //Dodajemy siebie do listy sojuszników.
            allies.Add(myId);
            if (gameMode.StartsWith("TeamDuel"))
            {
                //Jeśli gramy w trybie TeamDuel, dodajemy również sąsiedniego bota jako sojusznika.
                allies.Add((myId + 1) % 4 + 1);
            }
 
            //Z listy przeciwników usuwamy siebie i pozostałych sojuszników.
            foreach (var ally in allies)
            {
                enemies.Remove(ally);
            }
 
            #endregion Poznawanie przeciwników
 
            #region Właściwa gra
 
            while (true)
            {
                //Zapytanie o stan magów
                Write("Magicians");
 
                //W każdej lini otrzymujemy statystyki jednego z magów
                string[] magiciansStr = ReadLines(players);
 
                //Pobieramy informacje o naszym stanie.
                Magician me = new Magician(magiciansStr[myId - 1], deck);
                Print(me.ToString());
 
                //Wybieramy karty, które możemy wykorzystać.
                List<Card> goodCards = new List<Card>();
                List<Card> cardsInHand = me.Hand.Where(x => x != null).ToList();
                foreach (Card c in cardsInHand)
                {
                    bool ok = true;
                    for (int i = 0; i < c.Caster.Length; i++)
                    {
                        //Jeśli jakiś parametr karty jest ujemny i nasze statystyki są mniejsze od niego
                        //to takiej karty nie możemy użyć.
                        if (c.Caster[i] < 0 && me.Stats[i] + c.Caster[i] < 0)
                        {
                            ok = false;
                            break;
                        }
                    }
                    if (ok) goodCards.Add(c);
                }
 
                Print("Karty do rzucenia: ");
                foreach (Card goodCard in goodCards)
                {
                    Print(goodCard);
                }
 
                //Jeśli żadna karta się nie nadaje, wyrzucamy losową kartę.
                if (goodCards.Count == 0)
                {
                    Card card = cardsInHand[random.Next(cardsInHand.Count)];
                    WriteFormat("Throw {0}", card.Id);
                }
 
                //w przeciwnym razie wybieramy losowa kartę
                else
                {
                    Card card = goodCards[random.Next(goodCards.Count)];
                    int target;
 
                    //Sprawdzamy, czy efekt jest pozytywny, czy negatywny
                    if (card.Target.Sum() >= 0)
                        target = allies[random.Next(allies.Count)];
                    else
                        target = enemies[random.Next(enemies.Count)];
 
                    //i rzucamy.
                    WriteFormat("Cast {0} {1}", card.Id, target);
                }
 
                //i konczymy ture
                End();
            }
 
            #endregion Właściwa gra
        }
 
        //Metody pomocnicze, opakowujące standardowe wejście/wyjście
 
        #region Helpers
 
        //Metoda kończąca turę.
        private static void End()
        {
            Console.WriteLine("#END");
        }
 
        //Wypisuje komende lub zapytanie.
        public static void Write(object o)
        {
            Console.WriteLine(o);
        }
 
        public static void Print(object o)
        {
            Console.WriteLine("#PRINT " + o);
        }
 
        //Wypisuje komende lub zapytanie korzystając z formatowania.
        public static void WriteFormat(string format, params object[] args)
        {
            Console.WriteLine(format, args);
        }
 
        //Zczytuje linię z wejścia i parsuje ją do liczby.
        public static int ReadInt()
        {
            var s = Console.ReadLine();
            return string.IsNullOrEmpty(s) ? 0 : int.Parse(s);
        }
 
        //Zczytuje linię z wejścia.
        public static string ReadLine()
        {
            return Console.ReadLine();
        }
 
        //Zczytuje n-linii z wejścia i zwraca w postaci tabeli.
        public static string[] ReadLines(int no)
        {
            var s = new string[no];
 
            for (var i = 0; i < no; i++)
            {
                s[i] = Console.ReadLine();
            }
            return s;
        }
 
        #endregion Helpers
    }
}


Java
Pokaż/ukryj kod źródłowy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
 
public class program
{
   public static void main(String args[])
   {
        Scanner input = new Scanner(System.in);
        Random rand = new Random();
        ArrayList<ArrayList<Integer>> deck = new ArrayList<ArrayList<Integer>>();
        System.out.println("Cards");
        int decksize = Integer.parseInt(input.nextLine());
        for (int i = 0; i < decksize; i++)
        {
           String[] c = input.nextLine().split(",");
           ArrayList<Integer> card = new ArrayList();
           for (String e : c[0].trim().split(" "))
               card.add(Integer.parseInt(e));
           for (String e : c[2].trim().split(" "))
               card.add(Integer.parseInt(e));
           for (String e : c[3].trim().split(" "))
               card.add(Integer.parseInt(e));
           deck.add(card);
        }
        System.out.println("#PRINT Pelna talia: " + deck);
 
        ArrayList<Integer> mydeck = new ArrayList<Integer>();
        while(true)
        {
            System.out.println("CardsLeft");
            int cardsleft = Integer.parseInt(input.nextLine());
            if (cardsleft == 0)
                break;
            System.out.println("ResourcesLeft");
            int resources = Integer.parseInt(input.nextLine());
            int maxres = resources - cardsleft + 1;
            ArrayList<ArrayList<Integer>> cards = new ArrayList<ArrayList<Integer>>();
            for (ArrayList<Integer> c : deck)
                if (c.get(1) <= maxres)
                    cards.add(c);
            int card = cards.get(rand.nextInt(cards.size())).get(0);
            mydeck.add(card);
            System.out.println("Buy " + card);
            String ok = input.nextLine();
        }
 
        System.out.println("#PRINT Kupione karty: " + mydeck);
        System.out.println("#END");
 
        System.out.println("NumberOfPlayers");
        int players = Integer.parseInt(input.nextLine());
        System.out.println("Identifier");
        int myid = Integer.parseInt(input.nextLine());
 
        ArrayList<Integer> allies = new ArrayList<Integer>();
        ArrayList<Integer> axis = new ArrayList<Integer>();
        System.out.println("GameMode");
        if (input.nextLine().startsWith("TeamDuel"))
        {
            allies.add(myid); allies.add((myid+1)%4+1);
            axis.add((myid+0)%4+1);axis.add((myid+2)%4+1);
        }
        else
        {
            allies.add(myid);
            for (int i = 1; i <= players; i++) if (i != myid) axis.add(i);
        }
 
        while (true)
        {
            System.out.println("Magicians");
            ArrayList<String> magicians = new ArrayList<String>();
            for (int i = 0; i < players; i++)
                magicians.add(input.nextLine());
           String[] me = magicians.get(myid-1).split(",");
           ArrayList<Integer> state = new ArrayList<Integer>();
           for (String n : me[1].trim().split(" "))
               state.add(Integer.parseInt(n));
           ArrayList<Integer> hand = new ArrayList<Integer>();
           for (String n : me[2].trim().split(" "))
               hand.add(Integer.parseInt(n));
           System.out.println("#PRINT Stan maga: " + state);
           System.out.println("#PRINT Stan reki: " + hand);
 
           ArrayList<ArrayList<Integer>> goodcards = new ArrayList<ArrayList<Integer>>();
           for (int j : hand)
           {
               ArrayList<Integer> c = deck.get(j-1);
               boolean ok = true;
               for (int i = 0; i < 6; i++)
               {
                   if (c.get(i+2) != 0 && state.get(i) + c.get(i+2) < 0)
                   {
                       ok = false;
                       break;
                   }
               }
               if (ok) goodcards.add(c);
           }
           System.out.println("#PRINT Mozliwe do rzucenia karty to " + goodcards);
 
           if (goodcards.size()==0)
           {
               System.out.println("Throw " + hand.get(rand.nextInt(hand.size())));
               System.out.println("#END");
               continue;
           }
 
           ArrayList<Integer> choice = goodcards.get(rand.nextInt(goodcards.size()));
           int sum = 0, target;
           for (int i = 8; i < choice.size(); i++) sum += choice.get(i);
           if (sum > 0)
               target = allies.get(rand.nextInt(allies.size()));
           else
               target = axis.get(rand.nextInt(axis.size()));
           System.out.println("Cast " + choice.get(0) + " " + target);
           System.out.println("#END");
        }
   }
}

0
Twoja ocena: Brak

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com