Tp2

Fermé
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014 - 19 nov. 2014 à 15:15
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014 - 19 nov. 2014 à 20:59
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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
19 nov. 2014 à 15:46
'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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 16:20
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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 16:23
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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 17:18
desole mais je panique car il faut que je le rend dans 2h donc bonjour et merci beaucoup meme
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 19/11/2014 à 17:46
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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 18:40
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
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 19/11/2014 à 19:23
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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 20:07
oui mais je n'est pas le droit que a un seul return
c sa qui est dur
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 19/11/2014 à 20:33
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
weldfatouma Messages postés 9 Date d'inscription mercredi 19 novembre 2014 Statut Membre Dernière intervention 30 novembre 2014
19 nov. 2014 à 20:59
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