Bon allé une derniere petite mise a jour.
En fait dans le recherche de la case suivante, on pouvait passer de la 0 à la 4 (donc début de ligne à fin de même ligne), et l’erreur était là.
J'ai donc changé l'array de la direction qui était des int pour avoir juste la case suivante par des vector2int qui donnent directement le changement de colonne et de ligne pour savoir si on est bien dans la grille.
J'ai aussi tout comme toi ajouté une condition pour l'ajout des doublons. En plus que ce soit des doublons dans le dico, ce sont aussi des doublons car il y a plusieurs façon d’écrire un seul mot en se promenant sur la grille.
J'ai aussi rajouté la possibilité de trouver juste le mots a partir d'une seule case de la grille, en cliquant dessus, et le bouton "rechercher tout" au lieu de presser "r".
As-tu vu aussi qu'en ajoutant asssez de lettre a "A" dans initialisegrille() tu pouvait augmenter la taille de la grille, tant que le nombre de lettre de "A" est supérieur ou égale a tailleGrille x tailleGrille?
Code : Tout sélectionner
using System;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System.IO;
public class TestMots : MonoBehaviour
{
private string DICOpath = "C:/Users/djuli/Documents/dico.txt";
private string[] Dictionnaire;
private int[][] DicoNumérique;
private int[] MotsFinal;
private int MotsFinalCount;
private string[] MotsFinalString;
private int TailleGrille = 5;
private int[] grille;
private Vector2Int[] dir;
private char[] Alpha;
private int Scroll;
void Start ()
{
InitialiseGrille ();
InitialiseDico ();
RechercheMot ();
}
void OnGUI (){
Scroll = (int) GUI.VerticalScrollbar( new Rect( 25,25,20,Screen.height-50), Scroll, 5,0,MotsFinalCount);
float startX = Screen.width/2 - TailleGrille*25;
float startY = Screen.height/2 - TailleGrille*25;
for ( int i = 0 ; i < TailleGrille*TailleGrille ; i ++){
int colonne = i % TailleGrille ;
int ligne = i / TailleGrille ;
if(GUI.Button (new Rect (colonne*50+startX, ligne*50 +startY ,50,50), char.ToUpper (Alpha [grille [i] - 1]).ToString () + " , " + i ) ){
RechercheMotButton(i);
}
}
for ( int i = 0 ; i < MotsFinalCount ; i ++){
if( (i-Scroll)*27.0f +25.0f > 10 && (i-Scroll)*27.0f +25.0f< Screen.height-50){
GUI.Box (new Rect (50, (i-Scroll)*27.0f +25.0f ,200,25), Dictionnaire[ MotsFinal[i]]);
}
}
if(GUI.Button (new Rect (startX, startY+TailleGrille*50+10 ,TailleGrille*50,30), "RECHERCHER TOUT" ) ){
RechercheMot();
}
}
void InitialiseGrille ()
{
grille = new int[TailleGrille * TailleGrille];
char[] A = "ANTICONSTITUTIONNELLEMENTANTICONSTITUTIONNELLEMENT".ToCharArray ();
for (int i = 0; i < TailleGrille; i++) {
for (int j = 0; j < (TailleGrille + 1) / 2; j++) {
grille [i + 2 * j * TailleGrille] = char.ToUpper (A [i + 2 * j * TailleGrille]) - 64;
}
}
for (int i = 0; i < TailleGrille; i++) {
for (int j = 0; j < TailleGrille / 2; j++) {
grille [(j + 1) * 2 * TailleGrille - 1 - i] = char.ToUpper (A [(2 * j + 1) * TailleGrille + i]) - 64;
}
}
dir = new Vector2Int[8]{
new Vector2Int(1,0),
new Vector2Int(1,1),
new Vector2Int(0,1),
new Vector2Int(-1,1),
new Vector2Int(-1,0),
new Vector2Int(-1,-1),
new Vector2Int(0,-1),
new Vector2Int(1,-1)
};
Alpha = "abcdefghijklmnopqrstuvwxyzé".ToCharArray ();
}
void InitialiseDico ()
{
if (File.Exists (DICOpath) == true) {
StreamReader dico = File.OpenText (DICOpath);
Dictionnaire = dico.ReadToEnd ().Split ("\n" [0]);
Debug.LogError ("Dictionnaire trouvé :" + Dictionnaire.Length + " mots");
} else {
Debug.LogError ("Attention dictionnaire non trouvé");
return;
}
DicoNumérique = new int[Dictionnaire.Length][];
for (int i = 0; i < Dictionnaire.Length; i++) {
DicoNumérique [i] = new int[Dictionnaire [i].Length - 1];
for (int j = 0; j < Dictionnaire [i].Length - 1; j++) {
DicoNumérique [i] [j] = char.ToUpper (Dictionnaire [i] [j]) - 64;
}
}
}
void RechercheMot ()
{
MotsFinal = new int[10];
MotsFinalCount = 0;
int[] MotsBase = new int[DicoNumérique.Length];
for (int i = 0; i < MotsBase.Length; i++) {
MotsBase [i] = i;
}
for (int i = 0; i < grille.Length; i++) {
MotAvecLettre (0, i, MotsBase);
}
MotsFinalString = new string[MotsFinalCount];
for ( int i = 0 ; i < MotsFinalCount ; i++){
MotsFinalString[i] = Dictionnaire[MotsFinal[i]];
}
}
void RechercheMotButton (int Case)
{
MotsFinal = new int[10];
MotsFinalCount = 0;
int[] MotsBase = new int[DicoNumérique.Length];
for (int i = 0; i < MotsBase.Length; i++) {
MotsBase [i] = i;
}
MotAvecLettre (0, Case, MotsBase);
MotsFinalString = new string[MotsFinalCount];
for ( int i = 0 ; i < MotsFinalCount ; i++){
MotsFinalString[i] = Dictionnaire[MotsFinal[i]];
}
}
void MotAvecLettre (int pos, int Case, int[] mots)
{
int MotsTrouvésCount = 0;
int[] MotsTrouvés = new int[mots.Length];
int lettre = grille [Case];
for (int i = 0; i < mots.Length; i++) {
if (DicoNumérique [mots [i]].Length > pos && DicoNumérique [mots [i]] [pos] == lettre) {
MotsTrouvés [MotsTrouvésCount] = mots [i];
MotsTrouvésCount++;
}
if (DicoNumérique [mots [i]].Length == pos + 1 && DicoNumérique [mots [i]] [pos] == lettre) {
bool exist = false;
for ( int c = 0 ; c < MotsFinalCount ; c ++){
if ( MotsFinal[c] == mots[i]){
exist = true;
}
}
if ( exist == false){
MotsFinal [MotsFinalCount] = mots [i];
MotsFinalCount += 1;
if (MotsFinal.Length == MotsFinalCount) {
Array.Resize (ref MotsFinal, MotsFinalCount + 10);
}
}
}
}
Array.Resize (ref MotsTrouvés, MotsTrouvésCount);
if (MotsTrouvésCount > 0) {
for (int i = 0; i < dir.Length; i++) {
int colonne = Case % TailleGrille + dir [i].y;
int ligne = Case / TailleGrille + dir[i].x;
int CaseSuivante = colonne + ligne*TailleGrille;
if (ligne >= 0 && ligne < TailleGrille && colonne >= 0 && colonne < TailleGrille ) {
MotAvecLettre (pos + 1, CaseSuivante, MotsTrouvés);
}
}
}
}
}