Besoin de suggestions pour régler mon problème d'apprentissage

Difficultés d'apprentissage,

a marqué ce sujet comme résolu.

Bonjour,

Je ne savais pas trop où poster ce message, ici ou dans la partie "Le bar à smoothies", mais je me suis dit que ce serait mieux ici.

Je vais essayer d’expliquer au mieux la situation dans laquelle je suis en ce moment. Dans un premier temps, je tiens à préciser que j’ai 31 ans, j’ai eu un parcours scolaire difficile (arrêt en 4ème pour raisons personnelles). Ensuite j’ai voulu reprendre des études et j’ai fait un DAEU A (équivalent d’un BAC L). Suite à l’obtention de mon diplôme, je suis allé à l’université pour faire une licence de japonais. Au milieu de la deuxième année, j’ai eu l’opportunité de partir vivre au Japon pendant 1 an et j’ai arrêté mes études.

En rentrant en France, ma vie avait changé et je n’étais plus trop en mesure de reprendre des études de japonais. J’ai donc pris du temps pour réfléchir à ce que je voulais faire et si possible, l’utiliser pour atteindre mon objectif : vivre au Japon de manière définitive.

Au départ je voulais me lancer dans la programmation de jeux vidéo. Je trouvais ça "cool", mais j’y connaissais rien. J’en ai discuté avec des amis et d’autres personnes et on m’a fait comprendre qu’il fallait être suffisamment bon en maths pour suivre ce genre de cursus. Je préfère être franc, les maths et moi ne sommes pas en très bon terme (mon arrêt en 4ème doit jouer sur ce point).

De ce fait, je me suis renseigné vers un autre type : le développement web. Il y avait plus de formations, c’était moins cher et plus accessible. J’ai pris la peine de faire des recherches sur le HTML et CSS dans un premier temps et j’ai fini par candidater pour une formation (environ 15 places) et j’ai été sélectionné.

Tout s’est très vite enchaîné pour moi. La formation a commencé avec une période intensive (piscine de 3 semaines, de 9h à 23h, du lundi au dimanche) durant laquelle on apprenait du shell, puis on est passé sur du PHP. Il n’y avait pas de cours, c’était surtout des PDF à DL et on devait faire le plus d’exercices possible par jour. C’était plus de l’apprentissage en autodidacte qu’autre chose et je n’y étais clairement pas habitué (encore le cas aujourd’hui), car pour moi, formation = cours. Et ce n’est pas le cas. Faut se démerder et le mot d’ordre "man google".

Au départ, les gens se filaient un coup de main, il y avait de l’entraide et je trouvais ça fun. Mais j’ai toujours senti que j’avais du mal, que je galérais plus que les autres. Au début, je me suis dit que c’était probablement du au fait que c’était tout nouveau pour moi, qu’il me fallait un temps d’adaptation et que ça finirait par aller : grossière erreur.

4 mois plus tard, j’y suis toujours et j’ai l’impression de toujours galérer (je suis clairement dans la fourchette basse de la promo). Pour faire simple, j’ai des notes catastrophiques, je ne réussi pas les projets jusqu’au bout et je foire mes colles (examens de 2 à 3h).

Ce qu’on a vu pour le moment : HTML/CSS, PHP, Javascript, jQuery, Ajax, SQL.

Mais quelque soit le langage, j’ai l’impression de ramer, je n’ai absolument pas de logique dans ce que je fais (c’est le retour que peuvent me faire certains collègues) et je suis en train de me noyer, clairement.

J’ai cette sensation d’avoir "survolé" mon apprentissage, tous ces premiers mois et d’avoir tout oublié ou tout simplement de ne pas avoir saisi toutes les nuances et je n’arrive plus à appliquer quoi que ce soit. Tout le monde prend du niveau, je le vois clairement, mais j’ai l’impression d’être un boulet (surtout quand on a des projets de groupe… c’est le pire).

