[DB-AL]Structure des classes

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

[DB-AL]Structure des classes

Message par Aiyor » 15 Sep 2017 17:09

Bonjour,

Voilà, j'ai commencer un projet sur la conception d'un jeu de société et la POO est un peu nouveau pour moi.
Je voulais vous présenter ma "structure" des classes, du moins le tout début, afin d'avoir votre avis à savoir si je pars complètement à l'opposé des "best practices" ou simplement si j'ai rien compris à la POO bref voici .

Tout d'abords j'ai créé une classe pour les joueurs (l'âge du joueur est simple pour déterminer si il joue en premier ^^) :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Players  {
    public string PlayerName { get; set; }
    public int PlayerOrder { get; set; }
    public int PlayerScore { get; set; }
    public int PlayerId { get; set; }
    public int PlayerAge { get; set; }


    public string playerName;
    public int playerOrder;
    public int playerScore;
    public int playerId;
    public int playerAge;

    
   public Players(string playerName,int playerOrder,int playerScore,int playerId,int playerAge)
    {
        
        this.PlayerName = playerName;
        this.PlayerOrder = playerOrder;
        this.PlayerScore = playerScore;
        this.PlayerId = playerId;
        this.PlayerAge = playerAge;
    }
}
Ensuite la gestion des Cartes :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cartes {
    public string CarteName { get; set; }
    
    public string CarteType { get; set; }

    public Cartes(string carteName,string carteType)
    {
        this.CarteName = carteName;
        this.CarteType = carteType;
    }
}

public class MainCarte
    {
    
    public Cartes[] Main { get; set; }
    public int NombreMax { get; set; }
    public int NombreActuel { get; set; }


    public MainCarte(Cartes[] main,int nombreMax)
    {
        this.Main = main;
        this.NombreMax = nombreMax;
        this.NombreActuel = main.Length;
    }
}

public class PotCarte
{
    public List<Cartes> Pot { get; set; }
    public int NombreCarte { get; set; }


