public static int iTirageMotExistantAutre( List <string> lstNiv, List <string> lstFreq, int iNumMotExistant, clsInitTirage itPrefixe, clsInitTirage itSuffixe, List <int> lstNumMotExistant, ref clsMotExistant motAutre) { // Tirer au hasard un autre mot du niveau demandé var enreg = from mot0 in m_dicoMotsExistants.ToList() where lstNiv.Contains(mot0.Value.sNivPrefixe) && lstNiv.Contains(mot0.Value.sNivSuffixe) && lstFreq.Contains(mot0.Value.sFreqPrefixe) && lstFreq.Contains(mot0.Value.sFreqSuffixe) && !lstNumMotExistant.Contains(iNumMotExistant) && !itPrefixe.lstSegmentsDejaTires.Contains(mot0.Value.sPrefixe) && !itSuffixe.lstSegmentsDejaTires.Contains(mot0.Value.sSuffixe) && !itPrefixe.lstSensSegmentDejaTires.Contains(mot0.Value.sDefPrefixe) && !itSuffixe.lstSensSegmentDejaTires.Contains(mot0.Value.sDefSuffixe) && !itPrefixe.lstUnicitesSegmentDejaTires.Contains(mot0.Value.sUnicitePrefixeSynth) && !itSuffixe.lstUnicitesSegmentDejaTires.Contains(mot0.Value.sUniciteSuffixeSynth) select mot0; int iNbEnreg = enreg.Count(); if (iNbEnreg == 0) { //if (clsConst.bDebug) Debugger.Break(); m_msgDelegue.AfficherMsg( "Aucun mot ne correspond à la sélection : Tirage impossible !"); return(clsConst.iTirageImpossible); } int iNbMotsExistantsFiltres = iNbEnreg; // On tire un nombre compris entre 0 et iNbSegmentsFilres - 1 (liste filtrée) int iNumMotExistantTire = clsUtil.iRandomiser(0, iNbMotsExistantsFiltres - 1); motAutre = enreg.ElementAtOrDefault(iNumMotExistantTire).Value; // Indice du mot dans la liste complète int iNumMotExistantAutre = motAutre.iNumMotExistant; lstNumMotExistant.Add(iNumMotExistantAutre); itPrefixe.lstSegmentsDejaTires.Add(motAutre.sPrefixe); itSuffixe.lstSegmentsDejaTires.Add(motAutre.sSuffixe); itPrefixe.lstSensSegmentDejaTires.Add(motAutre.sDefPrefixe); itSuffixe.lstSensSegmentDejaTires.Add(motAutre.sDefSuffixe); itPrefixe.lstUnicitesSegmentDejaTires.Add(motAutre.sUnicitePrefixeSynth); itSuffixe.lstUnicitesSegmentDejaTires.Add(motAutre.sUniciteSuffixeSynth); if (clsConst.bDebug && string.IsNullOrEmpty(motAutre.sUnicitePrefixeSynth)) { Debugger.Break(); } if (clsConst.bDebug && string.IsNullOrEmpty(motAutre.sUniciteSuffixeSynth)) { Debugger.Break(); } return(iNumMotExistant); }
public int iTirageSegment(bool bComplet, List <string> lstNiv, List <string> lstFreq, clsInitTirage it, bool bGrecoLatin, bool bNeoRigolo) { // bComplet : tous les segments (y compris ceux du dictionnaire), // ou sinon seulement ceux du Logotron // lstNiveaux : combinaison des niveaux "1", "2" et/ou "3" // lstNumSegmentDejaTires : ne pas tirer à nouveau un segment déjà tiré // (pour avoir un mot avec plusieurs préfixes distincts) // lstSegmentDejaTires : ne pas tirer à nouveau un segment déjà tiré // (cette fois le segment doit être unique, dans le cas où des segments // seraient présents avec plusieurs sens) // lstSensSegmentDejaTires : ne pas tirer à nouveau un sens déjà tiré // lstUnicitesSegmentDejaTires : lié au champ unicité // (unicité explicite car le sens peut varier plus ou moins) // bGrecoLatin : seulement les segments d'origine greco-latine, // sinon les segments de toutes origines // bNeoRigolo : inclure les néologismes amusants // Il faut vérifier que le tirage est possible : compter qu'il y a // au moins 1 candidat, sinon boucle infinie dans le tirage // 01/05/2019 Test élision : // (( m_bPrefixe && seg0.sSegment.EndsWith(clsConst.sCarO) ) || // (!m_bPrefixe && seg0.sSegment.StartsWith(clsConst.sCarO))) && var lst = ObtenirSegmentBases(); var enreg = from seg0 in lst where lstNiv.Contains(seg0.sNiveau) && lstFreq.Contains(seg0.sFrequence) && ((it.lstNumSegmentDejaTires == null) || !it.lstNumSegmentDejaTires.Contains(seg0.iNumSegment)) && ((it.lstSegmentsDejaTires == null) || !it.lstSegmentsDejaTires.Contains(seg0.sSegment)) && ((it.lstSensSegmentDejaTires == null) || !it.lstSensSegmentDejaTires.Contains(seg0.sSens)) && ((it.lstUnicitesSegmentDejaTires == null) || !it.lstUnicitesSegmentDejaTires.Contains(seg0.sUnicite)) && (bComplet || seg0.sLogotron == clsConst.sSelectLogotron) && ((!bGrecoLatin && (bNeoRigolo || seg0.sOrigine != LogotronLib.enumOrigine.sNeologismeAmusant)) || (bGrecoLatin && (seg0.sOrigine == LogotronLib.enumOrigine.sGrec || seg0.sOrigine == LogotronLib.enumOrigine.sLatin || seg0.sOrigine == LogotronLib.enumOrigine.sGrecoLatin))) select seg0; int iNbEnreg = enreg.Count(); if (iNbEnreg == 0) { if (clsConst.bDebug) { Debugger.Break(); } MsgDelegue.AfficherMsg( "Aucun élément ne correspond à la sélection : Tirage impossible !"); return(clsConst.iTirageImpossible); } int iNbSegmentsFilres = iNbEnreg; // On tire un nombre compris entre 0 et iNbSegmentsFilres - 1 (liste filtrée) int iNumSegment2 = clsUtil.iRandomiser(0, iNbSegmentsFilres - 1); var seg = enreg.ElementAtOrDefault(iNumSegment2); int iNumSegment = seg.iNumSegment; // Retourner l'indice du segment dans la liste complète if (it.lstNumSegmentDejaTires != null) { it.lstNumSegmentDejaTires.Add(iNumSegment); } if (it.lstSegmentsDejaTires != null) { it.lstSegmentsDejaTires.Add(seg.sSegment); } if (it.lstSensSegmentDejaTires != null) { it.lstSensSegmentDejaTires.Add(seg.sSens); } if (seg.sUnicite.Length > 0 && it.lstUnicitesSegmentDejaTires != null) { it.lstUnicitesSegmentDejaTires.Add(seg.sUnicite); } return(iNumSegment); }
public static bool bTirage(bool bComplet, string sNbPrefixesSuccessifs, List <string> lstNiv, List <string> lstFreq, ref string sMot, ref string sExplication, ref string sDetail, ref List <string> lstEtymFin, bool bGrecoLatin, bool bNeoRigolo, clsMsgDelegue msgDelegue) { List <string> lstEtym = new List <string>(); int iNbTiragesPrefixes = 0; if (sNbPrefixesSuccessifs == clsConst.sHasard) { iNbTiragesPrefixes = clsUtil.iRandomiser(1, 5); float rProba = 1f; switch (iNbTiragesPrefixes) { case 1: rProba = 1f; // Toujours accepté break; case 2: rProba = 1 / 2f; // Une fois sur 2 //rProba = 0.1f; // Une fois sur 10 break; case 3: rProba = 1 / 4f; // Une fois sur 4 //rProba = 1/3f; // Une fois sur 3 //rProba = 0.05f; break; case 4: rProba = 1 / 8f; // Une fois sur 8 //rProba = 1/4f; // Une fois sur 4 //rProba = 0.03f; break; case 5: rProba = 1 / 16f; // Une fois sur 16 //rProba = 1/5f; // Une fois sur 5 //rProba = 0.01f; break; } if (rProba < 1f) { float rTirage = clsUtil.rRandomiser(); if (rTirage > rProba) { iNbTiragesPrefixes = 1; } } } else { iNbTiragesPrefixes = int.Parse(sNbPrefixesSuccessifs); } string sPrefixesMaj = ""; string sSensPrefixesMaj = ""; string sDetailPrefixesMaj = ""; clsInitTirage itPref = new clsInitTirage(); clsGestBase.m_prefixes.MsgDelegue = msgDelegue; clsGestBase.m_suffixes.MsgDelegue = msgDelegue; for (int i = 0; i <= iNbTiragesPrefixes - 1; i++) { //if (LogotronLib.clsConst.bDebug) // Console.WriteLine("Tirage préfixe n°" + (i + 1)); int iNumPrefixe = clsGestBase.m_prefixes.iTirageSegment(bComplet, lstNiv, lstFreq, itPref, bGrecoLatin, bNeoRigolo); clsSegmentBase prefixe = null; if (!clsGestBase.m_prefixes.bLireSegment(iNumPrefixe, ref prefixe)) { return(false); } string sNiveauP = prefixe.sNiveau; string sPrefixe = prefixe.sSegment; string sPrefixeMaj = sPrefixe.ToUpper(); string sSensPrefixeMaj2 = prefixe.sSens.ToUpper(); sSensPrefixeMaj2 = clsBase.sCompleterPrefixe(sSensPrefixeMaj2); sPrefixesMaj += sPrefixeMaj; sSensPrefixesMaj = sSensPrefixesMaj + " " + sSensPrefixeMaj2; sDetailPrefixesMaj = sDetailPrefixesMaj + sPrefixeMaj + "(" + sNiveauP + ") - "; string sEtymPrefixe = prefixe.sEtym; if (sEtymPrefixe.Length > 0) { lstEtym.Add(sPrefixe + "- : " + sEtymPrefixe); } } //if (LogotronLib.clsConst.bDebug) Console.WriteLine("Tirage suffixe"); int iNumSuffixe = clsGestBase.m_suffixes.iTirageSegment(bComplet, lstNiv, lstFreq, new clsInitTirage(), bGrecoLatin, bNeoRigolo); clsSegmentBase suffixe = null; if (!clsGestBase.m_suffixes.bLireSegment(iNumSuffixe, ref suffixe)) { return(false); } string sNiveauS = suffixe.sNiveau; string sSuffixe = suffixe.sSegment; string sSuffixeMaj = sSuffixe.ToUpper(); string sDetailSuffixeMaj = sSuffixeMaj + "(" + sNiveauS + ")"; string sSensSuffixeMaj = suffixe.sSens.ToUpper(); sMot = sPrefixesMaj + sSuffixeMaj; sExplication = sSensSuffixeMaj + sSensPrefixesMaj; sDetail = sDetailPrefixesMaj + sDetailSuffixeMaj; string sEtymSuffixe = suffixe.sEtym; if (sEtymSuffixe.Length > 0) { lstEtym.Add("-" + sSuffixe + " : " + sEtymSuffixe); } lstEtymFin = lstEtym; //msgDelegue.AfficherMsg("Test MsgBox"); return(true); }