Un jeu bien connu avec des lettres

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 28 mars 2015 à 12:45
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 16 déc. 2015 à 20:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/100962-un-jeu-bien-connu-avec-des-lettres

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 déc. 2015 à 20:57
Ma mise à jour du jeu a été faite
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
14 sept. 2015 à 13:52
un nouveau projet plus fonctionnel est prêt à être mis sur le site ! Les problèmes de mise à jour m'empêchent pour l'instant de le déposer sur le site !
Le projet actuellement sur le site est incomplet au niveau possibilités ( pas de jeu contre PC ni de jeu duplicate)
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
31 mars 2015 à 00:21
faut lire ( enfin je pense !)
pardon
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
31 mars 2015 à 00:19
Salut Whismeril
Salut Whismeril
Ne m'en veux pas mais le logiciel restera ainsi ! Déjà pour mon niveau c'est un exploit d'avoir fait un truc qui tourne correctement ( en je pense !)
Et je ne suis qu'un amateur au niveau programation !
J'ai mis plus d'un mois pour le "pondre" en semblant de VB net ! N'oublions pas que je l'ai adapté depuis une source en VBA faite par notre ami Carlvb !
Et entre VBA et mon VB net à moi il y a déjà un sacré fossé que j'ai réussi à combler !
Désolé pour les puristes et les "Donetiens" !
Bonne soirée à toi
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 mars 2015 à 23:24
Et "bêtise" de ma part, la méthode NouvelleMain devrait retourner directement la liste, au lieu de faire deux fois la requête dans mes tests....
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 mars 2015 à 23:15
Aïe, mon but n'est pas d'épater (il y'a sans doute bien mieux en prenant le temps de réfléchir, je n'ai pas géré d'événements par exemple) mais de te montrer des voies de progression.
La philosophie objet est bien différente de celle plutôt procédurale de VB6.
Après une difficulté avec VB.Net c'est d'avoir l'impression de ne pas avoir changé, l'environnement est sensiblement le même, les méthodes s'appellent toujours Sub ou Function, les quelques instructions inévitables (for, do, select case, etc...) ont la même syntaxe.

Quand j'ai abandonné VB6, il y a 8 ans, sur le conseil avisé d'un collègue, j'ai basculé vers C#, et là tout étant différent, j'ai eu moins tendance à rester procédurié, au début si, mais je pense m'y être mis plus rapidement avec un coup de balai complet.
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
30 mars 2015 à 22:57
un 20/20 pour toi et mon code c'est 2/20
J'en prends plein la tronche
Trop fort pour mes vieux neurones ( j'ai 64 balais)
Je n'arriverais jamais à ce niveau
Bravo à toi
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 mars 2015 à 21:50
Alors un exemple de ce qui aurait pu être une classe Pion.
Je précise que je n'ai pas réfléchis pour le jeu en globalité, juste sur le pion et que je n'ai pas forcément optimisé le code de façon à montrer plein de facettes de .Net.

J'ai posé qu'une seule liste de Pions est utile, la totalité, ceux qui sont dans la pioche, en main ou sur le plateau ne sont que des résultats de requêtes.
J'ai posé que les propriétés utiles sont la Lettre, la valeur, dans quel endroit est le pion, ses coordonnées sur le plateau (le cas échéant) et le multiplicateur de score éventuel.
J'ai réécris ToString, d'abord pour le debug, c'est plus lisible quand on espionne les variables et ensuite, dans une liste ça peut être pratique.

j'ai écris les méthodes de classe qui permettent l'initialisation du jeu et le triage d'une main.


La classe
Imports System
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Linq


Public Class Pion

#Region "Propriétés"

    ''' <summary>
    ''' Valeur unitaire du pion
    ''' </summary>
    Public Property Valeur() As Integer

    ''' <summary>
    ''' Lettre compte double, tripple ou pas
    ''' </summary>
    Public Property Multiplicateur() As Integer

    Public ReadOnly Property Score() As Integer
        Get
            Return Valeur * Multiplicateur
        End Get
    End Property

    Public Property Lettre() As String

    ''' <summary>
    ''' Si sur le damier coordonnées du pion, sinon 99;99
    ''' </summary>
    Public Property Position() As Point

    ''' <summary>
    ''' Dans la pioche, tiré ou sur le plateau
    ''' </summary>
    Public Property Etat() As EtatPion

#End Region

#Region "Méthode d'instance"
    ''' <summary>
    ''' Place ce pion sur le plateau
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    Public Sub Joue(ByVal X As Integer, ByVal Y As Integer)
        Etat = EtatPion.Plateau
        Position = New Point(X, Y)
    End Sub

#End Region

#Region "Méthodes de classes"

    ''' <summary>
    ''' Initialise les pions du jeu
    ''' </summary>
    ''' <returns></returns>
    Public Shared Function Init() As List(Of Pion)
        Dim nbreLettres() As Integer = {9, 2, 2, 3, 15, 2, 2, 2, 8, 1, 1, 5, 3, 6, 6, 2, 1, 6, 6, 6, 6, 2, 1, 1, 1, 1, 2}
        Dim ValLettres() As Integer = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 10, 1, 2, 1, 1, 3, 8, 1, 1, 1, 1, 4, 10, 10, 10, 10, 0}
        Dim lettres() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "?"}

        Dim alphabet As List(Of Pion) = lettres.Select(Function(l, i) New Pion With {.Lettre = l, .Etat = EtatPion.Pioche, .Multiplicateur = 1, .Position = New Point(99, 99), .Valeur = ValLettres(i)}).ToList() 'initialise une lettre de chaque avec une requete linq indéxée pour montrer que ça existe

        'du coup je dois générer les "copies"
        Dim pions As IEnumerable(Of Pion) = New List(Of Pion)()
        For i As Integer = 0 To alphabet.Count - 1
            pions = pions.Concat(GenereClones(alphabet(i), nbreLettres(i)))
        Next i

        Return pions.ToList()

    End Function

    ''' <summary>
    ''' Un classe étant de type "Référence" (contrairement à une structure), si j'ajoute n fois un pion à la pioche, ce sera en fait toujours le même.
    ''' Un changement quelconque affectera toutes les copies.
    ''' La génération de clones crée une nouvelle "Référence", dans laquelle on copie les données de type "Valeur"
    ''' </summary>
    ''' <param name="Modele"></param>
    ''' <param name="Nombre"></param>
    ''' <returns></returns>
    Private Shared Function GenereClones(ByVal Modele As Pion, ByVal Nombre As Integer) As List(Of Pion)
        Dim clones As New List(Of Pion)()
        clones.Add(Modele)
        For i As Integer = 1 To Nombre - 1
            clones.Add(New Pion With {.Lettre = Modele.Lettre, .Etat = Modele.Etat, .Multiplicateur = 1, .Position = New Point(99, 99), .Valeur = Modele.Valeur})
        Next i

        Return clones

    End Function

    'Complète la main en cours
    Public Shared Sub NouvelleMain(ByVal Pions As List(Of Pion))
        Dim aTirer As Integer = 7 - Pions.Where(Function(p) p.Etat = EtatPion.Tire).Count 'combien faut il tirer de pions?
        Dim rnd As New Random()
        Dim pioche As IEnumerable(Of Pion) = Pions.Where(Function(p) p.Etat = EtatPion.Pioche) 'grâce à l'évaluation différée des requetes Linq elle sera à jour à chaque itération
        For i As Integer = 0 To aTirer - 1
            pioche.ElementAt(rnd.Next(pioche.Count())).Etat = EtatPion.Tire
        Next i
    End Sub