Je vais donner un exemple concret. Dernièrement, il y avait une colle où l’on devait refaire un jeu (le morpion) en Javascript. Plus précisément en plugin jQuery. Sur les 3h de la colle, j’ai tout juste réussi à faire en sorte qu’on puisse ajouter un "X" sur l’endroit cliqué… Pas très fier de moi pour le coup. Sachant qu’il fallait gérer le switch de joueurs, pouvoir dire quand une partie était terminée, pouvoir la recommencer, compter le score (partie bonus où l’on pouvait créer une partie IA) etc. Bref, un cauchemar pour moi, surtout quand je vois que j’ai rendu 10% du truc et encore, je suis gentil.

En ce moment on a un autre projet à faire en solo : faire un puissance 4 en plugin jQuery et petite cérise sur le gâteau, tout ça en POO. C’est sur 2 semaines, la première semaine est bientôt terminée et j’ai que la grille… ça vous donne une idée de mon avancement.

Je pense que je fais un blocage, quelque chose m’empêche de progresser et d’y arriver, mais je ne sais pas quoi. Le problème dans tout ça, c’est que plus le temps passe et plus les projets de la formation deviennent complexes. Il y a de plus en plus de technologies à aborder, à utiliser, mais j’ai déjà un tel train de retard que je n’arrive plus à suivre et pourtant, la motivation est toujours là.

J’ai tenté plusieurs approches :

  • Poser des questions aux autres, mais ça s’est soldé par un échec car finalement, je passais plus mon temps à poser des questions qu’à pratiquer et ça m’a desservi

  • Apprendre avec des tutoriaux (vidéos), mais là encore, rien de bien concluant

  • Tutoriaux écrits. J’aime bien lire donc je me suis dit que ça passerait mieux, mais ça n’a pas été le cas

Au final, le sentiment que j’ai aujourd’hui est le suivant : j’ai l’impression que mes échecs ont déclenché un blocage qui fait que j’ai peur de coder ou tout simplement, que je n’arrive plus à réfléchir, je n’arrive pas à savoir ce que je dois faire, comment attaquer le problème, dans quel ordre écrire mon code, ce que je dois écrire pour pouvoir avancer. J’ai la sensation d’avoir laissé toutes les notions du début de formation à la porte d’entrée et aujourd’hui, je suis dans la merde.

J’ai clairement pas envie de la foirer et je veux réussir mes objectifs, à savoir :

  • Finir ma première année
  • Faire la deuxième année en alternance (mais comment être crédible aux yeux d’une entreprise avec mon niveau actuel… ?)
  • Travailler un peu en France avant de partir au Japon pour espérer y vivre et bosser là-bas (toujours dans le dev web)

Mais je commence à désespérer car je n’y arrive plus. J’ai déjà lu un autre topic du forum, celui ci :

https://zestedesavoir.com/forums/sujet/4430/je-ny-arrive-pas/

Les réponses sont encourageantes et j’ai beaucoup apprécié la discussion. Le souci que j’ai, c’est que je manque de temps. Si je le pouvais, je prendrais 3 ou 4 ans pour apprendre au lieu de 2, mais c’est un luxe que je n’ai pas et il faut que je profite de la période de vacances qui approche (2 semaines en août) pour me remettre sur les rails.

C’est pourquoi je suis ici aujourd’hui, pour vous poser cette question : que puis-je faire pour m’en sortir ?

J’ai pris conscience des choses suivantes durant ces 4 derniers mois :

  • Un développeur doit savoir se renseigner et effectuer ses recherches seul (j’arrivais pas trop à l’accepter au début mais je m’y suis fait avec le temps)

  • Je sais qu’il faut pratiquer, pratiquer et toujours pratiquer pour s’améliorer

  • Découper son projet en plusieurs sous parties, chaque fonction ne fait qu’une chose, ne pas mélanger et ne pas l’attaquer dans sa globalité

  • Ecrire quelques lignes de code (voire une fonction complète) et tout tester, debug, avant de passer à la suite

Malgré cette prise de conscience, je n’avance pas ou en tout cas, pas à un rythme suffisamment bon pour ne pas lâcher prise. Quand j’arrive à coder quelque chose, je suis content, donc la réussite me rend heureux, même si la frustration engendrée pour arriver au résultat est difficile à vivre, mais ça fait partie du métier de dev (enfin j’imagine).

Je me doute que vous ne pourrez pas faire de miracle, mais si vous avez vécu la même chose ou une personne que vous connaissez et que vous avez des conseils, je suis preneur.