    public PotCarte(int count,List<Cartes> Listcartes)
    {
        int i;
        this.Pot = new List<Cartes>();
        for (i=0;i<count; i++)
        {
            this.Pot.Add(Listcartes[i]);

        }
        this.NombreCarte = this.Pot.Count;
    }
}
Une classe Partie (que je pense finalement inutile car je ne vais pas créer plusieurs instances non?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Partie {
    public int NombreJoueurs { get; set; }
    public List<Players> ListeJoueurs { get; set; }
    public PotCarte pot { get; set; }
    public int AgeActuel { get; set; }
    public int JoueurActif { get; set; }
    public int Phase { get; set; }

    public Partie(int nbJoueurs,List<Players> listJoueurs)
    {
        this.NombreJoueurs = nbJoueurs;
        this.ListeJoueurs = listJoueurs;
        
    }
    private int PremierJoueur(List<Players> listjoueurs)
    {
        int id=0,ageMin=0;

        for (int i=0;i<listjoueurs.Count;i++)
        {
            
            if (ageMin != 0 && (ageMin < listjoueurs[i].PlayerAge))
            {
                
                id = listjoueurs[i].PlayerId;
            }
            ageMin = listjoueurs[i].PlayerAge;
        }
        return id;

    }
    public void Init()
    {
        //Initisalisation des Cartes
        List<Cartes> listeCartes = new List<Cartes>();
        Cartes c1 = new Cartes("Pouvoir Supreme", "Feu");
        Cartes c2 = new Cartes("Pouvoir tout pourri", "Eau");
        Cartes c3 = new Cartes("Double coup", "Terre");
        Cartes c4 = new Cartes("Triple coup", "Feu");
        listeCartes.Add(c1);
        listeCartes.Add(c2);
        listeCartes.Add(c3);
        listeCartes.Add(c4);

        //Création du pot de X cartes parmis toutes les cartes
        pot = new PotCarte(4, listeCartes);

        for (int i = 0; i < pot.NombreCarte; i++)
        {
            Debug.Log("Cartes du pot : " + pot.Pot[i].CarteName);
        }

        Debug.Log("Paramètres de la partie :");
        Debug.Log("Nombre de joueurs :" + this.NombreJoueurs);

        for(int i=0;i<this.ListeJoueurs.Count;i++)
        {
            Debug.Log("Joueur numéro :" + (i + 1));
            Debug.Log("Nom du joueur : " + this.ListeJoueurs[i].PlayerName);
            Debug.Log("Score du joueur : " + this.ListeJoueurs[i].PlayerScore);
            Debug.Log("Ordre du joueur : " + this.ListeJoueurs[i].PlayerOrder);
            Debug.Log("Age du joueur : " + this.ListeJoueurs[i].PlayerAge);
            Debug.Log("ID du joueur : " + this.ListeJoueurs[i].PlayerId);
        }

        //Détermination du premier joueur

        this.JoueurActif = PremierJoueur(this.ListeJoueurs);
        Debug.Log("Le premier joueur est : " + this.ListeJoueurs[this.JoueurActif].PlayerName);
    }

}
Et enfin mon component Unity Manager qui est sur un Empty dans ma scène :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Gamemanager : MonoBehaviour {

    #region public
    public const int nombreMaxPot = 4;
    public int nombreJoueurs = 4;
    public int age = 3;
    public int phase;
    public int joueurActif;


    public string joueur1, joueur2, joueur3, joueur4;
    public int ageJoueur1, ageJoueur2, ageJoueur3, ageJoueur4;
    #endregion public


    #region private
    private Players player1, player2;
    private List<Players> listplayer;
    private Partie partie;
    
#endregion private

    void Start () {

        #region Initialisation
        //Création des joueurs

        listplayer = new List<Players>();

        player1 = new Players(joueur1, 1, 0, 0, ageJoueur1);
        player2 = new Players(joueur2, 2, 0, 1, ageJoueur2);

        listplayer.Add(player1);
        listplayer.Add(player2);

        //Initialisation de la partie
        partie = new Partie(2, listplayer);
        partie.Init();

 #endregion Initialisation
    }

}

L'idée ensuite serait, pour les cartes par exemple et suite au conseil d'un membre du forum, en espérant que j'ai bien piger, de faire une classe GUI pour la gestion de l'objet carte dans Unity, un truc dans ce style là :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GUICartes {
    public Cartes carte ;
    public image icon;
    public GameObject graphics;
    etc...

 
}

Voilà, est-ce que vous voyez des trucs, d'un point de vue organisationnel ou structurel complètement à l'ouest? Est-ce que je pars dans une bonne direction?

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL]Structure des classes

Message par evereal » 18 Sep 2017 11:19

Hello,