#End Region

#Region "Méthode Réécrites"
    Public Overrides Function ToString() As String
        Return String.Format("Lettre {0}, valeur :{1}, Etat :{2}", Lettre, Valeur, Etat)
    End Function

#End Region
End Class

Public Enum EtatPion
    Pioche
    Tire
    Plateau
End Enum


Et quelques tests, à mettre dans le load de ta form et exécuter à pas principal
        Dim mesPions As List(Of Pion) = Pion.Init()
        Pion.NouvelleMain(mesPions)

        Dim main As List(Of Pion) = mesPions.Where(Function(p) p.Etat = EtatPion.Tire).ToList() 'de façon à voir ce qui a été tiré

        'je place des lettres sur le plateau juste pour tirer une nouvelle main
        main(2).Joue(1, 1)
        main(6).Joue(2, 2)

        Pion.NouvelleMain(mesPions)
        main = mesPions.Where(Function(p) p.Etat = EtatPion.Tire).ToList() 'de façon à voir ce qui a été tiré
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
30 mars 2015 à 18:22
une erreur a été trouvée dans le jeu . Lors de la validation d'un coup joué uniquement le mot formé était vérifié dans le dictionnaire . Les éventuels mots formés dans l'autre sens étaient complètement ignorés . Ca été corrigé lors de la dernière mise à jour.
Utilisation aussi d'une nouvelle structure pour les cases du jeu
on peut mieux faire ,mais c'est deja bien.
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 mars 2015 à 17:26
string est une classe, oui mais je voulais surtout montrer que même un 1, pas encore dans une variable a (au moins) une méthode et est donc déjà un objet.
Je reviendrais quand j'aurais testé le projet entier.
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
29 mars 2015 à 14:21
Excuse moi Whismeril j'ai complètement oublié de te saluer ! je le fais ici : Bonjour à toi et merci encore
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
29 mars 2015 à 14:18
Merci pour cette critique que j'accepte sans problème !
J'ai beaucoup appris avec le cours que tu cites
Mais étant un vieux VB6iste ( ca existe ? ) dur de m'y faire avec les classes