Désolé pour ce long pavé, je n’avais pas l’intention d’écrire autant, mais fallait que ça sorte.

Merci d’avance pour votre aide !

J’ai bien lu ton message en entier. Par contre, avant de te répondre, serait-il possible décrire ce qui t’a bloqué en premier dans deux domaines :

  • la création de pages HTML
  • l’algorithmique (JavaScript et PHP dans ton cas)

S’agit-il du raisonnement logique ou de la mémorisation par exemple ? J’ai compris concernant le blocage mais à l’origine, quelles sont les genres de choses qui te bloquent le plus durant un exercice ?

Je précise que le but n’est pas la moquerie ou autre mais bien de comprendre au mieux pour pouvoir t’aider le mieux possible :) !

Merci d’avoir pris le temps de tout lire !

Pas de soucis pour les détails, je vais essayer d’expliquer au mieux.

J’ai jamais vraiment eu des "facilités", que ce soit en HTML/CSS ou la prog (PHP/Javascript). C’était plus simple en HTML/CSS car c’est plus visuel, plus intuitif. Y’a des procédés où je galère encore (le responsive, les breakpoints, mediaqueries etc), mais ça reste plus "simple", si je peux dire ça comme ça, que mes galères en PHP/JS.

Donc pour décrire au mieux :

En HTML/CSS : tout allait bien, mais à l’arrivée du responsive, mediaqueries, formulaires à faire, j’ai commencé à sentir les galères

PHP : au début je trouvais ça fun, déclaration de variables, apprentissage des différents types de données (int, float, booléen etc), mais j’ai commencé à galérer quand on est arrivé aux tableaux. Au départ, les tableaux basiques étaient gérables, plus ou moins et après, quand j’ai entendu parler de tableau multidimensionnels (des tableaux dans des tableaux), j’ai décroché un peu. Je pense que le pire, c’est quand on a commencé à faire des boucles et que les exercices sont devenus de plus en plus difficile. Je comprenais pas pourquoi fallait procéder comme ça etc. Le problème avec ma formation, c’est que bien souvent (voire toujours), on nous dit d’apprendre et chercher par nous même, mais je comprenais déjà rien au concept de base, alors devoir chercher des choses sur des choses que je ne comprends déjà pas, ça ne m’a pas aidé. Après les boucles, c’était les fonctions. Je ne comprenais rien aux paramètres d’une fonction, comment passer des paramètres d’une fonction à une autre, comment organiser le code pour que chaque fonction fasse une chose bien spécifique et ne pas tout mélanger, comment arriver à mon but etc. Tout s’est très vite accentué, c’était trop rapide pour moi. Y’a eu la POO, avec l’ajout de classes, l’héritage et j’en passe. Plus le temps passait et plus mes galères augmentaient.

J’ai pas du tout l’impression de maîtriser quoi que ce soit, même encore aujourd’hui. Je suis toujours en galère sur les boucles, quand les utiliser, pourquoi le faire là et pas à un autre moment. Quand faire des return, comment m’organiser. C’est vraiment un tout et j’ai juste l’impression d’être à côté de la plaque.

Pareil pour le Javascript. La syntaxe était bien différente de celle de PHP et j’étais pas (et suis toujours pas) à l’aise. Et là aussi tout s’est vite enchainé : jQuery (de base) et après on nous demandait de faire ça en plugin et ensuite l’Ajax a débarqué, fallait mélanger ça avec le PHP et le eventPreventDefault() pour pas que le formulaire soit envoyé, mais je savais pas récupérer les données, faire apparaitre ce qu’il faut le site etc.

Si je devais résumer ça simplement, je dirais que ce qui me fait galérer, c’est le manque de logique, l’algorithmie, comment assembler tout ça pour que ça ait un sens, car j’ai toujours la sensation que ce que je fais n’a absolument aucun sens et quand on regarde mon code, on me le fait clairement comprendre : "nan mais là t’as fait ça et ensuite tu fais ça, ça va pas du tout", "c’est pas logique ce que tu fais"