Ça me semble plutôt pas mal dans l'ensemble mais j'ai quelques remarques.
Pour la classe Players :
- mettre public string playerName {get; set; } ou public string playerName, c'est pareil.
Du coup tu as tes variables globales en "double".
Par convention on mets une minuscule pour les variables.
- J'éviterai de mettre playerOrder dans la classe Players. Logiquement je dirais que c'est au jeu à définir l'ordre des joueurs

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Players  {
    public string playerName { get; set; }
    public int playerScore { get; set; }
    public int playerId { get; set; }
    public int playerAge { get; set; }
    
   public Players(string playerName,int playerScore,int playerId,int playerAge)
    {        
        this.playerName = playerName;
        this.playerScore = playerScore;
        this.playerId = playerId;
        this.playerAge = playerAge;
    }
}
Pour la classe Carte
- je vois que tu veux utiliser un string pour stocker ton type de carte. Ce n'est pas mauvais en soit mais ça peut être une source d'erreur (si tu te trompes sur l'orthographe a un moment donné), en général on part sur des Enum pour ce genre de cas.
Par exemple un fichier EnumTypeCarte :

Code : Tout sélectionner

public enum EnumTypeCarte:int
{
	action, batiment, point
}
Et Cartes devient

Code : Tout sélectionner

public class Cartes {
    public string carteName { get; set; }    
    public EnumTypeCarte carteType { get; set; }

    public Cartes(string carteName,EnumTypeCarte carteType)
    {
        this.carteName = carteName;
        this.carteType = carteType;
    }
}
Pour MainCarte :
Il est inutile de stocker la taille de ton tableau dans la variable nombreActuel.
Et je ne suis pas sur qu'un tableau est + intéressant qu'une liste, ça va t'obliger a gérer des index null, après il est possible que ça soit nécessaire pour ton jeu.

Pour PotCarte
Ton constructeur est est un peu bizarre, encore une fois tu n'as pas besoin d'envoyer la taille en + de ton tableau :

Code : Tout sélectionner

public class PotCarte
{
    public List<Cartes> Pot { get; set; }
	
    public PotCarte(List<Cartes> Listcartes)
    {
        this.Pot = new List<Cartes>();
        for (i=0;i<count; i++)
        {
            this.Pot.Add(Listcartes[i]);
        }
    }
}
Classe Partie :
A garder, même si tu n'en aura effectivement qu'une instance, elle héritera de MonoBehaviour et tu pourras la mettre sur un gameObject vide _GM.
nombreJoueurs a retirer encore.
Dis toi que la listeJoueurs définira l'ordre de jeu. Il te faudrai une méthode 'trierJoueur' a appeler a la fin de ton constructeur ou alors ajouter un constructeur sans parametre et creer une méthode 'ajouterJoueur' qui replacerait le joueur dans la liste suivant son age.

Classe GameManager :
Vu que cette classe crée une partie en dure, je la renommerai TestPartie. Elle est bien pour faire tes test mais ne doit pas exister dans la version finale de ton jeu.

Et pour la GUICartes:
la ref à l'icone et tout ce qui est graphique, tu px le mettre dans Carte
Pour ton GuiCarte, fait toi un prefab avec les elements UI. Si je prend par exemple une carte pokemon :
Image
Tu px voir la carte, une illustration du pokemon, un nom, des pv et plein d'autre infos utile pour le joueur. ton prefab doit avoir un espace prévu pour toutes les données possible de tes cartes.
Ensuite, lors de la partie, lorsque la carte doit s'afficher, tu crées une instances de ce prefab et tu rempli les champs necessaires :

Code : Tout sélectionner

Carte myCard = ... // la carte que le joueur veut utiliser/montrer/afficher
GameObject newCarte = Instantiate (prefabCartes); // on instancie un prefab de carte
newCarte.GetComponent<GUICartes>.setCartes (myCard);
...
// et dans GUICartes
public class GUICartes {
   public Text zoneTexte ;
   public Image icone;
   ... // autres infos
}
public void setCartes(Cartes uneCarte) {
 //affichage du nom
 zoneText = uneCarte.carteName;
 //affichage icone
 icone = uneCarte. carteIcone;
 ....
 
}
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: [DB-AL]Structure des classes

Message par Aiyor » 18 Sep 2017 16:16

Hello,

Merci pour ta réponse.
Pour la plupart, j'ai bien pris en compte tes remarques et modifié en conséquence.
J'ai viré ma classe MainCarte qui n'avait pas vraiment de sens en fait,, j'ai juste rajouté une propriété d'un Player appelée Main en type List<Cartes> tout simplement. Et oui je n'utilise plus de tableaux pour l'instant, pas eu une réelle utilité, je suis passé aux listes.
J'essaierais de mettre mon avancement de ma structure.


evereal a écrit :
18 Sep 2017 11:19
Et pour la GUICartes:
la ref à l'icone et tout ce qui est graphique, tu px le mettre dans Carte
Pour ton GuiCarte, fait toi un prefab avec les elements UI. Si je prend par exemple une carte pokemon :
Image
Tu px voir la carte, une illustration du pokemon, un nom, des pv et plein d'autre infos utile pour le joueur. ton prefab doit avoir un espace prévu pour toutes les données possible de tes cartes.
Ensuite, lors de la partie, lorsque la carte doit s'afficher, tu crées une instances de ce prefab et tu rempli les champs necessaires :

Code : Tout sélectionner

Carte myCard = ... // la carte que le joueur veut utiliser/montrer/afficher
GameObject newCarte = Instantiate (prefabCartes); // on instancie un prefab de carte
newCarte.GetComponent<GUICartes>.setCartes (myCard);
...
// et dans GUICartes
public class GUICartes {
   public Text zoneTexte ;
   public Image icone;
   ... // autres infos
}
public void setCartes(Cartes uneCarte) {
 //affichage du nom
 zoneText = uneCarte.carteName;
 //affichage icone
 icone = uneCarte. carteIcone;
 ....
 
}
Juste une question pour cette partie ci.
En fait, ça me ferait i nstancier deux objets ? Le préfab de la carte et évidemment la carte avec son constructeur. Et j'utilise GUICard par un soucis de propreté pour les method liées à l'affichage ?(Mais j'aurais aussi pu mettre la même method setCartes dans la classe carte vu que GUICarte n'est pas une extension de Monobehaviour....histoire de comprendre...)..

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL]Structure des classes

