Tp2

weldfatouma Messages postés 10 Statut Membre -  
weldfatouma Messages postés 10 Statut Membre -
public class Tp2{
public static String appliquerCoup(String combinaison, String coup){
String resultatDeSoustraction;
int n;
if(combinaison == null || combinaison.length()<1||coup == null || coup.length()<1||combinaison=="000"){
resultatDeSoustraction = "";
}else if(combinaison.length()==coup.length()){
n=combinaison.length();
resultatDeSoustraction = "";
for(int i=0;i<n;i++){
int couFinal=combinaison.charAt(i)-coup.charAt(i);
if(couFinal<'0'){
couFinal=0;
}
resultatDeSoustraction =resultatDeSoustraction+Math.max(0,combinaison.charAt(i)-coup.charAt(i));
}
}else{
resultatDeSoustraction = "";
}
return resultatDeSoustraction;
}
public static boolean auMoinsUnCaracValide(String s, char min , char max ){
boolean unCharValide = false;
int i=0;
if(s==null||s==""){
unCharValide=false;
}else{
do {
if (s.charAt(i) >= min && s.charAt(i) <= max){
unCharValide = true;
} else {
unCharValide = false;
}
i++;
}while(unCharValide == false && i < s.length());
}
return unCharValide;
}
public static boolean tousLesCaracValides(String s, char min , char max ){
boolean tousCharsValides = true;
int i=0;
if (s == "" || s == null){
tousCharsValides = false;
} else {
do {
if (s.charAt(i) < min || s.charAt(i) > max){
tousCharsValides = false;
} else {
tousCharsValides = true;
}
i++;
}while(tousCharsValides == true && i < s.length());
}
return tousCharsValides;
}
public static boolean coupEstValide(String combinaison, String coup){
int i=0;
boolean estValide = true;
if(combinaison==null||coup==null||coup=="000"||coup==""||combinaison==""||appliquerCoup(combinaison, coup) == combinaison){
estValide=false;
}else if (combinaison.length() == coup.length()){
do{
char t =coup.charAt(i);
if(t <'0' ||t >='3'){
estValide = false;
}
i++;
}while(i<coup.length()&&estValide==false);
}
return estValide;
}
public static void main (String[] params) {
String combinaison="";
String coup="";
boolean combinaisonValide =true ;
int compteurGagnant =0;
int i= 0;
char min = 0;
char max = 3;
do {
System.out.println(MessagesTp2.COMBINAISON_INITIALE);
combinaison = Clavier.lireString();
if (combinaison.length() < 3 || combinaison.length() > 3||combinaison.charAt(i) < '2' || combinaison.charAt(i) >'9'){
combinaisonValide = false;
System.out.println(MessagesTp2.COMBINAISON_INVALIDE);
}else if(combinaison.length() == 3&&combinaison.charAt(i) >= '2' && combinaison.charAt(i) <='9'){
combinaisonValide = true;
}
i++;
}while(combinaisonValide == false);
do{
if(compteurGagnant % 2 == 0){
System.out.println(MessagesTp2.COUP_DU_JOUEUR1);
}else{
System.out.println(MessagesTp2.COUP_DU_JOUEUR2);
}
coup =Clavier.lireString();
if(tousLesCaracValides(coup, min ,max) == false &&auMoinsUnCaracValide( coup, min , max )){
System.out.println(MessagesTp2.COUP_INVALIDE);
}else{
System.out.println("=> "+appliquerCoup(combinaison,coup));
combinaison=appliquerCoup(combinaison,coup);
compteurGagnant++;
}
}while (combinaison!="000");
if(compteurGagnant % 2 == 0){
System.out.println(MessagesTp2.GAGNANT_JOUEUR1);
}else{
System.out.println(MessagesTp2.GAGNANT_JOUEUR2 );
}
} // main
}
mais sa marche pas pour sortir de la bouqule de combinaison!="000"