Donc oui, clairement, j’ai pas de logique. J’imagine que ça se travaille, mais j’ai vraiment besoin de me rebooster rapidement et ce dans les prochaines semaines car lorsque le deuxième semestre va commencer, si je suis pas au point un minimum, la chute va être terrible et arrêter ma formation sera un synonyme d’échec pour moi.

Si tu as d’autres questions, n’hésite pas à me le faire savoir, j’ai rien à cacher ^^

Encore merci !

Introduction

On dirait que le problème initial est surtout la vitesse à laquelle les cours se déroule. Si on admet cela, j’imagine que c’est avec un peu d’entraînement que tu pourras maîtriser davantage ces langages.

HTML/CSS

Je vais passer assez vite la partie concernant le HTML/CSS car on dirait que tant qu’on ne touche pas à certains points, ça passe. Je te conseille d’ignorer la partie responsive design dans un premier temps. Focalise toi sur l’écran de ton ordinateur dans un premier temps pour t’habituer au HTML et au CSS. Par la suite, tu pourras passer à un design qui s’adaptera à la résolution d’un écran. Il y a de bons tutoriels sur ce sujet sur Alsacréations par exemple.

PHP

Concernant l’algorithmique, je partirai d’abord sur des exercices pour comprendre l’usage des variables et des conditions. Je te conseille ensuite de t’intéresser aux boucles. Le reste est a abordé par la suite selon moi.

Tableaux

Pour les tableaux qui ont plus de deux dimensions, il est normal d’avoir plus de mal à comprendre le principe. Il s’agit de quelque chose de plus abstrait pour nous. Par exemple, voici des correspondances :

Tableau à une dimension
$t1 = [1, 5, 7, 8, 140];
1 5 7 8
Tableau à deux dimensions
$t2 = [[1, 5], [1, 552, 7], [7], [1, 2, 4], [140, 7]];
1 5
1 552 7
7
1 2 4
140 7

Où je veux en venir avec ces exemples, c’est qu’au delà de ça, il est compliqué pour nous d’imaginer dans notre tête ce que cela donnerait.

Boucles

Les boucles servent servent à reproduire plusieurs fois la même action. Quelque chose qui ne sert à rien mais qui permet d’afficher le même texte X fois se ferait de cette manière-ci :

for ($i = 0; $i < 72; $i++) {
    echo 'Around the world, around the world<br />';
}

J’aurais pu coller les paroles en entier mais je ne savais pas quelle version mettre. En effet, la ligne dans la boucle s’affiche 72 fois dans l’album et « seulement » 40 fois à la radio. Désolé :p .

Grâce à ce morceau de code, j’ai pu afficher l’intégralité des paroles de la chanson Around the world de Daft Punk. ce type de boucle permet de parcourir un intervalle. Dans l’exemple ci-dessus, on continue la boucle for tant que que $i a une valeur inférieur à 72. Par ailleurs, on a indiqué qu’au premier passage, $i vaudra 0 et qu’il prendra +1 à chaque tour. Je ne sais pas si clair donc n’hésite pas à me le faire savoir.

Généralement, cette boucle permet de parcourir quelque chose dont on connait la longueur. Par exemple un tableau. Si on veut afficher les trois premières cases d’un tableau, on va parcourir le tableau de la case 0 à la case 2. Adaptons le code ci-dessus :

$t = [1, 4, 3, 8, 0];

for ($i = 0; $i < 3; $i++) {
    echo $t[$i] . '<br />';
}

-

1
4
3

L’autre type de boucle principal est plus généraliste. En effet, il est possible de faire exactement ce que l’on vient de faire précédemment :

$i = 0;

while ($i < 3) {
    echo $t[$i] . '<br />';
    $i++;
}

Or, on aura plutôt tendance à utiliser cette boucle pour effectuer la même opération tant que les conditions finales ne sont pas complétés. Par exemple, tant que la partie n’est pas terminé, on recommence le tour. Imaginons que tu as un jeu de 10 cartes. Il s’agit d’un jeu à un jour qui se termine au moment où tu as récupéré un joker.

$victoire = false;
$paquet ['R', 'D', 'J', 'V'];
$carte = 0;

while ($victoire) {
    if ($paquet[$carte] == 'J') {
        $victoire = true;
        echo 'Victoire'
    } else {
        echo 'Défaite'
        $carte++;
    }
}

