Croyez-moi, ça en vaut vraiment, vraiment la peine. À titre illustratif, voici quelques informations concernant la finale :

Liste des activités organisées (non exhaustive)

  • Banquet ;
  • Barbe à papa ;
  • Bataille d'eau ;
  • Concerts ;
  • Demos ;
  • Discussions entre geeks ;
  • DJ ;
  • Feu d'artifice ;
  • Formation au logiciel libre ;
  • Jonglage ;
  • Karaoké ;
  • LAN ;
  • Lasers ;
  • Présentations ;
  • Programmation ;
  • Réveils en fanfare ;
  • Surprises ;
  • Tetris ;
  • Très peu de sommeil.

Diagramme de mes activités

Quelques perles de code

Manque de temps, manque de sommeil... cela favorise l'apparition de certaines perles lors de la correction du code. Faute d'avoir gagné un prix, j'aurai au moins fait rigoler (ou pleurer) les correcteurs. Toutes ces perles sont tirées de la version finale du programme, que j'ai rendue. (Du moins, si je me souviens bien de quelle version j'ai rendue...)

Pour embrouiller le relecteur...

/* FIXME2: à utiliser */
#define MENACE_ALLIE_MALUS_ATTAQUE_CELLULE_SAINE 50

À comprendre...

#define SCORE_VIRUS_PHAGO 20.0
#define SCORE_CELL_PHAGO 20.0
#define SCORE_LEUCO_PHAGO 200.0 /* NB c'est un coefficient */

Bien la peine...

/* Distance max à considérer dans l'exploration des distances (en Manhattan) */
#define MAX_RANGE 1

Bon courage...

/* Coefficient d'incertitude au cours du temps pour chaque type.
   (à la puissance du nombre de jours pour aboutir à un pourcentage) */
const float certainty = {1, 1, 0.2, 0.9, 0.7, 0.2} ;

Ce serait bête, hein ?

/* Pour ne pas s'agglutiner bêtement */

#define PERIMETRE 1
#define PENALTY_POW 3000
#define PENALTY_ENNEMY_NEAR 10;

Ça devrait valoir 1...

/* Ratio des menaces pour priorités d'attaque, le total devrait valoir 1, allie virus bactérie */

#define MENACE_ALLIE 0
#define MENACE_VIRUS 1
#define MENACE_BACTERIE 2

Vanité...

/*
  Notre algorithme de chiffrement des messages révolutionnaire est réputé incassable.

Flemmard...

} else {
  /* Ne nous fatiguons pas, ce n'est pas le travail de cette fonction */
  return BAD_ARGUMENT;

Dommage !

if (consistent() == SUCCESS)
{
  /* Les données sont cohérentes après vérification, c'est donc un message au format privé */
  /* On lui accorde donc la validation */
  _typep = VALID;
  return SUCCESS;
} else {
  /* Non ? Tant pis, dommage */
  return BAD_ARGUMENT;
}

Fonction essentielle.

int thirdparty_parse_message(int id)
{
  /* Fonction de gestion des messages dans un format privé inconnu */

  /* Tentatives élémentaires de décodage */
  /* Gestion de la cohérence, des menaces etc */
  /* FIXME4 */

  return BAD_ARGUMENT;
}

OSEF !

case COM_WHITEFLAG:

  /* On s'en moque :-) */

  break;

Evil mastermind !

case INVALID:
     
  /*
    Le message est une tentative maladroite et pitoyable de nous induire en erreur.
    De fait, les informations qu'il renferme sont très probablement fausses.
    Cela veut dire qu'on ne peut plus avoir confiance en ses alliés !
    On divise par deux la confiance accordée aux messages d'info adverse.
    FIXME4 : crédit négatif aux infos du message
  */
  
  credibilite_allie /= 2;

OSEF toujours.

case COM_WHITEFLAG:

  /* On s'en moque aussi :-) */

  break;

Désespoir...

 printf("failed.\n");

/* Tant pis, que voulez-vous ! */
/* On arrête là, et on doit quand même retourner SUCCESS
   (quelle vie !) */
return SUCCESS;

Programmeur fou...

/* Maintenant que le message sous sa forme intelligible nous attend bien au chaud
   dans des variables globales, on fait le travail d'interprétation proprement dit */

Technique astucieuse...

/* Mesure de prudence... */
while (init_competences() != SUCCESS)
  ;

Hem...

} else {
  return 0; /* There be dragons... */
}

Mes plus belles pièces (1).

