@jutge.org/toolkit 4.2.22 → 4.2.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/assets/problems/games/the-walking-dead.pbm/README.md +12 -0
  2. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/Makefile +6 -0
  3. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/api.tex +246 -0
  4. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/defs.tex +2 -0
  5. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/main.tex +63 -0
  6. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/programming.tex +452 -0
  7. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/rules.tex +222 -0
  8. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/screenshot.png +0 -0
  9. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/tips.tex +81 -0
  10. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/twd.png +0 -0
  11. package/assets/problems/games/the-walking-dead.pbm/ca/Doc/viewer.tex +41 -0
  12. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/Makefile +6 -0
  13. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/api.tex +246 -0
  14. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/defs.tex +2 -0
  15. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/main.tex +63 -0
  16. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/programming.tex +176 -0
  17. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/rules.tex +194 -0
  18. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/screenshot.png +0 -0
  19. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/tips.tex +85 -0
  20. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/twd.png +0 -0
  21. package/assets/problems/games/the-walking-dead.pbm/ca/Doc-eng/viewer.tex +36 -0
  22. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.Linux64 +0 -0
  23. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.Linux64.Debug +0 -0
  24. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.MacOS +0 -0
  25. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.MacOS.ARM +0 -0
  26. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.MacOS.ARM.Debug +0 -0
  27. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/AIDummy.o.MacOS.Debug +0 -0
  28. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.Linux64 +0 -0
  29. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.Linux64.Debug +0 -0
  30. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.MacOS +0 -0
  31. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.MacOS.ARM +0 -0
  32. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.MacOS.ARM.Debug +0 -0
  33. package/assets/problems/games/the-walking-dead.pbm/ca/Obj/Board.o.MacOS.Debug +0 -0
  34. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/AIDemo.cc +89 -0
  35. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/AIDummy.cc +202 -0
  36. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/AINull.cc +37 -0
  37. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Action.cc +34 -0
  38. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Action.hh +107 -0
  39. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Board.cc +975 -0
  40. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Board.hh +287 -0
  41. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Defs.hh +2 -0
  42. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Game.cc +55 -0
  43. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Game.hh +23 -0
  44. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Info.cc +174 -0
  45. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Info.hh +129 -0
  46. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Main.cc +83 -0
  47. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Makefile +56 -0
  48. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Player.cc +66 -0
  49. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Player.hh +63 -0
  50. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/README.txt +9 -0
  51. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Random.cc +3 -0
  52. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Random.hh +88 -0
  53. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Registry.cc +28 -0
  54. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Registry.hh +42 -0
  55. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/SecGame.cc +368 -0
  56. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/SecGame.hh +90 -0
  57. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/SecMain.cc +99 -0
  58. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Settings.cc +67 -0
  59. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Settings.hh +175 -0
  60. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/State.cc +3 -0
  61. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/State.hh +188 -0
  62. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Structs.cc +3 -0
  63. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Structs.hh +377 -0
  64. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Utils.cc +3 -0
  65. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/Utils.hh +77 -0
  66. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/default-fixed.cnf +120 -0
  67. package/assets/problems/games/the-walking-dead.pbm/ca/Runner/default.cnf +17 -0
  68. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  69. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  70. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  71. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  72. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  73. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  74. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  75. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  76. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  77. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  78. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  79. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  80. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  81. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  82. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/css/ui-lightness/jquery-ui-1.8.18.custom.css +310 -0
  83. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/help.html +18 -0
  84. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_close.png +0 -0
  85. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_end.png +0 -0
  86. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_help.png +0 -0
  87. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_pause.png +0 -0
  88. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_play.png +0 -0
  89. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_refresh.png +0 -0
  90. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/but_start.png +0 -0
  91. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/img/logo.png +0 -0
  92. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/js/jquery-1.7.1.min.js +4 -0
  93. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/js/jquery-ui-1.8.18.custom.min.js +49 -0
  94. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/sample.out +52807 -0
  95. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/viewer.html +118 -0
  96. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/viewer.js +846 -0
  97. package/assets/problems/games/the-walking-dead.pbm/ca/Viewer/viewer.sh +28 -0
  98. package/assets/problems/games/the-walking-dead.pbm/ca/handler.yml +6 -0
  99. package/assets/problems/games/the-walking-dead.pbm/ca/problem.ca.yml +3 -0
  100. package/assets/prompts/creators/create-solution.tpl.txt +15 -8
  101. package/assets/prompts/proglangs/cc.md +6 -2
  102. package/assets/prompts/proglangs/py.md +10 -6
  103. package/dist/index.js +370 -366
  104. package/docs/getting-started-guide.md +1 -1
  105. package/docs/install-linux.md +1 -1
  106. package/docs/install-macos.md +1 -1
  107. package/docs/install-windows.md +1 -1
  108. package/package.json +11 -11
  109. package/toolkit/ask.ts +0 -2
  110. package/toolkit/doctor.ts +1 -1
  111. package/toolkit/make.ts +2 -2