-

Défaite
Défaite
Victoire

Je ne sais pas si cet exemple permet de simplifier des cas plus complexes dans la réalité. En gros, on utilise une boucle quand on en a besoin. C’est un peu comme l’usage d’un temps du passé pour parler du weekend dernier.

Les fonctions

Les fonctions permettent soit de réutiliser un code qu’on doit utiliser à plusieurs endroit. Par exemple, imagine que tu dois faire plusieurs d’opérations identique. Par exemple : a + b + 5. On pourrait écrire cette fonction :

function calcul($a, $b) {
    $resultat = $a + $b + 5;

    return $resultat;
}

echo calcul(5,6);

-

16

Dans ce cas, j’ai utilisé return, cela signifie que cette fonction « a pour valeur » ce quelle retourne. Pour afficher le résultat du calcul, je l’ai donc fait comme si j’affichais un texte ou un nombre tel. En fait, dans la fonction, on crée une variable $resultat qui prendra comme valeur le résultat du calcul. La variable est détruite une fois la fonction terminée. En utilisant return, on permet d’accéder à ce résultat par l’appel de la fonction. Elle s’utilise comme une variable en fait.

On utilise une fonction sans return pour effectuer une action. Pour reprendre l’exemple ci-dessus. Au lieu de récupérer une valeur, on pourrait choisir d’avoir une fonction qui a l’action d’afficher le résultat. On obtient le même résultat avec ce code :

function calcul($a, $b) {
    $resultat = $a + $b + 5;

    echo $resultat;
}

calcul(5, 6);

Le reste

Je pense que ce que j’ai écrit ci-dessus est ce qui doit être maîtrisé en premier avant de passer au JavaScript (et jQuery), PHP orienté objet et SQL.

Conclusion

J’espère que ce que j’ai écrit n’est pas trop compliqué ou confus. J’ai essayé de donner des exemples simples pour comprendre le principe d’utilisation de certains points. Évidemment, c’est assez bateau mais c’est comme quand on apprend à compter ou une nouvelle langue, c’est d’abord avec des choses assez futiles. N’hésite pas à me dire si ce que j’ai écrit ne t’apporte rien ou si c’est trop confus. Je ne le prendrais pas mal ;) . D’ailleurs, j’invite aussi les autres membres à me reprendre s’il le faut.

Une fois que les points que j’ai abordé sont maîtrisé, tu pourras d’une part, pour le HTML et CSS apprendre à adapter ton site à différents écrans et d’autre part, utiliser les formulaires pour sauvegarder des données dans la base de données pour ensuite les afficher sur une page. Enfin, t’intéresser à l’orienté objet ainsi qu’au JavaScript par la suite.

Je t’invite par ailleurs à prendre un point que j’ai abordé et qu’on se focalise tous sur ce que tu as choisis jusqu’à ce que ça passe pour ensuite passer à une notion suivante :pirate: .

Merci beaucoup d’avoir pris le temps d’expliquer tout ça. Ce sont des choses que j’avais déjà vu, mais revoir les bases ne fait pas de mal, surtout quand c’est pas maîtrisé à 100%

Je sais plus ou moins ce que fait une boucle, ajouter des conditions avec if, else etc, mais je pense que c’est sur des choses plus complexes où je n’avance pas : mélanger le tout pour que ça fasse un ensemble cohérent, qui ait du sens.

Je vais donner un exemple tout bête avec le projet sur lequel je bosse actuellement (le puissance 4).

Voici ma page HTML :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Puissance 4</title>
</head>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="js/main.js"></script>
</body>
</html>

Voici mon Javascript (plugin jQuery) :

$.fn.P4 = function(col_nbr, row_nbr)
{   
    var player1 = 1; // ID of the first player
    var player2 = 2; // ID of the second player

    for(var row_count = 1; row_count <= row_nbr; row_count++)
    {
        var div = $('<div id=row-'+ row_count + ' style="margin-top: -5px"></div>');
        $('body').prepend(div);
    
        for(var col_count = 1; col_count <= col_nbr; col_count++)
        {
            var circle = $('<canvas data-row=col-' + col_count + '-row-' + row_count + ' width="200px" height="200px"/>');
            var ctx = circle[0].getContext('2d');
            $('#row-' + row_count).append(circle);
            ctx.fillStyle = 'red';
            ctx.beginPath();
            ctx.fillRect(0,0,200,200);
            ctx.fillStyle = 'white';
            ctx.beginPath();
            ctx.arc(100,100,95,0,2*Math.PI);
            ctx.fill();
        }
    }
}
$('body').P4(4,4);