5 réponses

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut, et avec Bonjour et Merci ça serait bien aussi.
    Et si tu nous expliquait tu coinces plutôt que de nous balancer tout tout con code, qui plus est qui n'est pas dans des balises < code></code> (sans l'espace)... Tu dis avoir un problème sur
    combinaison!="000"
    , mais on ne sait pas comment tu arrives là. En lisant en diagonale je dirais que c'est une sorte de jeu a 2 joueurs avec des combinaisons, mais il serait judicieux de nous en dicter les règles...
    0
  2. weldfatouma Messages postés 10 Statut Membre
     
    ok je vous donne le sujet
    Il s'agit de mettre en oeuvre un jeu de stratégie. Le jeu se joue à deux (à tour de rôle). Il y a principalement trois concepts
    utilisés dans ce jeu : combinaison, coup, et application d'un coup sur une combinaison. Ces termes vont être expliqués dans les
    paragraphes suivants.
    Au début du jeu, le programme demande de saisir une « combinaison ». L'un des deux joueurs (peut importe lequel) doit,
    alors, saisir une combinaison valide. Une combinaison est valide si elle est composée de trois chiffres, chacun étant dans
    l'intervalle [2 .. 9] (inclusivement). Par exemple, la combinaison « 302 » n'est pas valide car elle contient un chiffre qui
    n'est pas dans l'intervalle [2 .. 9]. La combinaison « 3H2 » n'est pas valide car elle continent une lettre (votre programme
    doit traiter ce type d'entrée invalide). Si l'utilisateur saisit une valeur invalide pour la combinaison initiale, le programme
    doit afficher un message d'erreur et lui proposer de saisir une nouvelle valeur (consultez les tests de base pour voir les
    messages qu'il faudra afficher).
    Si l'utilisateur saisit une combinaison valide (« 392 » par exemple), le programme doit demander au premier joueur de
    saisir son premier coup. Un coup est valide s'il est composé de 3 chiffres ayants chacun une valeur numérique entre 0 et
    3 (inclusivement) et au moins un de ces chiffres doit avoir une valeur différente de 0. Par exemple, le coup « 240 » n'est
    pas valide car il contient un chiffre supérieur à 3. Le coup « 320 » est un coup valide.
    Si l'utilisateur saisit un coup qui respecte ces contraintes, ce coup sera appliqué à la combinaison initiale pour générer une
    nouvelle combinaison. La nouvelle combinaison correspond au résultat d'une opération de soustraction spéciale entre
    les chiffres de la combinaison initiale et ceux du coup du joueur. Par exemple, soit la combinaison « 432 » et le coup « 110
    », la nouvelle combinaison doit être « 322 » (soit 432 ? 110). Un autre exemple, soit la combinaison « 324 » et le coup «
    333 », la nouvelle combinaison doit être « 001 ». Remarquez qu'il ne s'agit pas d'appliquer une simple soustraction entre
    la combinaison et le coup (324 ? 333 = ?9), ce qu'il faut faire c'est une soustraction chiffre par chiffre (soit 3 ? 3 = 0,
    2 ? 3 = ?1, 4 ? 3 = 1) ensuite il faut forcer à 0 les valeurs négatives (ce qui donne « 001 »). Un dernier exemple, soit la
    combinaison « 013 » et le coup « 201 », en appliquant la soustraction chiffre par chiffre et en forçant les valeurs négatives
    à 0, nous obtenons la nouvelle combinaison « 012 ». La nouvelle combinaison générée remplace ainsi la combinaison
    initiale.
    Dans le cas où le coup appliqué à la combinaison génère une combinaison qui lui est identique, le coup sera considéré
    comme non valide et on redemandera au joueur de saisir un nouveau coup valide. Par exemple, soit la combinaison « 032
    » et le coup « 100 », la nouvelle combinaison résultant de l'application de ce coup à cette combinaison est « 032 ». Le coup
    est donc rejeté et un nouveau coup sera demandé. Après chaque coup accepté, la nouvelle combinaison doit être affichée
    et elle doit remplacer la combinaison initiale (les coups suivants sont alors appliqués à cette nouvelle combinaison).
    Le programme se termine quand la valeur de la combinaison initiale devient « 000 » et le joueur perdant est celui qui a
    provoqué cette terminaison. Le programme doit, alors, afficher l'identifiant du joueur gagnant
    0
  3. weldfatouma Messages postés 10 Statut Membre
     
    et pour les test
    -- Test 01
    Combinaison initiale:
    122
    Combinaison invalide!
    Combinaison initiale:
    222
    Coup du joueur 1:
    101
    => 121
    Coup du joueur 2:
    121
    => 000
    Gagnant: Joueur 1
    -- Test 03
    Combinaison initiale:
    2222
    Combinaison invalide!
    Combinaison initiale:
    222
    Coup du joueur 1:
    101
    => 121
    Coup du joueur 2:
    121
    => 000
    Gagnant: Joueur 1
    -- Test 05
    Combinaison initiale:
    222
    Coup du joueur 1:
    410
    Coup invalide!
    Coup du joueur 1:
    101
    => 121
    Coup du joueur 2:
    121
    => 000
    Gagnant: Joueur 1
    -- Test 07
    Combinaison initiale:
    222
    Coup du joueur 1:
    321
    => 001
    Coup du joueur 2:
    001
    => 000
    Gagnant: Joueur 1
    0
  4. weldfatouma Messages postés 10 Statut Membre
     
    desole mais je panique car il faut que je le rend dans 2h donc bonjour et merci beaucoup meme
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    Bon, après une petite vérif, ton programme semble correct :)
    Ceci dit, ton problème pour sortir de la boucle vient d'une erreur communément faite en Java: la comparaison d'un String ne se fait pas avec
    ==
    !
    En effet,
    ==
    vérifie que les 2 objets String sont les mêmes, dans le sens strict de
    a = b
    ; tandis que ce que tu veux c'est comparer le contenu du String, il faut donc se servir de
    !combinaison.equals("000")
    à la place de ta condition.
    Oui, en Java, un string peut être identique (en contenu) mais pas égal à un autre (en référence).
    from human import idiocy
    del idiocy
    0
    1. weldfatouma Messages postés 10 Statut Membre
       
      vraiment merci
      mais dans la methode coupEstValide j'ai des probleme avec les test:(48 et 46 ) sa me sort toujour true.
      Signature : public static boolean coupEstValide (String combinaison, String coup )
      Cette méthode vérifie si le coup reçu en paramètre est valide vis à vis la combinaison reçues en paramètre.
      Pour cette méthode, un coup est considéré valide s'il est de même longueur que la combinaison et s'il est composé
      uniquement de chiffres entre 0 et 3 inclusivement et qu'au moins un de ces chiffres doit avoir une valeur différente
      de 0. De plus, le résultat de l'application du coup à la combinaison reçus en paramètre ne doit pas produire la
      même combinaison.
      Notez que cette définition est légèrement différente de celle donnée avec l'énoncé (plus spécifiquement, on ne
      limite pas la longueur du coup à trois chiffres dans cette méthode).
      La valeur false sera retournée dans le cas d'une chaîne null ou vide (voir les tests).
      Numéro de test Appel de méthode Valeur retournée
      48.test coupEstValide( "555", "401" ) false
      45.test coupEstValide( "333", "000" ) false
      46.test coupEstValide( "303", "010" ) false
      44.test coupEstValide( "333", "101" ) true
      47.test coupEstValide( "3333", "0100" ) true
      54.test coupEstValide( "", "202" ) false
      56.test coupEstValide( null, "202" ) false
      vraiment un grand merci
      0
    2. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      public static boolean coupEstValide(String combinaison, String coup){
      	if (combinaison == null || coup == null || // 1ere chose a faire pour éviter un NullPointerException
      		combinaison.length() == 0 || coup.length() == 0 || // Équivaut à vérifier l'identité à ""; si l'un des 2 est vide, il n'y a aucun intéret a continuer
      		combinaison.length() != coup.length() || // Si les 2 n'ont pas la même longueur, on ne peut pas faire la soustraction
      		appliquerCoup(combinaison, coup).equals(combinaison)) // Pas de vérif coup=="000", car ça ne vérifierais le critère que pour un coup et une combi de longueur 3, or on veut d'une longueur arbitraire
      		return false;
      
      	int i = 0;
      	boolean aAutreQueZero;
      	do {
      		char t = coup.charAt(i);
      		if (t <'0' || t >='3')
      			return false; // On a un autre caractère que 0,1,2 ou 3: c'est pas bon, on quitte directement
      		if (t == '1' || t =='2')
      			aAutreQueZero = true;
      		i++;
      	} while (i < coup.length());
      	return aAutreQueZero; // On a vérifié tous les autres critères, il ne reste que à savoir s'il y a au moins un chiffre != 0
      }
      0
    3. weldfatouma Messages postés 10 Statut Membre
       
      oui mais je n'est pas le droit que a un seul return
      c sa qui est dur
      0
    4. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      C'est quoi cette consigne insensée? Faire un code avec 1 ou plusieurs return revient au même, ne serais-ce que celui avec 1 seul return plus embêtant a coder...
      public static boolean coupEstValide(String combinaison, String coup){
      	boolean estValide = true;
      	if (combinaison == null || coup == null || // 1ere chose a faire pour éviter un NullPointerException
      		combinaison.length() == 0 || coup.length() == 0 || // Équivaut à vérifier l'identité à ""; si l'un des 2 est vide, il n'y a aucun intéret a continuer
      		combinaison.length() != coup.length() || // Si les 2 n'ont pas la même longueur, on ne peut pas faire la soustraction
      		appliquerCoup(combinaison, coup).equals(combinaison)) // Pas de vérif coup=="000", car ça ne vérifierais le critère que pour un coup et une combi de longueur 3, or on veut d'une longueur arbitraire
      		estValide = false;
      
      	int i = 0;
      	boolean aAutreQueZero;
      	if (estValide) {
      		do {
      			char t = coup.charAt(i);
      			if (t <'0' || t >='3') {
      				estValide = false; // On a un autre caractère que 0,1,2 ou 3: c'est pas bon, on quitte directement
      				break;
      			}
      			if (t == '1' || t =='2') {
      				aAutreQueZero = true;
      				break;
      			}
      			i++;
      		} while (i < coup.length());
      	}
      	return estValide && aAutreQueZero; // On a vérifié tous les autres critères, il ne reste que à savoir s'il y a au moins un chiffre != 0
      }
      Comme je dis, c'est substantiellement la même chose...
      0
    5. weldfatouma Messages postés 10 Statut Membre
       
      rebonjour
      desole si je vous demande trop mais pour ce :46.test coupEstValide( "303", "010" ) false.
      rien a faire il me sort toujour true.
      0