Message par evereal » 19 Sep 2017 08:45

GUICarte doit implémenter MonoBehaviour en effet.
Il faut bien garder à l'esprit que l'interface graphique sert à ce que le joueur et ton jeu se comprennent. D'un coté tu crées un objet carte en ligne de code, avec tout ses paramètres et ses méthodes. Ensuite tu crées une GUI qui représente la carte et enfin le joueur manipule ce GUI de carte pour interagir avec ton code.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: [DB-AL]Structure des classes

Message par Aiyor » 19 Sep 2017 11:05

evereal a écrit :
19 Sep 2017 08:45
GUICarte doit implémenter MonoBehaviour en effet.
Il faut bien garder à l'esprit que l'interface graphique sert à ce que le joueur et ton jeu se comprennent. D'un coté tu crées un objet carte en ligne de code, avec tout ses paramètres et ses méthodes. Ensuite tu crées une GUI qui représente la carte et enfin le joueur manipule ce GUI de carte pour interagir avec ton code.
Merci !
Tes conseils m'ont vraiment beaucoup aidé à comprendre certaines choses.
Hier je les ai implémentés, j'ai viré les infos de taille de list,
J'ai fait ma classe GUIClass, j'ai juste modifié la méthod SetCarte pour affecter directement l'objet carte entier, plutôt que de passe uniquement la zone de texte et le nombre (je sais que c'était qu'un exemple ^^).
J'ai ensuite fait un préfab (deux quad positionnés en opposition). J'opte pour un objet 3D, pour, plus tard, pouvoir "déplacer" l'objet dans l'espace plus facile qu'avec des objets UI....
J'ai rajouté dans ma class Carte en propriété un material pour face avant et face arrière . J'ai mis en place dans le constructeur, en fonction de l'age de la carte je lui met le dos de carte correspondant). Je dois encore faire pour l'avant...

Et dans mon gameManager pour tester, j'ai instancié l'objet prefab, je lui ai "setter" ma carte, et visuellement, sur plusieurs cartes que j'instancie, je vois bien les différentes caracs et visuellement je vois bien les bons "dos de cartes" ..
Donc un grand merci, maintenant j'arrive à "comprendre" comment je vais organiser et faire la liaison entre mes mécaniques de jeu et le visuel dans Unity. Je vais pouvoir bien avancer.
Il me reste maintenant pas mal de méthod à faire, comme le shuffle, la mise dans la défausse, et ensuite j'ai une gestion d'armée, de placement sur un plateau etc...
Bref merci :)

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: [DB-AL]Structure des classes

Message par Aiyor » 21 Sep 2017 23:19

Hello tout le monde,

J'ai de nouveau besoin d'un conseil...
Je suis un peu peaumé.
En fait je ne sais pas comment faire pour effectuer concrètement un changement de Joueur et "recommencer" une étape complète.