@@ -0,0 +1,452 @@
1
+ \section{Com programar un jugador}
2
+ El primer que heu de fer és descarregar-vos el codi font. Aquest
3
+ inclou un programa C ++ que executa les partides i un visualitzador HTML
4
+ per veure-les en un format raonable i animat. A més, us proporcionem un
5
+ jugador ``Null'' i un jugador ``Demo'' per facilitar el començament de
6
+ la codificació del jugador.
7
+
8
+ \subsection{Executar la primera partida}
9
+ Aquí us explicarem com executar el joc sota Linux, però hauria de funcionar
10
+ també sota Windows, Mac, FreeBSD, OpenSolaris, ... Només necessiteu una
11
+ versió recent \texttt{g ++}, el \texttt{make} instal·lat al sistema, a més d'un
12
+ navegador modern com Firefox o Chrome.
13
+
14
+ \begin{enumerate}
15
+
16
+ \item Obriu una consola i feu \texttt{cd} al directori on us heu
17
+ descarregat el codi font.
18
+
19
+ \item Si, per exemple, teniu una versió de Linux en 64 bits, executeu:
20
+
21
+ \texttt{cp AIDummy.o.Linux64 AIDummy.o}
22
+
23
+ \texttt{cp Board.o.Linux64 Board.o}
24
+
25
+ Amb altres arquitectures, cal escollir els objectes adequats que
26
+ trobareu al directori.
27
+
28
+ \item Executeu
29
+
30
+ \texttt{make all}
31
+
32
+ per compilar el joc i tots els jugadors. Tingueu en compte que el \texttt{Makefile}
33
+ identifica com a jugador qualsevol fitxer que coincideixi amb \texttt{AI*.cc}
34
+
35
+
36
+ \item Es crea un fitxer executable anomenat \texttt{Game}. Aquest
37
+ executable us permet executar una partida mitjançant una comanda
38
+ com la següent:
39
+
40
+
41
+ \texttt{./Game Demo Demo Demo Demo -s 30 < default.cnf > default.res}
42
+
43
+ Aquesta comanda comença una partida, amb la llavor aleatòria 30, amb
44
+ quatre instàncies del jugador Demo, al tauler definit a
45
+ \texttt{default.cnf}. La sortida d'aquesta partida es redirigeix a
46
+ \texttt{default.res}.
47
+
48
+
49
+ \item Per veure una partida, obriu el fitxer visualitzador \texttt{viewer.html} amb
50
+ el navegador, per exemple executant des d'un terminal la comanda \texttt{firefox
51
+ viewer.html}, i carregueu el fitxer \texttt{default.res}.
52
+
53
+ \end{enumerate}
54
+
55
+
56
+ Utilitzeu
57
+
58
+ \texttt{./Game --help}
59
+
60
+ per veure la llista de paràmetres que es poden usar. Particularment útil és
61
+
62
+ \texttt{./Game --list}
63
+
64
+ per veure tots els noms de jugadors reconeguts.
65
+
66
+ \medskip
67
+
68
+ En cas que sigui necessari, recordeu que podeu executar
69
+
70
+ \texttt{make clean}
71
+
72
+ per esborrar l'executable i els objectes i començar la compilació de nou.
73
+
74
+ \begin{center}
75
+ \includegraphics[width=12cm]{screenshot.png}
76
+ \end{center}
77
+
78
+
79
+ \subsection{Afegir el vostre jugador}
80
+
81
+ Per crear un jugador nou amb, per exemple, nom \texttt{Rick},
82
+ copieu \texttt{AINull.cc} (un jugador buit que proporcionem com a plantilla)
83
+ a un fitxer nou \texttt{AIRick.cc}.
84
+ A continuació, editeu el fitxer nou i canvieu la línia
85
+
86
+ \begin{center}
87
+ @#define PLAYER_NAME Null@
88
+ \end{center}
89
+
90
+ a
91
+
92
+ \begin{center}
93
+ @#define PLAYER_NAME Rick@
94
+ \end{center}
95
+
96
+ El nom que trieu pel vostre jugador ha de ser únic, no ofensiu
97
+ i tenir com a màxim 12 caràcters. Aquest nom es mostrarà al lloc web
98
+ i durant les partides.
99
+
100
+ \medskip
101
+ A continuació, podeu començar a implementar el mètode virtual @play()@,
102
+ heretat de la classe base @Player@. Aquest mètode, que serà
103
+ cridat a cada ronda, ha de determinar les ordres que s'enviaran a les vostres unitats.
104
+
105
+ Podeu utilitzar definicions de tipus, variables i mètodes a
106
+ la vostra classe de jugador, però el punt d’entrada del vostre codi serà sempre el
107
+ mètode @play()@.
108
+
109
+ Des de la vostra classe jugador també podeu cridar funcions que
110
+ trobareu especificades als arxius següents:
111
+
112
+ \begin{itemize}
113
+ \item \texttt{State.hh}: accedir a
114
+ l'estat del joc.
115
+ \item \texttt{Action.hh}: donar ordres a les vostres unitats.
116
+ \item \texttt{Structs.hh}: estructures de dades útils.
117
+ \item \texttt{Settings.hh}: accedir als paràmetres del joc.
118
+ \item \texttt{Player.hh}: mètode @me()@.
119
+ \item \texttt{Random.hh}: generar nombre aleatoris.
120
+ \end{itemize}
121
+
122
+ Trobareu un resum de tota aquesta informació a l'arxiu \texttt{api.pdf}.
123
+ També podeu examinar el codi del
124
+ jugador ``Demo'' a \texttt{AIDemo.cc} com a exemple de com usar
125
+ aquestes funcions.
126
+
127
+ Tingueu en compte que no heu d'editar el mètode @factory()@ de la
128
+ classe del vostre jugador, ni l'última línia que afegeix el vostre
129
+ jugador a la llista de jugadors disponibles.
130
+
131
+
132
+ \subsection{Restriccions en enviar el vostre jugador}
133
+
134
+ Quan creieu que el vostre jugador és prou fort per entrar a la
135
+ competició, podeu enviar-lo al Jutge. Degut a que s'executarà en un entorn segur
136
+ per prevenir trampes, algunes restriccions s'apliquen al vostre
137
+ codi:
138
+
139
+ \begin{itemize}
140
+
141
+
142
+ \item Tot el vostre codi font ha d’estar en un sol fitxer (com AIRick.cc).
143
+
144
+ \item No podeu utilitzar variables globals (en el seu lloc, utilitzeu atributs a la vostra
145
+ classe).
146
+
147
+ \item Només teniu permès utilitzar biblioteques estàndard com
148
+ \texttt{iostream}, \texttt{vector}, \texttt{map}, \texttt{set},
149
+ \texttt{queue}, \texttt{algoritme}, \texttt{cmath}, \dots En molts
150
+ casos, ni tan sols cal incloure la biblioteca corresponent.
151
+
152
+ \item No podeu obrir fitxers ni fer cap altra crida a sistema (threads, forks, ...)
153
+
154
+ \item El vostre temps de CPU i la memòria que utilitzeu seran limitats, mentre que no ho són
155
+ al vostre entorn local quan executeu \texttt{./Game}.
156
+
157
+ \item El vostre programa no ha d'escriure a @cout@ ni llegir de @cin@. Podeu
158
+ escriure informació de depuració a @cerr@, però recordeu que fer això en el
159
+ codi que envieu al Jutge pot fer malgastar innecessàriament temps de CPU.
160
+
161
+ \item Qualsevol enviament al Jutge ha de ser un intent honest de jugar.
162
+ Qualsevol intent de fer trampes de qualsevol manera serà durament penalitzat.
163
+
164
+ \item Un cop hagueu enviat un jugador al Jutge que hagi derrotat al
165
+ Dummy, podeu fer més enviaments però haureu de canviar el nom
166
+ del jugador. És a dir, un cop un jugador ha vençut al Dummy, el
167
+ seu nom queda bloquejat i no es pot reutilitzar.
168
+
169
+ \end{itemize}
170
+
171
+
172
+ %% \section{Com programar un jugador}
173
+ %% El primer que heu de fer és descarregar-vos el codi font. Aquest
174
+ %% inclou un programa C ++ que executa les partides i un visualitzador HTML
175
+ %% per veure-les en un format raonable i animat. A més, us proporcionem un
176
+ %% jugador ``Null'' i un jugador ``Demo'' per facilitar el començament de
177
+ %% la codificació del jugador.
178
+
179
+ %% \subsection{Executar la primera partida}
180
+ %% Aquí us explicarem com executar el joc sota Linux, però hauria de funcionar
181
+ %% també sota Windows, Mac, FreeBSD, OpenSolaris, ... Només necessiteu una
182
+ %% versió recent de \texttt{g ++}, el \texttt{make} instal·lat al sistema, a més d'un
183
+ %% navegador modern com Firefox o Chrome.
184
+
185
+ %% \begin{enumerate}
186
+
187
+ %% \item Obriu una consola i feu \texttt{cd} al directori on us heu
188
+ %% descarregat el codi font.
189
+
190
+ %% \item Si, per exemple, teniu una versió de Linux en 64 bits, executeu:
191
+
192
+ %% \texttt{cp AIDummy.o.Linux64 AIDummy.o}
193
+
194
+ %% Amb altres arquitectures, cal escollir els objectes adequats que
195
+ %% trobareu al directori.
196
+
197
+ %% \item Executeu
198
+
199
+ %% \texttt{make all}
200
+
201
+ %% per compilar el joc i tots els jugadors. Tingueu en compte que el \texttt{Makefile}
202
+ %% identifica com a jugador qualsevol fitxer que coincideixi amb \texttt{AI*.cc}
203
+
204
+
205
+ %% \item Es crea un fitxer executable anomenat \texttt{Game}. Aquest
206
+ %% executable us permet executar una partida mitjançant una comanda
207
+ %% com la següent:
208
+
209
+
210
+ %% \texttt{./Game Demo Demo Demo Demo -s 30 < default.cnf > default.res}
211
+
212
+ %% Aquesta comanda comença una partida, amb la llavor aleatòria 30, amb
213
+ %% quatre instàncies del jugador Demo, al tauler definit a
214
+ %% \texttt{default.cnf}. La sortida d'aquesta partida es redirigeix a
215
+ %% \texttt{default.res}.
216
+
217
+
218
+ %% \item Per veure una partida, obriu el fitxer visualitzador \texttt{Viewer/viewer.html} amb
219
+ %% un navegador i carregueu el fitxer \texttt{default.res}.
220
+
221
+ %% \end{enumerate}
222
+
223
+
224
+ %% Utilitzeu
225
+
226
+ %% \texttt{./Game --help}
227
+
228
+ %% per veure la llista de paràmetres que es poden usar. Particularment útil és
229
+
230
+ %% \texttt{./Game --list}
231
+
232
+ %% per veure tots els noms de jugadors reconeguts.
233
+
234
+ %% \medskip
235
+
236
+ %% En cas que sigui necessari, recordeu que podeu executar
237
+
238
+ %% \texttt{make clean}
239
+
240
+ %% per esborrar l'executable i els objectes i començar la compilació de nou.
241
+
242
+ %% %% \begin{center}
243
+ %% %% \includegraphics[width=12cm]{screenshot.eps}
244
+ %% %% \end{center}
245
+
246
+ %% \subsection{Arxiu de configuració}
247
+
248
+ %% Us proporcionem dos exemples d'arxius de configuració. En totes les
249
+ %% partides que es juguin al Jutge, incloent les eliminatòries i la
250
+ %% final, utilitzarem sempre \texttt{default.cnf}. Aquest arxiu
251
+ %% fixa els paràmetres de la Figura~\ref{fig:parameters} al valor per
252
+ %% defecte. La posició dels edificis, dels ciutadans, de les armes i dels
253
+ %% bonus es decideixen de forma aleatòria.
254
+
255
+ %% L'arxiu de configuració \texttt{default-fixed.cnf} mostra com es poden
256
+ %% canviar els paràmetres i definir el tauler d'entrada. Els caràcters
257
+ %% de la graella són '.'(carrer), 'B' (edifici), 'G' (pistola), 'Z'
258
+ %% (bazuca), 'M' (diners), 'F' (menjar). Pel que fa als ciutadans, el seu
259
+ %% tipus és 'w' (guerrer) o bé 'b' (constructor), i les armes possibles
260
+ %% són 'n' (cap arma), 'h' (martell), 'g' (pistola) i 'b' (bazuca).
261
+
262
+ %% Podeu crear arxius de configuració vosaltres mateixos per diversió o
263
+ %% si voleu provar els vostres jugadors en taulers més petits o amb
264
+ %% alguna peculiaritat. Els valors dels paràmetres han d'estar dins el
265
+ %% rang establert a la Figura~\ref{fig:parameters}. Heu d'assegurar-vos
266
+ %% que les forces d'atac i de demolició del bazuca han de ser majors o
267
+ %% iguals que les de la pistola, i les de la pistola majors o iguals que
268
+ %% les del martell. Una altra restricció és que BARRICADE\_RESISTANCE\_STEP
269
+ %% ha de ser menor o igual que BARRICADE\_MAX\_RESISTANCE. Finalment, si
270
+ %% voleu modificar els paràmetres i generar el tauler aleatòriament, heu
271
+ %% d'assegurar-vos que el tauler és prou gran per encabir tots els
272
+ %% objectes.
273
+
274
+ %% \begin{figure}
275
+ %% \centering
276
+ %% \begin{tabular}{|l|c|c|} \hline
277
+
278
+ %% \textbf{Paràmetre} & \textbf{Valor per defecte} & \textbf{Rang} \\ \hline\hline
279
+
280
+ %% @ NUM_PLAYERS @ & 4 & $[4,4]$ \\
281
+ %% @ NUM_DAYS @ & 5 & $[1,\infty)$ \\
282
+ %% @ NUM_ROUNDS_PER_DAY @ & 50 & $[2,\infty)$ (parell) \\
283
+ %% @ BOARD_ROWS @ & 15 & $[12,25]$ \\
284
+ %% @ BOARD_COLS @ & 30 & $[12,50]$ \\
285
+
286
+ %% @ NUM_INI_BUILDERS @ & 4 & $[1,6]$ \\
287
+ %% @ NUM_INI_WARRIORS @ & 2 & $[1,4]$ \\
288
+ %% @ NUM_INI_MONEY @ & 10 & $[0,10]$ \\
289
+ %% @ NUM_INI_FOOD @ & 5 & $[0,10]$ \\
290
+ %% @ NUM_INI_GUNS @ & 4 & $[0,5]$ \\
291
+ %% @ NUM_INI_BAZOOKAS @ & 2 & $[0,4]$ \\
292
+
293
+ %% @ BUILDER_INI_LIFE @ & 60 & $[1,\infty)$ \\
294
+ %% @ WARRIOR_INI_LIFE @ & 100 & $[1,\infty)$ \\
295
+ %% @ MONEY_POINTS @ & 5 & $[1,\infty)$ \\
296
+ %% @ KILL_BUILDER_POINTS @ & 100 & $[1,\infty)$ \\
297
+ %% @ KILL_WARRIOR_POINTS @ & 250 & $[1,\infty)$ \\
298
+ %% @ FOOD_INCR_LIFE @ & 20 & $[1,\infty)$ \\
299
+
300
+ %% @ LIFE_LOST_IN_ATTACK @ & 20 & $[1,\infty)$ \\
301
+
302
+ %% @ BUILDER_STRENGTH_ATTACK @ & 1 & $[1,\infty)$ \\
303
+ %% @ HAMMER_STRENGTH_ATTACK @ & 10 & $[1,\infty)$ \\
304
+ %% @ GUN_STRENGTH_ATTACK @ & 100 & $[1,\infty)$ \\
305
+ %% @ BAZOOKA_STRENGTH_ATTACK @ & 1000 & $[1,\infty)$ \\
306
+
307
+ %% @ BUILDER_STRENGTH_DEMOLISH @ & 3 & $[1,\infty)$ \\
308
+ %% @ HAMMER_STRENGTH_DEMOLISH @ & 10 & $[1,\infty)$ \\
309
+ %% @ GUN_STRENGTH_DEMOLISH @ & 10 & $[1,\infty)$ \\
310
+ %% @ BAZOOKA_STRENGTH_DEMOLISH @ & 30 & $[1,\infty)$ \\
311
+
312
+ %% @ NUM_ROUNDS_REGEN_BUILDER @ & 50 & $[1,\infty)$ \\
313
+ %% @ NUM_ROUNDS_REGEN_WARRIOR @ & 50 & $[1,\infty)$ \\
314
+ %% @ NUM_ROUNDS_REGEN_FOOD @ & 10 & $[1,\infty)$ \\
315
+ %% @ NUM_ROUNDS_REGEN_MONEY @ & 5 & $[1,\infty)$ \\
316
+ %% @ NUM_ROUNDS_REGEN_WEAPON @ & 40 & $[1,\infty)$ \\
317
+
318
+
319
+ %% @ BARRICADE_RESISTANCE_STEP @ & 40 & $[1,\infty)$ \\
320
+ %% @ BARRICADE_MAX_RESISTANCE @ & 320 & $[1,\infty)$ \\
321
+ %% @ MAX_NUM_BARRICADES @ & 3 & $[1,\infty)$ \\
322
+
323
+
324
+ %% \hline
325
+ %% \end{tabular}
326
+ %% \caption{Paràmetres del joc. La seva explicació la trobareu a l'arxiu \texttt{Settings.hh}.}
327
+ %% \label{fig:parameters}
328
+ %% \end{figure}
329
+
330
+
331
+
332
+
333
+
334
+ %% \subsection{Afegir el vostre jugador}
335
+
336
+ %% Per crear un jugador nou
337
+ %% copieu \texttt{AINull.cc} (un jugador buit que proporcionem com a plantilla)
338
+ %% a un fitxer nou \texttt{AIElquesigui.cc}.
339
+ %% A continuació, editeu el fitxer nou i canvieu la línia
340
+
341
+ %% \begin{center}
342
+ %% @#define PLAYER_NAME Null@
343
+ %% \end{center}
344
+
345
+ %% a
346
+
347
+ %% \begin{center}
348
+ %% @#define PLAYER_NAME Elquesigui@
349
+ %% \end{center}
350
+
351
+ %% El nom que trieu pel vostre jugador ha de ser únic, no ofensiu
352
+ %% i tenir com a màxim 12 caràcters. Aquest nom es mostrarà al lloc web
353
+ %% i durant les partides.
354
+
355
+ %% \medskip
356
+ %% A continuació, podeu començar a implementar el mètode virtual @play()@,
357
+ %% heretat de la classe base @Player@. Aquest mètode, que serà
358
+ %% cridat a cada ronda, ha de determinar les ordres que s'enviaran a les vostres unitats.
359
+
360
+ %% Podeu utilitzar definicions de tipus, variables i mètodes a
361
+ %% la vostra classe de jugador, però el punt d’entrada del vostre codi serà sempre el
362
+ %% mètode @play()@.
363
+
364
+
365
+
366
+ %% Des de la vostra classe jugador també podeu cridar funcions que
367
+ %% trobareu especificades als arxius següents:
368
+
369
+ %% \begin{itemize}
370
+ %% \item \texttt{State.hh}: accedir a
371
+ %% l'estat del joc.
372
+ %% \item \texttt{Action.hh}: donar ordres als vostres ciutadans.
373
+ %% \item \texttt{Structs.hh}: estructures de dades útils.
374
+ %% \item \texttt{Settings.hh}: accedir als paràmetres del joc.
375
+ %% \item \texttt{Player.hh}: mètode @me()@.
376
+ %% \item \texttt{Random.hh}: generar nombre aleatoris.
377
+ %% \end{itemize}
378
+
379
+ %% També podeu examinar el codi del
380
+ %% jugador ``Demo'' a \texttt{AIDemo.cc} com a exemple de com usar
381
+ %% aquestes funcions.
382
+
383
+ %% Tingueu en compte que no heu d'editar el mètode @factory()@ de la
384
+ %% classe del vostre jugador, ni l'última línia que afegeix el vostre
385
+ %% jugador a la llista de jugadors disponibles.
386
+
387
+
388
+ %% \subsection{Jugar contra el jugador Dummy}
389
+
390
+ %% Per a provar la vostra estratègia contra el jugador Dummy, proporcionem
391
+ %% el seu arxiu objecte. D'aquesta manera, no teniu accés al seu codi font
392
+ %% però podreu afegir-lo com a jugador i competir contra ell en local.
393
+
394
+ %% \medskip
395
+
396
+ %% Com ja hem comentat, per afegir el jugador Dummy a la llista de
397
+ %% jugadors registrats, heu de copiar l'arxiu corresponent a la vostra
398
+ %% arquitectura cap a \texttt{AIDummy.o}. Per exemple:
399
+
400
+ %% \texttt{cp AIDummy.o.Linux64 AIDummy.o}
401
+
402
+ %% Recordeu que els arxius objecte contenen
403
+ %% instruccions binàries per a una arquitectura concreta, pel que no podem proporcionar
404
+ %% un únic arxiu.
405
+
406
+ %% \medskip
407
+
408
+ %% Consell de pro: demaneu als vostres amics els seus arxius {\bf
409
+ %% objecte} (mai codi font!!!) i afegiu-los al vostre
410
+ %% \texttt{Makefile}!
411
+
412
+ %% \subsection{Restriccions en enviar el vostre jugador}
413
+
414
+ %% Quan creieu que el vostre jugador és prou fort per entrar a la
415
+ %% competició, podeu enviar-lo al Jutge. Degut a que s'executarà en un entorn segur
416
+ %% per prevenir trampes, algunes restriccions s'apliquen al vostre
417
+ %% codi:
418
+
419
+ %% \begin{itemize}
420
+
421
+
422
+ %% \item Tot el vostre codi font ha d’estar en un sol fitxer (com AIElquesigui.cc).
423
+
424
+ %% \item No podeu utilitzar variables globals (en el seu lloc, utilitzeu atributs a la vostra
425
+ %% classe).
426
+
427
+ %% \item Només teniu permès utilitzar biblioteques estàndard com
428
+ %% \texttt{iostream}, \texttt{vector}, \texttt{map}, \texttt{set},
429
+ %% \texttt{queue}, \texttt{algoritme}, \texttt{cmath}, \dots En molts
430
+ %% casos, ni tan sols cal incloure la biblioteca corresponent.
431
+
432
+ %% \item No podeu obrir fitxers ni fer cap altra crida a sistema (threads, forks, ...)
433
+
434
+ %% \item El vostre temps de CPU i la memòria que utilitzeu seran limitats, mentre que no ho són
435
+ %% al vostre entorn local quan executeu \texttt{./Game}. El temps límit és d'un segon
436
+ %% per l'execució de tota la partida. Si exhauriu el temps límit (o si l'execució del vostre codi
437
+ %% avorta), el vostre jugador es congelarà i no admetrà més instruccions.
438
+
439
+ %% \item El vostre programa no ha d'escriure a @cout@ ni llegir de @cin@. Podeu
440
+ %% escriure informació de depuració a @cerr@, però {\bf heu d'eliminar} aquesta informació
441
+ %% en el codi que envieu al Jutge.
442
+
443
+ %% \item Qualsevol enviament al Jutge ha de ser un intent honest de jugar.
444
+ %% Qualsevol intent de fer trampes de qualsevol manera serà durament penalitzat.
445
+
446
+ %% \item Un cop hagueu enviat un jugador al Jutge que hagi derrotat al
447
+ %% Dummy, podeu fer més enviaments però haureu de canviar el nom
448
+ %% del jugador. És a dir, un cop un jugador ha vençut al Dummy, el
449
+ %% seu nom queda bloquejat i no es pot reutilitzar.
450
+ %% \end{itemize}
451
+
452
+
@@ -0,0 +1,222 @@
1
+
2
+ \section{Regles del Joc}
3
+
4
+ Per motius que encara ningú coneix amb certesa, l'apocalipsi zombi
5
+ s'ha apoderat de la Terra. Els pocs humans que hi queden intenten
6
+ sobreviure i apoderar-se dels escassos recursos encara existents.
7
+
8
+ Es tracta d'un joc per a quatre jugadors, identificats amb números de
9
+ 0 a 3. Cada jugador té el control d'un clan d'unitats vives. Però al
10
+ joc coexisteixen dos tipus més d'unitats: unitats mortes i zombis.
11
+
12
+ El joc té una durada de 200 rondes, numerades de l'1 al 200. Cada
13
+ unitat pot moure's com a màxim una vegada per ronda. Les unitats
14
+ mortes, com és d'esperar, no es poden moure. Durant aquestes rondes
15
+ els clans aniran acumulant punts i guanyarà la partida qui tingui més
16
+ punts en acabar la ronda 200.
17
+
18
+ El tauler del joc té dimensions $60 \times 60$. Les unitats no es
19
+ poden moure en cap cas fora d'ell. Una posició del tauler ve
20
+ determinada per un parell d'enters $(f,c)$ on $0 \leq f < 60$ i $0\leq
21
+ c < 60$. La posició de més a dalt i a l'esquerra és la $(0,0)$, mentre
22
+ que la de més a baix i a la dreta és $(59,59)$. Per tant, la primera
23
+ coordenada ($f$ de fila) és la que indica la posició en l'eix vertical
24
+ i la segona ($c$ de columna) en l'eix horitzontal. Cada cel·la del
25
+ tauler o bé forma part d'un carrer o bé està plena de deixalla. Les
26
+ unitats no poden trepitjar la deixalla i s'han de moure necessàriament
27
+ pels carrers.
28
+
29
+ Els clans comencen la partida amb una certa quantitat de punts de
30
+ força. La {\em força d'un clan} es defineix com
31
+ $\left\lfloor{{\texttt{punts força}}\over{\texttt{unitats
32
+ vives}}}\right\rfloor$ i serà clau per determinar el guanyador
33
+ de les lluites que hi haurà durant la partida. En acabar cada ronda,
34
+ els punts de força d'una clan es decrementaran en una quantitat igual
35
+ al nombre d'unitats vives d'aquest clan. No obstant, mai esdevindrà
36
+ una quantitata negativa. Per tal d'incrementar els punts de força, les
37
+ unitats vives poden agafar menjar que trobaran al tauler. És fàcil
38
+ veure que un clan amb moltes unitats vives necessita recollir molt
39
+ menjar per a poder mantenir una força considerable. És per això que
40
+ algunes unitats decideixen canviar de clan: cada ronda, amb un $20\%$
41
+ de probabilitat, una unitat del clan amb més unitats vives passa a
42
+ formar part del clan amb menys unitats vives. En cas d'haver-hi
43
+ diferents clans amb aquestes propietats, se'n selecciona un d'ells de
44
+ forma aleatòria.
45
+
46
+ \bigskip
47
+ {\bf Moviments de les unitats vives.} Una unitat viva d'un clan es
48
+ pot moure pel tauler de la manera següent:
49
+
50
+ \begin{itemize}
51
+ \item Només pot accedir a les cel·les adjacents en horitzontal i
52
+ vertical, mai en diagonal.
53
+
54
+ \item Si es mou cap a una cel·la ocupada per deixalla, per una
55
+ unitat del seu mateix clan o per una unitat morta, el moviment
56
+ s'ignorarà.
57
+
58
+ \item Si es mou cap a una cel·la ocupada per menjar, els punts de
59
+ força del seu clan s'incrementaran, la unitat ocuparà la cel·la
60
+ tot fent desaparèixer el menjar i el seu clan posseirà aquesta
61
+ cel·la. En acabar la ronda, una unitat de menjar reapareixerà en
62
+ una altra posició. Notem que no trobarem mai una cel·la ocupada
63
+ per menjar i per una unitat.
64
+
65
+ \item Si es mou cap a una cel·la buida (sense menjar ni cap unitat),
66
+ el moviment s'efectuarà i el seu clan passarà a posseir aquesta
67
+ cel·la.
68
+
69
+ \item Si es mou cap a una cel·la ocupada per un zombi, el zombi
70
+ morirà però la unitat no es mourà. Com a resultat, el clan rebrà
71
+ un cert nombre de punts i, en acabar la ronda, una unitat viva
72
+ d'aquest clan reapareixerà en una altra posició reemplaçant al
73
+ zombi, que desapareixerà.
74
+
75
+ \item Si es mou cap a una cel·la ocupada per una unitat viva d'un
76
+ altre clan, es produirà una lluita. La unitat que perdi la lluita
77
+ passarà a ser una unitat morta, i s'inicia el seu procés de
78
+ conversió: al cap d'un cert nombre de rondes, passarà a ser un
79
+ zombi. Si ja havia començat el procés de conversió per haver estat
80
+ mossegat per un zombi, el procés torna a començar. El clan de la
81
+ unitat que guanyi l'atac rebrà un cert nombre de
82
+ punts, però no es mourà de posició. El guanyador de la lluita
83
+ es determina de la manera següent:
84
+
85
+ Amb un $30\%$ de probabilitat, la unitat que ha desencadenat
86
+ l'atac agafarà l'altra per sorpresa i serà la guanyadora sense
87
+ haver de lluitar. En cas contrari, si les forces dels dos clans
88
+ involucrats en la lluita són $N$ i $M$, respectivament, el primer
89
+ guanyarà amb probabilitat $N/(N+M)$ i el segon amb probabilitat
90
+ $M/(N+M)$. En cas que $N = M = 0$, les dues unitats tindran la
91
+ mateixa probabilitat de guanyar.
92
+ \end{itemize}
93
+
94
+ {\bf Moviments dels zombis.} Els zombis no formen part de cap clan i
95
+ per tant no podran ser controlats per cap jugador. Els zombis sempre
96
+ es mouran cap a la unitat viva més propera a ells, tenint en compte la
97
+ presència d'obstacles. En cas d'haver-n'hi diverses a la mínima
98
+ distància, n'escolliran una a l'atzar. Els moviments d'un zombi es
99
+ regiran per les següent regles:
100
+
101
+ \bigskip
102
+ \begin{itemize}
103
+
104
+ \item Pot accedir a les cel·les adjacents en horitzontal i vertical, i
105
+ també en diagonal.
106
+
107
+ \item Mai es mourà cap a una cel·la ocupada per deixalla, per una
108
+ unitat morta o per un zombi.
109
+
110
+ \item Si es mou cap a una cel·la ocupada per menjar, el menjar
111
+ desapareixerà. En acabar la ronda, una unitat de menjar reapareixerà
112
+ en una posició aleatòria. Si un clan posseïa aquesta cel·la, deixarà
113
+ de fer-ho.
114
+
115
+ \item Si es mou cap a una cel·la buida (sense menjar ni cap unitat)
116
+ posseïda per un clan, aquest perdrà la possessió.
117
+
118
+ \item Si es vol moure cap a una cel·la ocupada per una unitat viva, el
119
+ moviment no s'efectuarà. No obstant, mossegarà a la unitat i
120
+ aquesta iniciarà el seu procés de conversió a zombi, que tindrà lloc
121
+ al cap d'un cert nombre de rondes. Si aquest procés ja s'havia
122
+ iniciat per una mossegada prèvia, el procés de conversió no tornarà
123
+ a començar sinó que continuarà el seu curs. Durant la conversió a zombi,
124
+ la unitat es comportarà igual que una unitat viva.
125
+
126
+ \end{itemize}
127
+
128
+ Com a resultat de les anterior regles, el nombre d'unitats totals és
129
+ constant al llarg de tot el joc.
130
+
131
+ \bigskip
132
+ {\bf Regeneració d'objectes.} Cada vegada que cal regenerar una unitat
133
+ de menjar o una unitat viva, aquesta reapareixerà sempre en una
134
+ cel·la buida $C$ i tal que no hi ha cap unitat ni menjar en les posicions que
135
+ l'envolten (les marcades amb una x a la taula):
136
+
137
+ \medskip
138
+ \begin{center}
139
+ \begin{tabular}{|c|c|c|c|c|}\hline
140
+ x & x & x & x & x \\\hline
141
+ x & x & x & x & x \\\hline
142
+ x & x & C & x & x \\\hline
143
+ x & x & x & x & x \\\hline
144
+ x & x & x & x & x \\\hline
145
+ \end{tabular}
146
+ \end{center}
147
+ \medskip
148
+
149
+ Si en el moment de reaparèixer no existeix cap cel·la segura en aquest
150
+ sentit, l'objecte reapareixerà en una cel·la buida, que no tingui cap unitat ni menjar.
151
+
152
+ És important remarcar que les unitats tenen un identificador que mai
153
+ canvia, ni tan sols durant el procés de regeneració. És a dir, si una
154
+ unitat amb un cert identificador inicial es converteix en zombi,
155
+ aquest continuarà amb el mateix identificador. Si posteriorment el
156
+ zombi mor i reapareix com una unitat viva d'un altre clan,
157
+ l'identificador es mantindrà.
158
+
159
+ \bigskip
160
+ {\bf Càlcul de la puntuació.} La puntuació d'un clan en una ronda ve
161
+ determinada per dos components. D'una banda, per cada zombi que el
162
+ clan hagi matat fins aquell moment s'obtindran
163
+ 10 punts. Per cada unitat que hagi
164
+ matat s'obtindran 50 punts.
165
+
166
+ D'altra banda, per cada cel·la posseïda pel clan {\bf en aquesta
167
+ ronda} s'obtindrà 1 punt. La puntuació del clan és la suma
168
+ d'aquestes quantitats. Així doncs, la puntuació es pot decrementar si
169
+ es perd la possessió d'algunes cel·les. Les constants 10, 50 i 1, així
170
+ com d'altres que especifiquen els paràmetres inicials del joc, estan
171
+ definides a l'arxiu d'entrada \texttt{default.cnf}. Totes les partides
172
+ es jugaran amb exactament els valors donats en aquest arxiu.
173
+
174
+ \bigskip
175
+ {\bf Execució d'ordres.}
176
+ A cada ronda es pot donar més d’una ordre a la mateixa unitat,
177
+ tot i que només se seleccionarà la primera d'elles (si n’hi ha alguna).
178
+ Tot programa que intenti donar més de 1000 comandes
179
+ durant la mateixa ronda s'avortarà.
180
+
181
+ Cada ronda, les ordres seleccionades dels quatre jugadors
182
+ s'executaran amb ordre aleatori,
183
+ però respectant l’ordre relatiu entre les unitats d’un mateix clan.
184
+ Com a conseqüència de la norma anterior, considereu la possibilitat de
185
+ donar les ordres a les vostres unitats a cada ronda de més urgent a
186
+ menys urgent.
187
+
188
+ Tingueu en compte que s’aplica cada moviment sobre el tauler
189
+ que resulta dels moviments anteriors. Per exemple, considereu el tauler
190
+
191
+ \medskip
192
+ \begin{center}
193
+ \begin{tabular}{|c|c|c|c|c|}\hline
194
+ x & x & x & x \\\hline
195
+ x & M & U & x \\\hline
196
+ x & V & x & x \\\hline
197
+ x & x & x & x \\\hline
198
+ \end{tabular}
199
+ \end{center}
200
+ \medskip
201
+
202
+ on M representa menjar i U i V dues unitats vives de diferents clans.
203
+ Imaginem que el jugador que controla U ha decidit que aquest vagi cap a l'esquerra,
204
+ i el jugador que controla V ha decidit que vagi amunt. Si s'executa
205
+ primer el moviment de V, aleshores U s'ha quedat sense menjar,
206
+ perquè V ja l'ha consumit i a més, la posterior execució del moviment de U és
207
+ un atac cap a V del qual en pot sortir malparat. Si U mor durant aquest atac,
208
+ en la visualització de la partida veurem una transició de la matriu anterior
209
+ cap a una situació on U ha desaparegut. Òbviament, no hi podia haver un atac entre U i V des
210
+ de la configuració inicial, perquè les unitats vives no es poden moure en diagonal, però l'ordre
211
+ d'execució de les comandes sí que ho ha fet possible. Tingueu això en compte quan no entengueu
212
+ certes situacions durant la visualització de les partides.
213
+
214
+ Després de l'execució de tots els moviments dels jugadors, es
215
+ procedeixen a efectuar els moviments dels zombis. En acabar, els
216
+ següents processos s'executaran en aquest ordre: les unitats que han
217
+ acabat el seu procés de conversió passaran a ser zombis, els zombis
218
+ morts es convertiran en unitats vives, una unitat del clan amb més
219
+ unitats vives potser passarà a formar part del clan amb menys unitats
220
+ vives, es regeneraran les unitats de menjar consumides i
221
+ s'actualitzaran les puntuacions.
222
+