int allies_contigus()
{
  if (
      (regarde(position_leucocyte_x(mon_identifiant()),
       position_leucocyte_y(mon_identifiant()) + 1)
        == WHITE_CELL
       && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()),
                                       position_leucocyte_y(mon_identifiant())+ 1))
        != mon_equipe())
     || (regarde(position_leucocyte_x(mon_identifiant()),
                 position_leucocyte_y(mon_identifiant()) - 1)
        == WHITE_CELL
       && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()),
                                       position_leucocyte_y(mon_identifiant())- 1))
        != mon_equipe())
     || (regarde(position_leucocyte_x(mon_identifiant()) + 1,
                 position_leucocyte_y(mon_identifiant()))
        == WHITE_CELL
       && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()) + 1,
                                         position_leucocyte_y(mon_identifiant())))
       != mon_equipe())
     || (regarde(position_leucocyte_x(mon_identifiant()) - 1,
                 position_leucocyte_y(mon_identifiant()))
        == WHITE_CELL
       && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()) - 1,
                                         position_leucocyte_y(mon_identifiant()))
        != mon_equipe()))
     )
  { return 1; } else { return 0; }
}

Mes plus belles pièces (2).

int agresseur()
{
  int t, x, y;

  if (\(regarde((x = position_leucocyte_x(mon_identifiant())),
               (y = position_leucocyte_y(mon_identifiant())) + 1)
      == WHITE_CELL)
      && (equipe(t = identifiant_leucocyte(x, y+1)) != mon_equipe())
      && (etat_leucocyte(t) == STATE_PHAGOCYTOSING))
    { return t; }

  if ((regarde(x, y-1) == WHITE_CELL)
      && (equipe(t = identifiant_leucocyte(x, y-1)) != mon_equipe())
      && (etat_leucocyte(t) == STATE_PHAGOCYTOSING))
    { return t; }

  if ((regarde(x+1, y) == WHITE_CELL)
      && (equipe(t = identifiant_leucocyte(x+1, y)) != mon_equipe())
      && (etat_leucocyte(t) == STATE_PHAGOCYTOSING))
    { return t; }

  if ((regarde(x-1, y) == WHITE_CELL)
      && (equipe(t = identifiant_leucocyte(x-1, y)) != mon_equipe())
      && (etat_leucocyte(t) == STATE_PHAGOCYTOSING))
    { return t; }
  return INVALID_COMMAND;

}

Tristesse...

case CELL_STATE_DEAD:
 
/* Que peut-on en faire, sinon pleurer sur le sort de cette pauvre
   cellule innocente morte pour la bonne cause ? */

return -1; // (Ouin ouin)

Pessimisme.

case VIRUS:

  /* FIXME1: Oui mais, ce n'est guère subtil et n'est peut-être pas optimal */
  /* FIXME1: (utilisation d'anticorps, astuces pour trahir etc.) */

  return mult_p * menaceMENACE_VIRUS*SCORE_VIRUS_PHAGO;

  break;

Prudence.

}

/* Euh... normalement rien, mais sait-on jamais... */

printf("@Une action est passée entre les mailles du filet de traitement.");

return 0;

Pour rien...

{
  /* On cherche à phagocyter un virus,
     on est pile à une case en diagonale,
     on n'a pas de traîtres potentiels aux basques.
     Donc : on ne fait rien. */

Conditionnel génial

if (1) // inutile de filtrer sur le type de terrain, c'est potentiellement intéressant partout
  {

Vengeance !

if(etat_leucocyte(mon_identifiant()) == STATE_BEING_PHAGOCYTED)
{
  /* Hein ! Mais ... On nous attaque ! Jamais possible d'avoir la paix */

  update_menace(MENACE_ALLIE, MALUS_AGRESSION); // Et vlan !

Mon code

Pour ceux que ça intéresserait, vous pouvez télécharger l'ensemble de mon code. Je vous le déconseille instamment, toutefois. Il est buggé, illisible (voir plus haut), peu performant (je n'ai fini que 44ème, soit parmi les derniers de ceux qui avaient un programme qui marchait), et issu d'une gestion du temps tout à fait pathétique (mais je compte faire mieux cette année, si je suis pris à nouveau). Si vous le voulez quand même :

Participez !

C'est là un conseil que je vous donne. Ça ne prend pas longtemps et ça en vaut la peine. L'an dernier, je l'ai fait un soir, comme ça, juste pour voir, et j'ai été retenu. (Mais bon, si vous ne participez pas, tant pis pour vous. Ça me fera plus de chances de me qualifier :-)).