Pour l'instant, il y a 4 Joueurs, je détermine le premier joueur, je distribue 8 cartes,il en choisi 8 (oui pour mes tests je les prends toutes), puis arriver à la fin, changement de joueur, et normalement rebellote...

Le but est que pour chaque joueurs, il y a une maintemporaire qui à reçu 8 cartes, et leur main qui en ont 0 à la base.
Lorsqu'on choisis une carte, j'en enlève une de la main temporaire pour la mettre dans la main du joueurs, une fois fait, j'aimerais passer au suivant...En règle général d'ailleurs, passer à l'étape suivante..
Sauf que je ne vois pas comment faire..

Voici mon code

Mon gamemanager :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Gamemanager : MonoBehaviour {

    #region public
    public int joueurActif;
    public GameObject prefabCarte;


    public string joueur1, joueur2, joueur3, joueur4;
    public int ageJoueur1, ageJoueur2, ageJoueur3, ageJoueur4;
    #endregion public


    #region private
    public GUICarte guiCarte;
    private List<Joueurs> listJoueur;
    public Partie partie;
    
#endregion private

    void Start ()
    {

        #region Initialisation
 

        //Création des joueurs

        listJoueur = new List<Joueurs>()
        {
            new Joueurs(joueur1, 1, 0, 0, ageJoueur1,6,3,4,null,"Bleu"),
            new Joueurs(joueur2, 2, 0, 1, ageJoueur2,6,3,4,null,"Rouge"),
            new Joueurs(joueur3, 3, 0, 2, ageJoueur3,6,3,4,null,"Blanc"),
            new Joueurs(joueur4, 4, 0, 3, ageJoueur4,6,3,4,null,"Noir")
        };

        //Initialisation de la partie
        partie = new Partie(listJoueur);
        partie.Init();
        guiCarte.AffichageMain(prefabCarte,partie.JoueurActif.MainTemporaire);
        
        #endregion Initialisation
    }



    public Cartes PrendCarte(List<Cartes> list, Cartes carte)
    {

        list.Remove(carte);
        Debug.Log("Carte choisie : " + carte.NomCarte);
        return carte;


    }


}
Ensuite ma classe Partie

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Partie {
    public int NombreJoueurs { get; set; }
    public List<Joueurs> ListeJoueurs { get; set; }
    public PotCarte PotAge1 { get; set; }
    public PotCarte PotAge2 { get; set; }
    public PotCarte PotAge3 { get; set; }
    public int AgeActuel { get; set; }
    public Joueurs JoueurActif { get; set; }
    public int Phase { get; set; }
    public Armee Armee { get; set; }
    public Etape Etape { get; set; }
  

    public const int nombreCarteMain = 8;

    public Partie(List<Joueurs> listeJoueurs)
    {
        this.ListeJoueurs = listeJoueurs;



    }
  

    public void Init()
    {
        List<Cartes>  list = new List<Cartes>()

        {
            new Cartes("A1_TB_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_002","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_003","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_004","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_005","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_006","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_007","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_008","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_009","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_010","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_011","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_012","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_013","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TB_014","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TC_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_002","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_003","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_004","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_005","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TCL_006","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TG_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TM_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TM_002","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TM_003","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_001","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_002","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_003","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_004","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_005","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_006","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_007","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_008","Guerrier","Test1",1,1,4,false,false,0,0,3),
            new Cartes("A1_TQ_009","Guerrier","Test1",1,1,4,false,false,0,0,3),

        };


        //Initisalisation de l'étape

        Etape = new Etape(1, 1);


        //Création des armées et attribution aux joueurs
        Armee = new Armee();

        this.ListeJoueurs[0].ArmeeJoueur = Armee.CreationArmee(this.ListeJoueurs[0].Couleur);
        this.ListeJoueurs[1].ArmeeJoueur = Armee.CreationArmee(this.ListeJoueurs[0].Couleur);
        this.ListeJoueurs[2].ArmeeJoueur = Armee.CreationArmee(this.ListeJoueurs[0].Couleur);
        this.ListeJoueurs[3].ArmeeJoueur = Armee.CreationArmee(this.ListeJoueurs[0].Couleur);



        //Création du pot de l'âge 1 parmis toutes les cartes
        PotAge1 = new PotCarte(34, list,1);
        Debug.Log("La defausse contient en tout : " + PotAge1.Pot.Count);
      
        
        Debug.Log("Paramètres de la partie :");
        Debug.Log("Nombre de joueurs :" + this.NombreJoueurs);

        for (int i=0;i<this.ListeJoueurs.Count;i++)
        {
            //Distribution des cartes
            this.ListeJoueurs[i].Main = new List<Cartes>();
            this.ListeJoueurs[i].MainTemporaire = PotAge1.Distribution(nombreCarteMain);
            Debug.Log("La defausse contient en tout : " + PotAge1.Pot.Count);
            Debug.Log("Cartes reçues : ");
            for (int k = 0; k < this.ListeJoueurs[i].MainTemporaire.Count; k++)
            {
                Debug.Log(this.ListeJoueurs[i].MainTemporaire[k].NomCarte);
            }


        }

        //Détermination du premier joueur
        this.JoueurActif = Premierjoueur();
        Debug.Log("Le premier joueur est : " + this.JoueurActif.NomJoueur);
        Debug.Log("L'initialisation est terminée, la partie va commencer...");
        
    }


    private Joueurs Premierjoueur()
    {
        int targetValue = -1;
        int targetIndex = 0;

        for (int i = 0; i < this.ListeJoueurs.Count; i++)
        {
            if (targetValue == -1 || (targetValue > this.ListeJoueurs[i].AgeJoueur))
            {

                targetIndex = i;
            }
            targetValue = this.ListeJoueurs[i].AgeJoueur;
        }

        return this.ListeJoueurs[targetIndex];
    }
    public Joueurs JoueurSuivant()
    {
        int id = JoueurActif.IdJoueur;
       
        id++;
        if (id >= ListeJoueurs.Count)
        {
            Debug.Log("Prochain joueur est de nouveau le premier");
            id = 0;
        }


        return this.ListeJoueurs[id];
    }




}
Ma classe Etape, qui me sert pas pour l'instant

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Etape {

    public int Age { get; set; }
    public int Phase { get; set; }

    public Etape(int age, int phase)
    {
        this.Age = age;
        this.Phase = phase;

    }

    public void ChangeAge()
    {
        this.Age++;
        CheckEndGame();
    }

    public void ChangePhase()
    {
        this.Phase++;
        CheckEndGame();
    }
    public void CheckEndGame()
    {
        if (this.Age > 3)
            Debug.Log("FIN DE LA PARTIE !");
    }

    public void CheckEndAge()
    {
        if (this.Phase > 5)
        {
            Debug.Log("Changement d'âge");
            ChangeAge();
        }
            

    }
}
Je ne détaille pas ma classe Armée, car inutile pour ma demande ça fera économiser de la lecture.