Mais au final, il est demandé de le faire en POO, donc j’ai du changer mon code, voici la version actuelle (ça permet de voir la différence) :

class GameBoard
{
    constructor(col_nbr, row_nbr)
    {
        this.col_nbr = col_nbr;
        this.row_nbr = row_nbr;
    }

    /*
    ** Function to display the grid on the HTML page
    ** Creates a div containing an id with different row number
    ** and adds a canvas in each row
    */
    display_grid(col_nbr, row_nbr)
    {
        for(var row_count = 1; row_count <= row_nbr; row_count++)
        {
            var div = $('<div id=row-'+ row_count + ' style="margin-top: -5px"></div>');
            $('body').prepend(div);
        
            for(var col_count = 1; col_count <= col_nbr; col_count++)
            {
                var circle = $('<canvas class=empty data-col=' + col_count + ' data-row=' + row_count + ' width="200px" height="200px"/>');
                var ctx = circle[0].getContext('2d');
                $('#row-' + row_count).append(circle);
                ctx.fillStyle = 'red';
                ctx.beginPath();
                ctx.fillRect(0,0,200,200);
                ctx.fillStyle = 'white';
                ctx.beginPath();
                ctx.arc(100,100,95,0,2*Math.PI);
                ctx.fill();
            }
        }
    }

    add_tokens(col_nbr, row_nbr)
    {
        /*
        ** Object containing players information
        */
        const players =
        {
            player1 : 'red',
            player2 : 'yellow'
        }

        var test = $('[data-col]');
        console.log(test);
    }
}
$.fn.P4 = function(col_nbr, row_nbr)
{   
    var instance = new GameBoard();
    instance.display_grid(col_nbr, row_nbr);
    //instance.add_tokens();
}
$('body').P4(4,4);

J’ai laissé mes commentaires et tous les trucs à nettoyer, c’est pas du tout terminé. Pour te donner une idée, ça m’a pris 4 jours pour faire ça en Javascript. Non pas parce que je suis fainéant, mais tout simplement parce qu’il m’a fallu du temps pour comprendre que j’avais besoin d’une première boucle pour créer mon nombre de div, qui sont elles mêmes déterminées via l’appel de mon plugin, pour ensuite faire une autre boucle pour ajouter les canvas dans chaque div, comment les dessiner, ajouter des attributs dans mes balises etc.

Et le pire, c’est qu’au final, c’est la partie la plus simple. Après il faut pouvoir faire en sorte d’ajouter un jeton de couleur rouge en premier, jaune ensuite (ou inversement) et c’est là que ma logique coince et que je tourne en rond. Soit je réfléchis trop et je vois trop loin, soit je suis incohérent dans ce que je fais. Pour faire simple, si je devais te dire comment je voudrais procéder, ce serait comme ça que je découperais :

  • Créer une fonction (this).on.(’click’) qui permettrait de changer la couleur de fond du rond sur lequel on va cliquer (version simple)

  • Quand un joueur a cliqué, ça change la couleur du jeton pour le tour suivant etc (faudra mettre des conditions)

Le soucis, c’est que même si j’ai une vague idée de comment est censé fonctionner le jeu, j’arrive pas à poser ça en code. Est-ce que je suis censé utiliser une animation pour faire en sorte que le jeton parte du haut de la ligne pour descendre jusqu’en bas (et là encore, même si c’était le cas, aucune idée de comment procéder).

Ensuite faut pouvoir dire que si la case est déjà pleine, on peut pas rejouer ou alors il ne se passe rien. Faut pouvoir switch de joueur etc. Et le pire restera certainement le calcul de la victoire car il faut faire ça en vertical, horizontal et diagonale et j’ai absolument aucune idée de comment procéder.

Mais avant de penser à tout ça, je me mets dans la tête que la première étape à faire (si je découpe), c’est de pouvoir ajouter une couleur au "click".

