C++ mastermind erreur (code joint)

Fermé
zareb - 9 juin 2006 à 23:30
 zareb - 10 juin 2006 à 12:42
bonjour!
j'ai décidé de me mettre au c++ hier, et aujourdui je m'étais mis en tete de faireun mastermind.
tout semble marcher, la génération aléatoire des chiffres, la comparaison des propositions du joueur et des chiffres trouvés... en fait il n'y a qu'un seul probleme : quelle que soit la combinaison que l'on entre, on gagne, malgré des 'sécurités' que j'ai pensé a mettre (je ne sais pas si elles servent, mais bon - elles sont là...)

voici le code, si quelqu'un veut bien se pencher dessus et me dire ou je me suis planté, et bien... merci

// Mastermind.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "time.h"
using namespace std;


int main()
{
	int MAX = 9;
    int MIN = 0;
	int solution1;
	int solution2;
	int solution3;
	int solution4;
	
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);
{
solution1 = rand() % (MAX - MIN +1 ) + MIN;
solution2 = rand() % (MAX - MIN +1 ) + MIN;
solution3 = rand() % (MAX - MIN +1 ) + MIN;
solution4 = rand() % (MAX - MIN +1 ) + MIN;
}
cout<< solution1 << "," << solution2 << "," << solution3 << "," << solution4 << endl;

int a, b, c, d, X;
int bienpl;
int malpl;
X = 2;
while (X > 1)
{
	bienpl=0;
		malpl=0;
	cout<< "donnez 4 chiffres entre 0 et 9 compris" << endl;
	cin >> a >> b >> c >> d;
	
	//conditions pour a
	if(a=solution1);{bienpl=bienpl+1;}
	if(a=solution2);{malpl=malpl+1;}
    if(a=solution3);{malpl=malpl+1;}
    if(a=solution4);{malpl=malpl+1;}
	//conditions pour b
	if(b=solution1);{malpl=malpl+1;}
	if(b=solution2);{bienpl=bienpl+1;}
    if(b=solution3);{malpl=malpl+1;}
    if(b=solution4);{malpl=malpl+1;}
	//conditions pour c
	if(c=solution1);{malpl=malpl+1;}
	if(c=solution2);{malpl=malpl+1;}
    if(c=solution3);{bienpl=bienpl+1;}
    if(c=solution4);{malpl=malpl+1;}
	//conditions pour d
    if(d=solution1);{malpl=malpl+1;}
	if(d=solution2);{malpl=malpl+1;}
    if(d=solution3);{malpl=malpl+1;}
    if(d=solution4);{bienpl=bienpl+1;}
	cout<< "bons chiffres bien places: "<< bienpl << endl;
	cout<< "bons chiffres mal places: "<< malpl << endl;

	if(a = solution1);
	{
		if(b = solution2);
		{
			if(c = solution3);
			{
				if(d = solution4);
				{
	cout<< "vous remportez la partie !";
	X=0;
	bienpl = 0;
	malpl = 0;
			}
		}
	}
	}
}
Sleep(3000);
	return 0;
}

A voir également:

3 réponses

mamiemando Messages postés 33140 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 juin 2024 7 756
10 juin 2006 à 11:44
Oui c'est normal tu as mis partout dans tes conditions :
if(a=solution1)

Ce que signifie que tu affectes solution1 à "a". Comme cette valeur est a priori non nulle, le test est a priori toujours vérifié. Il faut que tu mettes :
if(a==solution1)

Bonne chance
0
mamiemando Messages postés 33140 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 juin 2024 7 756
10 juin 2006 à 11:59
Dans un souçis de lisibilité et de généricité de ton code, il pourrait être intéressant de commencer à faire des jolies fonctions afin d'améliorer le code. On pourrait par exemple imaginer faire un mastermind à n cases et p couleurs. En supposant que tu stockes une solution dans un std::vector :

Je te donne le debut, à toi de finir si le coeur t'en dit ;)

#include <vector>
#include <cassert>
#include <iostream>

typedef std::vector<unsigned int> solution_t;

unsigned int randint(unsigned int max){
  //...
}

void generer_code(
  solution_t & solution,
  unsigned int nb_couleur,
  unsigned int nb_cases
){
  solution = solution_t(nb_cases);
  for(unsigned int i=0;i<nb_cases;++i){
    solution[i] = randint(nb_couleur);
  }
}

void show_solution(const solution_t & sol){
    for(unsigned int i=0;i<sol.size();++i){
      std::cout << sol[i] << ' ';
    }
    std::cout << std::endl;
}

void read_proposition(
  solution_t & prop
){
  //Lire sur std::cin la proposition
}

unsigned int get_nb_valid(
  const solution_t & solution,
  const solution_t & proposition
){
  unsigned int nb_valid=0,i;
  assert(solution.size()==proposition.size())
  for(std::size_t i=0;i<solution.size();++i){
    if (solution[i]==proposition[i]){
      std::cout << i << "eme nombre correct" << std::endl;
      ++nb_valid;
    }
  }
  return nb_valid;
}

unsigned int get_nb_mal_place(
  const solution_t & solution,
  const solution_t & proposition
){
  unsigned int nb_mal_place=0,i;
  assert(solution.size()==proposition.size())
  for(std::size_t i=0;i<solution.size();++i){
    if (solution[i]!=proposition[i]){
      for(std::size_t j=0;j<solution.size();++j){
        if (i!=j && solution[i]==proposition[j]){
          ++nb_mal_place;
          break;
        }
      }
    }
  }
  return nb_mal_place;
}

int main(){

  solution_t sol;
  solution_t prop;
  generer_code(sol,8,4);
  unsigned int nb_essai=5,nb_valid,nb_mal_place;
  bool gagne = false;

  for(unsigned int i=1;i<=nb_essai && !gagne;++i){
    std::cout << "Essai (" << i << '/' <<nb_essai << ')' << std::endl;
    //Lire le code proposé et le mettre dans prop
    //....
    //Comparer la proposition à la solution
    nb_valid = get_nb_valid(sol,prop);
    if (nb_valid == sol.size()){
      gagne = true;
    }
    std::cout << nb_valid << " nombres sont valides" << std::endl;
    nb_mal_place = get_nb_mal_place(sol,prop);
  }

  if (gagne) std::cout << "Gagné !" << std::endl;
  else{
    std::cout << "Perdu :( La solution était " << std::endl;
    show_solution(sol);
  }
  return 0;
}


Bonne chance
0
merci!
je vais tester ça!
0