Ma classe Pot est toute simple et pas vraiment utile pour la même raison.

Ensuite ma classe Joueurs

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Joueurs  {
    public string NomJoueur { get; set; }
    public int OrdreJoueur { get; set; }
    public int ScoreJoueur { get; set; }
    public int IdJoueur { get; set; }
    public int AgeJoueur { get; set; }
    public string ClanJoueur { get; set; }
    public Cartes[] AmeliorationClan { get; set; }
    public Cartes[] AmeliorationChef { get; set; }
    public Cartes[] AmeliorationGuerriers { get; set; }
    public Cartes[] AmeliorationMonstre { get; set; }
    public Cartes[] AmeliorationDrakkar { get; set; }
    public int Rage { get; set; }
    public int CaracRage { get; set; }
    public int CaracHaches { get; set; }
    public int CaracCornes { get; set; }
    public List<Armee> ArmeeJoueur { get; set; }
    public string Couleur { get; set; }
    public List<Cartes> Main { get; set; }
    public List<Cartes> MainTemporaire { get; set; }

  
   public Joueurs(string nomJoueur, int ordreJoueur, int scoreJoueur, int idJoueur, int ageJoueur, int caracRage, int caracHaches, int caracCornes,List<Armee> armeeJoueur, string couleur)
    {
        
        this.NomJoueur = nomJoueur;
        this.OrdreJoueur = ordreJoueur;
        this.ScoreJoueur = scoreJoueur;
        this.IdJoueur = idJoueur;
        this.AgeJoueur = ageJoueur;
        this.CaracRage = caracRage;
        this.CaracHaches = caracHaches;
        this.CaracCornes = caracCornes;
        this.ArmeeJoueur = armeeJoueur;
        this.Couleur = couleur;
    }
}
Celle pour les cartes

