@Override
	public void gerer(Commande commandRyan, Commande commandAlex) {

		HashMap<String, Boolean> estGele_atPre = new HashMap<>();
		estGele_atPre.put(ryan().nom(), super.estGele(ryan().nom()));
		estGele_atPre.put(alex().nom(), super.estGele(alex().nom()));
		estGele_atPre.put(slick().nom(), super.estGele(slick().nom()));
		for (GangsterService gangster : gangster()) {
			estGele_atPre.put(gangster.nom(), super.estGele(gangster.nom()));
		}

		HashMap<String, Boolean> estFrappe_atPre = new HashMap<>();
		estFrappe_atPre.put(ryan().nom(), super.estGele(ryan().nom()));
		estFrappe_atPre.put(alex().nom(), super.estGele(alex().nom()));
		estFrappe_atPre.put(slick().nom(), super.estGele(slick().nom()));
		for (GangsterService gangster : gangster()) {
			estFrappe_atPre.put(gangster.nom(), super.estGele(gangster.nom()));
		}

		checkInvariant();
		super.gerer(commandRyan, commandAlex);
		checkInvariant();

		// post 1 : estFrappe pour perso :: pas faisable (depend de la cmd de
		// l'attaqueur (donc du gangster))
		//
		// estFrappe(gerer(C, cr, ca), nom(perso))
		// = !estGele(C,nom(attacker))
		// && cmdAttacker=FRAPPE && attacker = collisionPerso(perso)
		//

		// post 2* : estFrappe pour gangster
		//
		// estFrappe(gerer(C, cr, ca), nom(gangster))
		// = !estGele(C,nom(attacker))
		// && cmdAttacker=FRAPPE && attacker = collisionGangster(gangster)
		//

		for (GangsterService gangster : gangster()) {
			if (super.estFrappe(gangster.nom())) {
				List<PersonnageService> attacker = super
						.collisionGangster(gangster);
				for (PersonnageService p : attacker) {
					Commande cmdAttacker = null;
					if (p == null)
						continue;
					if (p.nom().compareTo("Ryan") == 0) {
						cmdAttacker = commandRyan;
					} else {
						cmdAttacker = commandAlex;
					}
					if (cmdAttacker != Commande.FRAPPE) {
						throw new PostconditionError("Postcondtion numero 2");
					}
					if (estGele_atPre.get(p.nom())) {
						throw new PostconditionError("Postcondition numero 2");
					}
				}
			}
		}

		// post 3 : estGele pour perso :: pas faisable car pas d'accès au nombre
		// de gel restant
		//
		// estGele(gerer(C, cr, ca), nom(perso))
		// = estFrappe(gerer(C, cr, ca), nom(perso))
		// || !estGele(C, nom(perso)) && cmdPerso = FRAPPE
		//

		// post 4 : estGele pour gangster :: pas faisable (depend de la cmd du
		// gangster)
		//
		// estGele(gerer(C, cr, ca), nom(gangster))
		// = estFrappe(gerer(C, cr, ca), nom(gangster))
		// || !estGele(C, nom(gangster)) && cmdgangster = FRAPPE
		//

		// post 5 : ryan, faire retrait ou jeter si besoin :: pas faisable
		// (depend des cmd aléatoires)
		//
		// ryan(gerer(C, cr, ca))
		// = ryan(C) si !estFrappe(gerer(C, cr, ca), Personnage::nom(ryan(C)))
		// = Personnage::retrait(ryan(C),
		// Gangster::force(collisionPerso(C, ryan(C))))
		// (si estEquipe(collisionPerso(C)) alors * 2)
		//
		// et si Gangster::estEquipe(collisionPerso(C, ryan(C))),
		// => Gangster::jeter(collisionPerso(C, ryan(C)),
		// Terrain::getBloc(getTerrain(C), Gangster::getX(collisionPerso(C,
		// ryan(C))), Gangster::getY(collisionPerso(C, ryan(C))),
		// Gangster::getZ(collisionPerso(C, ryan(C)))))
		//

		// post 6 : alex, faire retrait ou jeter si besoin :: pas faisable
		// (depend des cmd aléatoires)
		//
		// alex(gerer(C, cr, ca))
		// = alex(C) si !estFrappe(gerer(C, cr, ca), Personnage::nom(alex(C)))
		// = Personnage::retrait(alex(C),
		// Gangster::force(collisionPerso(C, ryan(C))))
		// (si estEquipe(collisionPerso(C)) alors * 2)
		//
		// et si Gangster::estEquipe(collisionPerso(C, alex(C))),
		// => Gangster::jeter(collisionPerso(C, alex(C)),
		// Terrain::getBloc(getTerrain(C), Gangster::getX(collisionPerso(C,
		// alex(C))), Gangster::getY(collisionPerso(C, alex(C))),
		// Gangster::getZ(collisionPerso(C, alex(C)))))
		//

		// post 7* : slick, faire retrait ou jeter si besoin
		//
		// slick(gerer(C, cr, ca))
		// = slick(C) si !estFrappe(gerer(C, cr, ca), Gangster::nom(slick(C)))
		// = Gangster::retrait(slick(C),
		// Personnage::force(collisionPerso(C, slick(C))))
		// (si estEquipe(collisionGangster(C)) alors * 2)
		//
		// et si Personnage::estEquipe(collisionPerso(C, slick(C)),
		// => Personnage::jeter(collisionPerso(C, slick(C),
		// Terrain::getBloc(getTerrain(C), Personnage::getX(collisionPerso(C,
		// slick(C)), Personnage::getY(collisionPerso(C, slick(C)),
		// Personnage::getZ(collisionPerso(C, slick(C))))
		//

		// post 8* : pour chaque gangster, faire retrait ou jeter si besoin
		//
		// \foreach g \in gangster(C)
		// g(gerer(C, cr, ca))
		// = g(C) si !estFrappe(gerer(C, cr, ca), Gangster::nom(g(C)))
		// = Gangster::retrait(g(C),
		// Personnage::force(collisionPerso(C, g(C))))
		// et si Gangster::estEquipe(g),
		// => Gangster::jeter(g, Terrain::getBloc(getTerrain(C),
		// Gangster::getX(g), Gangster::getY(g), Gangster::getZ(g)))
		//

		// post 9 : ryan : traitement cmd :: pas faisable (depend de 1)
		//
		// ryan(gerer(C, cr, ca)) =>
		// Personnage::getY(ryan(gerer(C, cr, ca))) = Personnage::getY(ryan(C))
		// si !estFrappe(gerer(C, cr, ca))
		// si cr=GAUCHE
		// Personnage::getX(ryan(gerer(C, cr, ca)))
		// = max(0,
		// Personnage::getX(ryan(gerer(C))) - 1)
		// si cr=DROITE
		// Personnage::getX(ryan(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocLargeur(getTerrain(C),
		// Personnage::getX(ryan(gerer(C))) + 1))
		// si cr=HAUT
		// Personnage::getZ(ryan(gerer(C, cr, ca)))
		// = max(0,
		// Personnage::getX(ryan(gerer(C))) - 1))
		// si cr=BAS
		// Personnage::getZ(ryan(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Personnage::getX(ryan(gerer(C))) + 1))
		//
		// si estFrappe(gerer(C, cr, ca))
		// alors calcul de l'offset de déplacement sur X et Z
		// dans un tableau offset[2]
		// Personnage::getX(ryan(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocLargeur(getTerrain(C),
		// Personnage::getX(ryan(gerer(C))) + offset[0]))
		//
		// Personnage::getZ(ryan(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Personnage::getZ(ryan(gerer(C))) + offset[1]))
		//

		// post 10 : alex : traitement cmd :: pas faisable (depend de 1)
		//
		// alex(gerer(C, cr, ca)) =>
		// Personnage::getY(alex(gerer(C, cr, ca))) = Personnage::getY(alex(C))
		// si !estFrappe(gerer(C, cr, ca))
		// si cr=GAUCHE
		// Personnage::getX(alex(gerer(C, cr, ca)))
		// = max(0,
		// Personnage::getX(alex(gerer(C))) - 1)
		// si cr=DROITE
		// Personnage::getX(alex(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocLargeur(getTerrain(C),
		// Personnage::getX(alex(gerer(C))) + 1))
		// si cr=HAUT
		// Personnage::getZ(alex(gerer(C, cr, ca)))
		// = max(0,
		// Personnage::getX(alex(gerer(C))) - 1))
		// si cr=BAS
		// Personnage::getZ(alex(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Personnage::getX(alex(gerer(C))) + 1))
		//
		// si estFrappe(gerer(C, cr, ca))
		// alors calcul de l'offset de déplacement sur X et Z
		// dans un tableau offset[2]
		// Personnage::getX(alex(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocLargeur(getTerrain(C),
		// Personnage::getX(alex(gerer(C))) + offset[0]))
		//
		// Personnage::getZ(alex(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Personnage::getZ(alex(gerer(C))) + offset[1]))
		//

		// post 11 : slick : traitement cmd :: pas faisable
		//
		// slick(gerer(C, cr, ca)) =>
		// Gangster::getY(slick(gerer(C, cr, ca))) = Gangster::getY(slick(C))
		// si !estFrappe(gerer(C, cr, ca))
		// si cr=GAUCHE
		// Gangster::getX(slick(gerer(C, cr, ca)))
		// = max(0,
		// Gangster::getX(slick(gerer(C))) - 1)
		// si cr=DROITE
		// Gangster::getX(slick(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocLargeur(getTerrain(C),
		// Gangster::getX(slick(gerer(C))) + 1))
		// si cr=HAUT
		// Gangster::getZ(slick(gerer(C, cr, ca)))
		// = max(0,
		// Gangster::getX(slick(gerer(C))) - 1))
		// si cr=BAS
		// Gangster::getZ(slick(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Gangster::getX(slick(gerer(C))) + 1))
		//
		// si estFrappe(gerer(C, cr, ca))
		// alors calcul de l'offset de déplacement sur X et Z
		// dans un tableau offset[2]
		// Gangster::getX(slick(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocLargeur(getTerrain(C),
		// Gangster::getX(slick(gerer(C))) + offset[0]))
		//
		// Gangster::getZ(slick(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Gangster::getZ(slick(gerer(C))) + offset[1]))
		//

		// post 12 : pour chaque gangster, traitement cmd :: pas faisable
		//
		// \foreach g \in gangster(C)
		// g(gerer(C, cr, ca)) =>
		// Gangster::getY(g(gerer(C, cr, ca))) = Gangster::getY(g(C))
		// si !estFrappe(gerer(C, cr, ca))
		// si cr=GAUCHE
		// Gangster::getX(g(gerer(C, cr, ca)))
		// = max(0,
		// Gangster::getX(g(gerer(C))) - 1)
		// si cr=DROITE
		// Gangster::getX(g(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocLargeur(getTerrain(C),
		// Gangster::getX(g(gerer(C))) + 1))
		// si cr=HAUT
		// Gangster::getZ(g(gerer(C, cr, ca)))
		// = max(0,
		// Gangster::getX(g(gerer(C))) - 1))
		// si cr=BAS
		// Gangster::getZ(g(gerer(C, cr, ca)))
		// = min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Gangster::getX(g(gerer(C))) + 1))
		//
		// si estFrappe(gerer(C, cr, ca))
		// alors calcul de l'offset de déplacement sur X et Z
		// dans un tableau offset[2]
		// Gangster::getX(g(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocLargeur(getTerrain(C),
		// Gangster::getX(g(gerer(C))) + offset[0]))
		//
		// Gangster::getZ(g(gerer(C, cr, ca)))
		// = max(0,min(Terrain::nbBlocProfondeur(getTerrain(C),
		// Gangster::getZ(g(gerer(C))) + offset[1]))
		//

	}