====== Introduction ======
BomberLua est un projet de jeu dans la lignée de Robocode. Vous ne contrôlez pas directement le personnage, mais vous écrivez un programme (ou plutôt un script) qui se chargera, en fonction des informations auxquelles il a accès sur la zone de jeu, de diriger le personnage et de combattre les autres personnages (dirigés par d'autres scripts).
Le jeu choisi est bomberman, l'intérêt principal étant la zone de jeu particulière (pas un simple terrain vide ou presque vide) : les bombermen doivent trouver leur chemin dans l'aire de jeu, et se frayer un chemin vers ses ennemis. Eviter les bombes n'est pas toujours simple, car il faut calculer une position de repli à chaque fois que l'on pose une bombe où qu'un ennemi pose une bombe.
Il est réalisé en C++, en utilisant [[SDL]], SDL_image et [[lua|Lua 5.1]], par [[remram44|remram44]] et [[insomniak|Insomniak]] (merci à acieroid pour la prise en charge du [[Python]]).
====== Les scripts ======
Actuellement, seuls les scripts en langage [[lua|Lua]] et [[python]] sont supportés ; le support pour d'autres langages n'est actuellement pas prévu mais peut être ajouté très simplement (merci de contacter [[remram44]] si vous pouvez implémenter un nouveau langage). Lors de son chargement, un bot dispose de 5 secondes pour s'initialiser, qu'il peut mettre à profit pour précalculer certaines données en fonction du terrain de jeu (bien qu'actuellement un seul terrain ne soit disponible). Une fois son initialisation terminée, il doit appeler la fonction ready() (avant que les 5 secondes ne soient écoulées).
Pendant la phase de jeu, les bots ont accès aux fonctions suivantes :
* get_self : cette fonction retourne des informations sur le bomberman dirigé par le bot. Elle retourne une table contenant deux champs : posx et posy, la position du personnage sur le terrain.
* get_bombers : retourne une table de tous les bombermen. Chaque bomberman y est associé à un nombre (qui identifie ce bomberman pendant toute la partie) ; la structure décrivant chaque bomberman est la même que celle retournée par get_self.
* get_field : retourne le terrain, sous la forme d'une table. Les champs w et h indiquent la dimension du terrain de jeu, et à chaque chaîne "x,y" est associée le type de la case, c'est à dire :
* "rock" : un mur indestructible
* "brick": un mur qui peut être détruit par une bombe
* un nombre : pas de mur, mais une bombe qui explosera dans cette durée (en secondes)
* "explosion" : pas de mur, mais une explosion
* "empty" : rien
* wait : permet de ne rien faire ; cette méthode devrait être appelée lorsque le script ne fait rien pour indiquer qu'il n'est pas simplement planté, à cause d'une boucle infinie par exemple.
* move : permet de se déplacer. Prend en paramètre la direction, c'est à dire "left", "right", "up" ou "down".
* bomb : permet de poser une bombe.
====== Téléchargement et installation ======
===== Windows =====
Un zip avec les sources et le programme (cross-compilé avec mingw, pas testé...) : http://wiki.nyug.org/~remram44/bomberlua-win.zip
===== Linux =====
Une archive avec les sources ; vous aurez besoin de [[lua|lua5.1]], [[SDL]] et SDL_image pour les compiler : http://wiki.nyug.org/~remram44/bomberlua.tar.gz
===== Subversion =====
La dernière version peut être trouvée sur Subversion : http://svn.nyug.org/bomberlua
====== Utilisation ======
Il existe un "launcher" graphique utilisant Qt permettant de lancer le jeu sans avoir à utiliser la ligne de commande. Sinon, vous pouvez utiliser les options ci-dessous :
Les options reconnues par le jeu sont :
* -i pour l'affichage graphique (oui je sais, lancer sans n'aurait pas vraiment d'intérêt pour le moment)
* entre 1 et 4 scripts à charger
Exemples :
* ./bomberlua -i bots/test.lua bots/scripted.lua bots/test.lua # Linux
* bomberlua.exe -i bots/test.lua bots/scripted.lua bots/test.lua # Windows
====== Exemples ======
Actuellement, je suis en attente de bots fonctionnels pour commencer la compétition :-) Je mettrai sur cette page des exemples de bots quand j'en aurai d'autres.
===== Test =====
-- Ce programme a servi à tester les déplacements et les animations pendant le
-- développement du jeu. Il n'a aucun comportement défensif ou offensif, il se
-- déplace simplement sur l'aire de jeu.
-- initialisation : définit des fonctions utiles
function can_go (direction, bomber, map)
if direction == “right” and (map[(bomber.posx + 1) .. ”,” .. bomber.posy] == “empty”) then
return true
elseif direction == “up” and (map[bomber.posx .. ”,” .. (bomber.posy - 1)] == “empty”) then
return true
elseif direction == “left” and (map[(bomber.posx - 1) .. ”,” .. bomber.posy] == “empty”) then
return true
elseif direction == “down” and (map[bomber.posx .. ”,” .. (bomber.posy + 1)] == “empty”) then
return true
else
return false
end
end
function next_dir(direction, wall)
if wall == “right” then
if direction == “right” then
return “down”
elseif direction == “up” then
return “right”
elseif direction == “left” then
return “up”
elseif direction == “down” then
return “left”
else
return “right”
end
elseif wall == “left” then
if direction == “right” then
return “up”
elseif direction == “up” then
return “left”
elseif direction == “left” then
return “down”
elseif direction == “down” then
return “right”
else
return “right”
end
end
end
function invert_wall(wall)
if wall == “right” then
return “left”
elseif wall == “left” then
return “right”
end
end
wall = “left”
ready ()
-- boucle de jeu
while 1 do
map = get_field()
bomber = get_self()
-- on choisit une direction de telle façon que le bomber suive le mur situé
-- à sa gauche
direction = next_dir(direction, invert_wall(wall))
while not can_go(direction, bomber, map) do
direction = next_dir(direction, wall)
end
-- on va dans la direction choisie
move (direction)
-- une chance sur 5 de poser une bombe
if math.random(1, 5) == 1 then
bomb()
end
-- on a une chance sur 5 de changer de mur à suivre
if math.random(1, 5) == 1 then
wall = invert_wall(wall)
end
end