Code : Tout sélectionner

using System.Collections;
using UnityEngine;


public class Cartes  {
    public string NomCarte { get; set; }
    public string TypeCarte { get; set; }
    public string DescriptionCarte { get; set; }
    public int CoutCarte { get; set; }
    public int AgeCarte { get; set; }
    public int NombreJoueurCarte { get; set; }
    public bool IsAddBonus { get; set; }
    public bool IsRemoveBonus { get; set; }
    public int AddBonus { get; set; }
    public int RemoveBonus { get; set; }
    public int PointDeVictoire { get; set; }
    public bool IsSelected { get; set; }
    public Material Avant { get; set; }
    public Material Arriere { get ; set; }
 

    public Cartes(string nomCarte, string typeCarte, string descriptionCarte, int coutCarte, int ageCarte, int nombreJoueurCarte, bool isAddBonus, bool isRemoveBonus, int addBonus, int removeBonus, int pointDeVictoire)
    {
        this.NomCarte = nomCarte;
        this.TypeCarte = typeCarte;
        this.DescriptionCarte = descriptionCarte;
        this.CoutCarte = coutCarte;
        this.AgeCarte = ageCarte;
        this.NombreJoueurCarte = nombreJoueurCarte;
        this.IsAddBonus = isAddBonus;
        this.IsRemoveBonus = isRemoveBonus;
        this.AddBonus = addBonus;
        this.RemoveBonus = removeBonus;
        this.PointDeVictoire = pointDeVictoire;
        this.Avant = Resources.Load("Materials/Cartes/"+ nomCarte, typeof(Material)) as Material;

        switch (this.AgeCarte)
        {
            case 1:
                this.Arriere = Resources.Load("Materials/Cartes/DosAge1", typeof(Material)) as Material;
                break;

            case 2:
                this.Arriere = Resources.Load("Materials/Cartes/DosAge2", typeof(Material)) as Material;
                break;
            case 3:
                this.Arriere = Resources.Load("Materials/Cartes/DosAge3", typeof(Material)) as Material;
                break;


        }

        
       
    }



    public Cartes()
    {
       
    }

}

Et enfin celle qui gère l'affichage

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GUICarte : MonoBehaviour
{
    public Cartes MaCarte { get; set; }
    public Gamemanager gm;

    Material mat;

    private void Start()
    {
        gm = GameObject.FindGameObjectWithTag("GameController").GetComponent<Gamemanager>();
    }


    private void OnMouseDown()
    {
        Debug.Log(MaCarte.NomCarte);
        
       //On enlève la carte de la main temporaire et on l'ajout à la main défnitif
       gm.partie.JoueurActif.Main.Add(gm.PrendCarte(gm.partie.JoueurActif.MainTemporaire, MaCarte));
       DetruireMain(gameObject, gm.partie.JoueurActif.MainTemporaire);
       
        //Lorsqu'il n'y plus de carte à choisir on passe au joueur suivant.
        if (gm.partie.JoueurActif.MainTemporaire.Count==0)
        {
           gm.partie.JoueurActif= gm.partie.JoueurSuivant();
        }

    }



    public void SetCartes(Cartes uneCarte)
    {

        this.MaCarte = uneCarte;
        
        transform.Find("CarteFaceAR").GetComponent<Renderer>().material = this.MaCarte.Arriere;
        transform.Find("CarteFaceAV").GetComponent<Renderer>().material = this.MaCarte.Avant;
    }

    public List<GameObject> AffichageMain(GameObject objetCarte, List<Cartes> main)
    {
        List<GameObject> go = new List<GameObject>();
        float decal = -1.21f;
        for (int i = 0; i < main.Count; i++)
        {
            Vector3 pos = new Vector3(decal, 0, 0);
            go.Add(Instantiate(objetCarte, pos, Quaternion.identity));
            go[i].GetComponent<GUICarte>().SetCartes(main[i]);
            decal += 0.35f;
        }
        return go;
    }


    public void DetruireMain(GameObject objetCarte, List<Cartes> main)
    {
        List<GameObject> go = new List<GameObject>();

        for (int i = 0; i < main.Count; i++)
        {

            Destroy(objetCarte);


        }

    }

}