Finalement, si je devais résumer ça de manière simple, on va dire que j’ai des "idées", mais j’arrive pas du tout à trouver la logique pour les concrétiser. Même si je crée la fonction, où je dois l’appeler, quels paramètres lui mettre, comment la gérer, quoi mettre dedans, comment exploiter tout ça, mélanger le tout et avoir un ensemble cohérent. Est-ce que je dois mettre mes autres fonctions dans une autre class, mais si je fais ça, comment faire intéragir le tout, est-ce que je suis censé utiliser des paramètres de mes autres fonctions, si oui, comment les récupérer etc. Autant être franc, c’est le brouillard dans ma tête.

C’est le principe même de la programmation et c’est tout ça qu’il faut que j’acquiers si je veux avancer. Je sais pas si je suis clair dans ce que je dis ? Si c’est pas le cas, fais le moi savoir. :D

Je vais continuer de réfléchir à tout ça car réussir à créer un puissance 4 m’intéresse vachement, mais j’ai pas la sensation d’avoir encore le niveau pour ça. Bon ça fait partie du cursus de la formation donc j’ai pas trop le choix que d’essayer de le faire, je peux pas me reposer et prendre le temps de le faire (il me reste 1 semaine, j’aurais bien aimé en avoir 3 de plus…), mais malgré la frustration que ça engendre (deadline, manque de connaissances), j’ai envie de le réussir. J’ai envie de réussir tout simplement.

Que ce soit pour ce projet ou n’importe quel autre projet d’ailleurs, est-ce que tu aurais des conseils ? Est-ce qu’il y a une démarche générale à suivre quand on code ? Comment je peux découper pour pas m’embrouiller ? Comment procéder, quelles sont les choses à faire dans ces cas de figure ?

Je veux m’améliorer et tout conseil est bon à prendre ! ^^

Encore merci !

+0 -0

De manière générale, une bonne démarche est de découper en partant des problèmes globaux pour aller vers des problèmes atomiques que tu peux régler en quelques lignes de code.

En gros c’est comme découper un gros gâteau : si tu essaies direct de découper part par part, ça va être compliqué d’avoir de belles parts toutes de la même taille. Par contre, si tu coupes d’abord ton gâteau en deux, puis chaque moitié en deux, puis chaque quart en deux, etc, tu as beaucoup plus de chances de faire de jolies parts égales.

Ici c’est un peu pareil, prenons l’exemple de puissance 4.

Problématique globale

On souhaite créer un jeu puissance 4.

Décrivons un peu le jeu : chaque joueur dispose d’une couleur et joue au tour par tour pour mettre des jetons dans une grille. Les jetons s’enfilent les uns au-dessus-des autres. Le premier qui aligne quatre jetons de sa couleur emporte la victoire.

Les grands problèmes

Il est bon de séparer les différents grands aspects du projet. Ici, on peut par exemple imaginer :

  • Il faut pouvoir afficher la grille du jeu.
  • Il faut détecter les clics.
  • Il faut pouvoir ajouter des jetons dans la grille.
  • Il faut détecter la fin d’une partie.
  • Et je termine par quelque chose d’extrêmement important qui est moins "visible" car interne au jeu : il faut pouvoir représenter l’état du jeu ; quelles sont les cases libres, quelle est la couleur des cases pleines, quel joueur est le prochain, etc.

Voilà la première étape de la réflexion : trouver de grandes problématiques à régler. Ensuite, le principe est de se concentrer sur une problématique à la fois ; si on pense tout le temps au projet dans sa globalité, on ne sait plus ou donner de la tête ; c’est pour ça qu’il faut diviser pour mieux régner.

Représenter l’état du jeu

Je commence par cet aspect car il est assez central et le reste (affichage, réponse au clic…) dépend directement de ça.

Ici, l’état du jeu est principalement composé de l’état de la grille. C’est sans doute cet aspect que tu as essayé de traiter en faisant une classe GameBoard. C’est une bonne idée, mais il ne faut pas qu’elle fasse trop de choses ! Commence déjà par pouvoir représenter l’état interne du jeu avant de te précipiter sur l’affichage : tu peux par exemple stocker un tableau à deux dimensions représentant la grille, qui te dit l’état des cases (par exemple 0 pour vide, 1 pour jaune, -1 pour rouge).