dim un as string = 1.ToString()


Je comprends que String est un classe : ça pas de souci
Comme Button en est une aussi et elle fait partie de la classe Control

Mais créer ses propres classes est encore bien au-dessus de mon niveau
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 mars 2015 à 13:12
Bonjour, après un rapide coup d'oeil je vais être un peu critique.

Ça n'est pas du VB.Net, mais tu l'admets toi même dans la description.

VB.Net est un langage (tout) objet, et tu n'utilises aucun objet métier.
Tu as mis des structures, et bien la classe (donc l'objet métier) c'est l'étape d'après, c'est une "structure" (elle a des propriétés) qui peux générer ses propres événements et/ou possède des méthodes (fonctions).
Tu aurais pu créer une classe pour les lettres, elle contiendrait (au moins) les propriétés Nom (A,B, etc...) NombreMaxi et Valeur, elle pourrait avoir un événement qui signale quand elle est tirée etc...

Je te conseille vivement la lecture de http://plasserre.developpez.com/cours/vb-net/ afin de bien cerner la différence de philosophie entre VBA (langage un peu orienté objet) et VB.Net ({tout} objet:
dim un as string = 1.ToString()
ça veut dire quelque chose en .Net).
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2015 à 22:02
pardon : version bien sur dans le message précédent
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2015 à 22:02
et de plus le principal auteur du code est Carlvb ! ne n'oublions pas car je me suis inspiré de sa veesion sous VBA !
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2015 à 21:59
salut Thomas
Visual Studio indente automatiquement le code : explique toi !
Et c'est facile de critiquer !
C'est une bonne source pas mal !!
bonne source!
je me justifie : le code est mal indenté deja , et l'algo principale est classique pour le plus longue sous chaine de 2 string ....
Non csa vaut pas 5 etoiles ça ...dsl
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2015 à 20:56
De rien Carlvb
C'est la moindre des choses
carlvb Messages postés 199 Date d'inscription mercredi 23 avril 2003 Statut Contributeur Dernière intervention 25 mai 2017 11
28 mars 2015 à 19:25
Salut vb95,

Bravo pour cette super source et merci pour le clin d'oeil. ;)

J'avance également de mon côté sur les autres modes de jeu...

Bonne continuation.

Amicalement,

Carlvb
Rejoignez-nous