Merci d'avance pour votre aide.

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL]Structure des classes

Message par evereal » 22 Sep 2017 10:04

Hello,

Tu commences a avoir beaucoup de classe, ça serait pas mal de faire un diagramme pour s'y retrouver plus facilement.

Je pense que le problème vient de ta méthode Init dans ta classe Partie. En fait, cette méthode ne devrait pas exister.
Tout ce qui est initialisation pot/armée/joueur devrait se trouver au niveau du constructeur (ou dans une méthode appelée par le constructeur).

La distribution de carte devrait être dans une méthode à part.

Il faut bien garder à l'esprit que c'est ta classe GameManager qui va gérer le déroulement du jeu, ta classe Partie doit seulement fournir les données et les méthodes pour les manipuler.
Concrètement tu devrais avoir dans ta classe GameManager qqchose du genre

Code : Tout sélectionner

...
void Update {
 // créer la partie

        listJoueur = new List<Joueurs>()
        {
            new Joueurs(joueur1, 1, 0, 0, ageJoueur1,6,3,4,null,"Bleu"),
            new Joueurs(joueur2, 2, 0, 1, ageJoueur2,6,3,4,null,"Rouge"),
            new Joueurs(joueur3, 3, 0, 2, ageJoueur3,6,3,4,null,"Blanc"),
            new Joueurs(joueur4, 4, 0, 3, ageJoueur4,6,3,4,null,"Noir")
        };

        //Initialisation de la partie
        partie = new Partie(listJoueur);
 // distribuer les cartes
 StartCoroutine(DistribueCartes)
 // préparer l'age 1
 // jouer l'age 1
 // terminer l'age 1
 // préparer l'age 2
 ...
 
}

int carteChoisie = -1; (index de la carte dans le potAge)
private IEnumerator DistribueCartes() {
// tant qu'on a pas fini de distribuer les cartes, on les distribue
  while (!partie.getDistributionCarteTerminee) {
  // tant que le joueur n'a pas choisi sa carte, on attend
    while (carteChoisie == -1)
       yield return null;
   partie.distribueCarteDuPotAuJoueurActif(carteChoisie);
   partie.joueurSuivant();
    }
}
...
C'est une façon de faire, elle n'est pas unique.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: [DB-AL]Structure des classes

Message par Aiyor » 22 Sep 2017 10:47

Salut,

Merci, effectivement, j'essaierais de faire un diagramme pour une prochaine fois, je conçois que je poste une masse de code :) (D'ailleurs, ça sera aussi très utile pour moi par la même occasion :D)

Super pour ta réponse, je ne savais plus comment m'y prendre.
Je voulais éviter de passer par un Update, je me demandais si c'était utile de calculer chaque Frame, alors j'ai commencé à regarder des tutos sur les Events&Delegate.
Mais pour que mon projet avance et du fait que je sois encore débutant, donc je vais sûrement m'embrouiller plus qu'autre chose avec les events, je vais partir sur l'update comme tu me le préconise. De toute façon, ce n'est pas un jeu qui demandera beaucoup de ressources, pas besoin d'en économiser (du moins pour l'instant).

Thx pour ta remotivation ;)

Répondre

Revenir vers « (C#) CSharp »