Une fois que tu as fait ça, tu auras déjà une représentation interne de l’état du jeu. Les différents aspects de ton jeu modifieront donc cet état.

Les choses que l’on doit pouvoir faire avec cette représentation

  • Ajouter un pion : tu peux créer une fonction membre de ta classe qui ajoute un pion à une colonne donnée. La fonction peut renvoyer true ou false pour dire si ça a bien été fait ou si ça a échoué à cause d’une colonne vide !
  • Accéder à la grille en lecture seule, pour l’afficher ou déterminer le vainqueur par exemple. Par exemple, tu peux écrire une fonction membre qui te dit de quelle couleur est une case donnée.

On vient de découper ce sous-problème en aspects atomiques que tu peux coder par des fonctions membres de ta classe.

Une fois ces aspects traités, tu auras une jolie représentation interne te permettant de plus facilement de faire ce qu’il y a autour.

Je poste déjà ça, je continue plus tard cet exemple de découpage ! N’hésite pas si tu as des questions ! :)

+1 -0

Continuons !

L’affichage

Maintenant qu’on a une représentation interne, l’affichage est simplifié. Tu peux reprendre ta fonction d’affichage que tu avais. Pour écrire une fonction, il faut savoir de quoi elle a besoin pour fonctionner, et tu le passes en paramètre. Ici, c’est la grille. Passe donc ta grille en paramètre, et à chaque étape de ta boucle, tu regardes ce que tu renvoie la fonction dont on a parlé précédemment qui te donne l’état de la case concernée (rouge, jaune, vide). Selon ce que ça te donne, tu mets la bonne couleur dans le cercle.

Comme tu vois, avec un découpage réfléchi, tu n’as plus besoin de te soucier de tout ton projet pendant que tu fais ton affichage. Il suffit que tu utilises ta représentation interne pour afficher la grille sans te poser de questions sur le reste.

Réagir aux clics

Au vu de ce qu’on a déjà (une fonction qui ajoute un jeton dans une colonne donnée), il nous manque simplement une fonction capable de trouver dans quelle colonne a cliqué le joueur puis d’appeler la fonction d’ajout de jeton avec la bonne colonne (et bien sûr la bonne couleur).

+1 -0

Je préférais être sûr que les bases était quand même solide. C’est très positif si c’est le cas ! Il reste de l’entraînement afin d’apprendre à utiliser tout ça ensemble. La réponse suivant la mienne t’explique déjà les choses donc je n’ai rien à rajouté à propos de cela.

S’il y a des points particulier où tu bloques, n’hésitez pas à demander ici plutôt s’à s’arracher les cheveux en tournant en rond :p .

@mehdidou99

Tes conseils pour découper m’ont été utiles. J’ai fait un puissance 4 qui fonctionne, mais n’est pas complet (pas eu le temps de faire l’animation d’un jeton, impossible de reset le grille etc). Je reste cependant fier d’avoir réussi un truc même bancal car ça prouve que j’avance quand même. Mais je me rends quand même compte au fil du temps que mon code doit être grandement amélioré et mieux structuré car si je veux ajouter une fonction, ça peut vite partir dans tous les sens et plus rien ne fonctionne car mauvaise organisation.

J’ai encore beaucoup de choses à apprendre sur la structuration, mais j’espère y arriver ! Encore merci.

@Helmasaur

Encore merci à toi. Avec ta réponse, ça m’a fait revoir des bases et ça tombe bien car je profite de ces vacances pour refaire la "piscine" PHP et je revois des trucs que j’avais complètement oublié.

Les choses à améliorer :

  • L’algorithmie
  • Organisation du code
  • Trouver ma propre façon d’apprendre, ma propre logique

Techniquement parlant :

  • Revoir les bases (conditions, boucles, fonctions)
  • Refaire des projets où j’ai échoué, peaufiner ceux que j’ai réussi mais pas assez
  • La récursivité (mon démon, haha)

Il y a sûrement beaucoup d’autres points, mais là comme ça, de tête, je les ai pas. :D

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte