Crunchez vos adresses URL
|
Rejoignez notre discord
|
Hébergez vos photos
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 30 sur 53
  1. #1
    Hello,

    Apres m'être tapé l'essentiel des bases qu'on peut trouver un peu partout (j'ai fini le cours openclassroom), je m'intéresse de plus en plus à la programmation pour android, c'est ce que j'aimerai faire à terme.
    Maiiiiiis... ouch, la marche est haute, c'est violent

    Si je devais avoir UN bouquin, UNE bible à garder sous la main pour développeur noobzor (et en Français, de préférence, je galère assez comme ca), qu'est ce que vous recommanderiez ? J'aimerais un truc où je puisse avoir les fonctions de bases java sous la main vu que j'ai pas de cerveau, et toute la partie android. Il y a t-il des références connues et reconnues ?

    Merci pour vos retour, et vos conseils si vous en avez. Android Studio est une putain d'usine a gaz qui me donne envie de me rouler en boule dans le coin de la pièce

    /break
    Dernière modification par Sorkar ; 23/01/2023 à 16h09.
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  2. #2
    Mais c’est pour des jeux ou des apps ?

  3. #3
    Plutôt pour des application pour le moment. Des jeux, j'aimerais, mais j'ai pas le niveau ca me parais encore plus compliqué. Ca je verrai plus tard.
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  4. #4
    Mais c'est pas du kotlin maintenant sur Android ? ?

    - - - Mise à jour - - -

    Sinon mon conseil c'est suis des tuto pour faire des apps simples (mais pas 300 hein, passe juste quelques jours sur des tuto), puis rajoute des petits trucs dedans qui te font marrer (si possible des trucs que tu vois dans pas mal d'apps pour être sûr que tu trouves des ressources pour t'accompagner sur internet), puis essaie de concevoir et dev une petite app qui te serait utile a toi personnellement. C'est comme ça que j'apprend en tout cas.

    J'ai pas de bouquin a te recommander, cherche des tuto sur youtube. Récents et sur des chaînes avec beaucoup d'abonnés ça ira

    Bonne chance !

  5. #5
    C'est aussi du Kotlin, oui. Mais java ne se limite pas à android, du coup ca me parais toujours pertinent. (après, je me goure peu être hein, en tant que débutant, c'est pas que j'ai choisi un langage à apprendre en faisant "pouf pouf", mais presque).

    Les tutos vidéos oui j'en suis toujours. Mais déjà à l'utilisation pour bosser en parallèle, c'est forcement très pratique, et en plus, c'est moins évident de pratiquer grâce à des vidéos en douce pendant que je suis au taf
    D'où la question sur les bouquins.

    Bon je vais tacher de trouver un truc sur android studio orienté débutant, l'a pas l'air d'en avoir un qui se démarque des autres.

    Autant en apprenant le dev en mode console, j'ai appris pas mal de choses assez vite, mais depuis que je m'intéresse aux interfaces graphiques en général, j'ai l'impression de plus rien faire et de stagner, c'est chiant.
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  6. #6
    Hello,
    Alors, maintenant il y a un nouveau langage appelé Flutter, qui permet de développer des applications natives aussi bien pour android que pour Ios, je te conseille vivement de te pencher la dessus si tu trouve que le Java est trop complexe (je partage ton avis), vu que pour le moment tu veux faire des applications, tu vas te régaler, et vu que tu as deja manger du Java sur Openclassroom, tu vas vite comprendre Flutter.

    Ensuite comme dit @schouffy Kotlin pour dev des apps android, c'est vraiment fait pour, c'est beaucoup plus simple que Java également.

    Après tu dis avoir fait poufpouf pour choisir un langage, si c'est le cas, dommage de ne pas être tombé sur Python, qui est un langage très très polyvalent (tu peux faire du jeux video avec le framwork PyGame, des application web, du data Learning et j'en passe) et Python c'est très très facile a prendre en main, y'a une énorme communauté Fr, des framwork pour presque tout (Django pour le web, Pygame pour le jeu video, Pandas pour la data....)

    A toi de voir, mais surtout, ne te dis pas que tu veux pas apprendre un nouveau langage pck tu a commencer Java, maintenant que tu connais les bases (variable, conditions, boucles, fonctions, objet) tu retrouve ça partout, on l'écrit juste un peu différemment d'un langage a l'autre

    regarde par exemple la différence entre affiché "hello world" en Python et en C# ou Java
    https://www.afternerd.com/blog/hello-world/

  7. #7
    Merci pour ton retour DarwinMorkai

    J'avais déjà jeté un œil a python oui, en effet, c'est un poil plus "simple". Je m'étais arrêté sur java parce que android est utilisé par l'écrasante majorité des gens, que ca tourne sur tout les plateforme, bref c'est très universel, au delà des appli mobile. Et une appli, c'est un truc que je pouvais faire seul. Le Kotlin lui, te limite aux appli android.
    Le but surtout la dessous n'est pas de développer absolument une appli bien précise (d'ailleurs j'ai toujours pas d'idée) mais d'apprendre le dev, avec des truc genre Flutter je pense que c'est trop spécifique, dans la même veine, j'aurai pu faire du nocode, mais c'est pas le but.

    Mais tu as raison pour le Python, j'y reviendrais peu être, d'autant que ma boite recrute des dev Python. Le but ultime inavoué, c'est tout de même de finir par se reconvertir, un jour, peu être. Mais avec mes 38 piges, je me sens déjà trop "vieux" pour ca Merci encore pour le retour j'apprecie, on se sent vite isolé devant la tâche.

    Edit : Ah par contre une bonne raison de changer de language, c'est que Android Studio, ca pue la merde, mais vraiment. J'aime pas cet IDE.
    Dernière modification par Sorkar ; 25/11/2022 à 11h10.
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  8. #8
    Citation Envoyé par Sorkar Voir le message
    Le but surtout la dessous n'est pas de développer absolument une appli bien précise (d'ailleurs j'ai toujours pas d'idée) mais d'apprendre le dev
    Le but ultime inavoué, c'est tout de même de finir par se reconvertir, un jour, peu être. Mais avec mes 38 piges, je me sens déjà trop "vieux" pour ca
    Pour répondre a ces deux points :
    -Si le but est d'apprendre a dev, je te te conseille vraiment de commencer par Python, puis de passer a Java si tu le souhaite vraiment, dans ce sens, la courbe d'apprentissage est plus souple, néanmoins, je nuance mon propos en disant "Qui peut le plus (apprendre Java) peut le moins (apprendre Python)"
    Donc, mon conseil serait de te tourner vers Python pour apprendre plus vite, garder la motivation et avoir de la satisfaction de se voir avancer. Ce n'est qu'un avis d'un jeune développeur

    -Pour la reconversion c'est jamais trop tard, j'ai 34ans, je suis en pleine reconversion pour devenir développeur web via une formation sur Openclassroom financé par pole emploi. C'est vraiment top mais demande une grande autonomie. Pour la petite histoire j'avais commencé la formation Python en auto financé lorsque pendant les 6 deniers mois de mon contrat de travail, une fois inscrit a pole emploi, on me dit que cette formation n'est pas financé... C'est pour cela que je me suis tourné vers la formation dev web. A savoir que les formation diplômante chez OC sont finançable par beaucoup de moyen.

    C'est un plaisir d'échanger, n'hésite pas si tu as d'autres questions


    PS: je ne sais pas si tu as vu mon post, mais si tu es tenter par l'apprentissage du code au travers de la création de jeux vidéos, je peux te filer le logiciel PICO-8 (je l'ai payé c'est DRM free), bref je te laisse regarder tout ça.

  9. #9
    Python c'est simple mais c'est super lent par contre. Donc attention aussi à ce que tu veux faire. Si tu veux faire un jeu qui a besoin de performances, python ne sera pas un bon choix. Par contre si tu veux réutiliser des outils existants, Python est probablement le langage avc le plus de bibliothèques d'outil pour faire facilement tout et n'importe quoi.

  10. #10
    Je plussoie Python. La courbe d'apprentissage est douce, il y a énormément de doc (le langage est ancien et populaire), et les outils de devs sont plutôt légers et agréables à utiliser. Tu auras un choc (positif) en utilisant PyCharm Community, après avoir subit Android Studio.
    Sa lenteur est un faux soucis. Déjà parce que les dernières versions ont gagné en rapidité, tu peux aussi pré-compiler (plutôt pré-transpiler) ton appli, et surtout, surtout, tu ne feras pas n'importe quoi avec du Python : pas de gros jeux AAA évidemment, mais tu as pleins de projets qui n'ont pas besoin de performances extrêmes, donc en pratique ce langage convient à plein de situations. Comme NodeJS, qui lui aussi est sensé être "lent". Pourtant on l'aime bien VSCode
    Et tu peux très bien faire des jeux pas excessivement gourmands, par ex avec PyGame.

    Mais si tu veux rester sur des applis Android, Java ira très bien. Kotlin aussi, voir davantage dans le sens où c'est le langage poussé par Google, et que tu as de plus en plus de documentation, de tutoriels, et d'outils, notamment pour créer tes interfaces graphiques avec du code (y'a des DSL Kotlin très bien) plutôt qu'avec l'éditeur d'interface d'Android Studio.
    Après, Kotlin, ce n'est absolument pas limité à Android. Java et Kotlin tournent sur la JVM, sont interopérables, et tu trouves de plus en plus de Kotlin ailleurs que sur Android. Aussi, les deux langages sont proches, donc passer de l'un à l'autre ne demanderait pas de grands efforts. IntelliJ peut même faire lui-même le gros d'une conversion Java->Kotlin (copie colle du Java vers un projet Kotlin : il te proposera le code Kotlin).

    Cependant, tant qu'on est sur Android : aujourd'hui, à moins d'avoir des projets pro où l'on te demande explicitement de faire du Java avec le SDK d'Anrdoid, c'est vraiment dommage de rester dessus. La mode, et elle se justifie pleinement, c'est d'utiliser des outils multiplateforme pour développer une fois une appli qui fonctionnera tant sur Android que iOS, iPadOS, voir en appli dans un navigateur. Ce ne sont pas les frameworks qui manquent, dont certains peuvent être utilisés en Java/Kotlin, mais aussi JS/TS par ex. Le SDK d'Android c'est vraimaent old-school, compliqué (le SDK Android est encore très brouillon malgré son ancienneté, donc si des concepts te semblent tordus c'est "normal", y'a plus rien à espérer à ce niveau...). Les SDK multiplateformes sont pour bcp modernes et jeunes, mieux pensés, et plus faciles à appréhender, et tu produiras plus vite des choses concrètes.
    Bref, à moins d'avoir une bonne raison d'utiliser le SDK d'Android (SDK pas terrible, et puis Android Studio quoi, la violence), faut utiliser des frameworks plus sympas, utilisables avec des outils eux-aussi plus sympas. Bref, ne te prends pas la tête si l'outil te semble naze : il est effectivement naze et y'a mieux ailleurs.
    Dernière modification par gros_bidule ; 25/11/2022 à 20h56.

  11. #11
    Merci pour le retour gros_bidule. Je me suis fait l'initiation openclassroom du python comme ca pour voir.

    Alors oui, ca à l'air plus simple en effet, mais rien d'énorme non plus, des ";" en moins, pas de variable a typer, j'ai l'impression que c'est que du détail ici et là. Apres c'est la vision très basique des début. Il y a peu être bien d'autres simplifications que j'ai pas encore vu.

    Je suis tout perdu
    Pour dire, je me suis même penché sur html / css. J'ai peu être une vision de gros débile, mais j'appelle pas ca de la programmation.

    Les SDK multiplateformes sont pour bcp modernes et jeunes, mieux pensés, et plus faciles à appréhender, et tu produiras plus vite des choses concrètes.
    T'as deux trois exemples des trucs les plus connus ?

    Pour en revenir a Python, c'est très très orienté console non ? Dans l'optique ou je repart la dessus, est ce possible de dev un programme avec interface graphique avec Pycharm ? ou il vaut mieux se tourner vers autre chose ?
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  12. #12
    Dis sans vouloir t'embêter, tu serais pas en train de te trouver des excuses pour procrastiner ?

    Pars de ce que t'as envie de faire (de l'Android si j'ai bien compris) et utilise une de ses technos populaires, celle qui te plait le plus, pour plonger dedans. Tu pourras toujours changer plus tard, tes acquis ne sont pas perdus, tu seras un meilleur programmeur. Te pose pas 1000 questions, fonce!

  13. #13
    Citation Envoyé par schouffy Voir le message
    Dis sans vouloir t'embêter, tu serais pas en train de te trouver des excuses pour procrastiner ?
    C'est pas faux.

    En un gros mois, j'ai plus avancé d'un poil, par contre sur ma machine j'ai PyCharm, AndroidStudio et SublimText , je vais bientot savoir écrire Hello Word dans tout les langages, à moi la fortune
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  14. #14
    Une petite réponse tardive, mais je vais aller dans le sens des autres: fais du Python.

    Java n'est pas si compliqué en tant que langage pur (et ça peut-être un bon langage d'apprentissage), mais c'est la philosophie de ses bibliothèques qui est compliquée: tout est sur architecturé (pour être plus précis: trop de design-pattern appliqués strictement dans tous les sens) ce qui fait qu'il est très lourd à utiliser.

    Python est très bien, facile (assez proche du langage naturelle dans sa syntaxe). Personnellement, j'aime bien sa philosophie (https://peps.python.org/pep-0020/).
    Si je peux lui trouvé un défaut, c'est qu'il est peut-être trop permissif (mais bon, je viens du C++...).

    Concernant ses performances, la JVM de Java est plus rapide.
    Mais sur un projet global, la différence ne va pas être si remarquable que cela (en comparant deux projets conçu correctement).

    Etant passé de Java à Python récemment (je suis en train d'essayer de lancer une filière Python pour les appli plus légères dans mon administration), je pense que j'ai doublé ma productivité avec Python alors que je ne suis pas encore parfaitement à l'aise avec le langage.
    Et purée passer Spring/Angular à FastApi, c'est tellement rafraichissant!

    Mon blog figurines: UglyMiniatures

  15. #15
    Bon bah je fait un petit retour vu que depuis je me suis mis quasiment au même niveau sur du python, bon encore quelques trucs a voir genre la gestion de fichier et les classes.
    Bah le verdict est sans appel : Putain c'est bien plus agréable a apprendre. Des trucs a se faire des nœuds au cerveau en java passent tout seul avec 3 mots en python. Quel langage de merde sérieux, je comprend maintenant les divers remarques que j'en avais vu.

    J'ai même commencé les interfaces en python et pareil, c'est bien plus digeste, plus logique.

    Joie
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  16. #16
    Let's go !
    Trop bien de lire ça, ça fait plaisir

    Regarde le Framwork PyGame, si tu as envie de faire du JV avec Python

    Amuse toi bien et tiens nous au courant !

  17. #17
    Franchement j'adorerais ca. Mais faut pas se mentir, c'est clairement un cran au dessus que coder une fenêtre qui fait une poignée de trucs. Donc a réserver pour quand je serais "à l'aise".
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  18. #18
    Citation Envoyé par Sorkar Voir le message
    Bon bah je fait un petit retour vu que depuis je me suis mis quasiment au même niveau sur du python, bon encore quelques trucs a voir genre la gestion de fichier et les classes.
    Bah le verdict est sans appel : Putain c'est bien plus agréable a apprendre. Des trucs a se faire des nœuds au cerveau en java passent tout seul avec 3 mots en python. Quel langage de merde sérieux, je comprend maintenant les divers remarques que j'en avais vu.

    J'ai même commencé les interfaces en python et pareil, c'est bien plus digeste, plus logique.

    Joie
    In before les lambda, l'héritage foireux et le typage dynamique

  19. #19
    Citation Envoyé par war-p Voir le message
    In before les lambda, l'héritage foireux et le typage dynamique
    Grlmlrmlrhumm..... C'est pas très très, gentil....
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  20. #20

  21. #21
    Et bien ca va plutôt pas mal, ca rentre bien. Mais les vacances ont un effet désastreux sur l'apprentissage. Heureusement que je reprend le taf, ce qui va me permettre de glander et de me remettre sérieusement au python

    Par contre globalement la difficulté est toujours la même pour moi, que ce sois en python ou java, le plus compliqué n'est pas forcement le bête apprentissage, mais de trouver des idées de trucs a développer pour s'entrainer ^^ Parce que bon, les trucs pour s'entrainer qu'on trouve partout sur le net, c'est d'un chiannnnnnnt et non motivant... Les todo list, appli bancaire, morpion etc etc... mon dieux.
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  22. #22
    Clairement, j'ai le même genre de soucis : je déteste les exercices proposés par les tutos, ou pire, les "kata". Certains adorent, mais ce n'est pas universel, donc il ne faut pas s'en vouloir si l'on a du mal à avancer avec ce genre de technique.
    J'ai toujours appris avec des projets persos : des projets qui me sont utiles, ou, dans une moindre mesure, utiles à des potes. Et c'est l'occasion des les opensoucer sur GitHub etc dès que c'est un minimum fonctionnel.
    Ca a commencé avec Steam Cleaner : j'en avais marre que Steam conserve sur mon PC les installeurs de DirectX, VSRedist etc. En quelques semaines j'avais un outil graphique pour virer ces installeurs. En soi, c'est un projet tout bête qui détecte des fichiers selon des patterns, c'est tout. Bah ça m'a permis d'apprendre les GUI Java, le regex, la gestion des fichiers, comment packager et distribuer un logiciel, utiliser Git (j'ai commencé avec Mercurial au tout début, Git ça n'existait pas encore et j'ai été traumatisé par SVN)...
    Puis j'ai continué avec plein de petits projets. Le plus important étant de ne pas se dévaloriser soi-même, ni le travail que l'on produit. On fait des petits projets, qui nous semblent parfois basiques voir ridicules, mais 1/ si ça se trouve personne avant toi n'avait développé ce petit outil 2/ ça n'empêche pas tes petits projets d'être utiles et surtout très formateurs.
    Encore un exemple : mon dernier projet en date, ce fut l'occasion d'apprendre Go : durant des années j'avais un script BAT pour faire des sauvegardes de trucs importants. Ca lançait juste la ligne de commande de 7zip sur plein de dossiers, avec quelques exclusions, protection par mot de passe, etc. C'était chiant à maintenir, chaque ligne de commande faisant 3km de long. Je me suis dit : et si un programme prenait en entrée un fichier JSON, et qu'il lançait 7zip tout seul comme un grand ? 10 jours plus tard c'était fait. J'ai détesté Go, mais mon programme fonctionne super bien, j'ai juste à maintenir un bête et très beau fichier JSON, et aujourd'hui je ne me demande plus s'il faudrait que j'essaie Go. Tout ça en 9 commits. C'est sur GitHib, tu peux regarder et même l'utiliser. Sa maintenance, ouais bof, elle va passer à la trappe. Du moins je publierai des patchs si j'en ai moi-même besoin. Si qqun propose des merge-requests, je les étudierai avec plaisir et si j'ai le temps, mais l'engagement ne va pas plus loin.
    Bref, réfléchit à des trucs qui t'embêtent, des petits problèmes, et résous les Sinon demandes nous des idées.

    Nota : ce n'est qu'une piste parmi d'autres. Tu peux par ex participer à des projets opensource existants, mais perso ça m'a toujours fatigué. Ca demande trop d'énergie, il faut que ça colle avec le mainteneur, et j'aime bien me montrer un minimum égoïste (ce qui n'est pas un mal, il faut penser un peu à soi) en montant mes propres projets, ce qui me permet de décider de tout de A à Z. Je fais assez de compromis et de concessions tous les jours au taff.
    Dernière modification par gros_bidule ; 02/01/2023 à 15h45.

  23. #23
    Bon j'ai un soucis avec mon code de morpion que je ne comprend pas. chatGPT m'est souvent d'une aide précieuse, mais alors là il bite rien autant que moi.
    Pour situer le cadre j'ai des boutons organisés comme ca :

    1 2 3
    4 5 6
    7 8 9

    Joueur1 : X
    Joueur2 : O

    La plupart des combinaisons fonctionnent très bien (presque toutes en fait), quand les 3 sont alignés, ca bloque tout les boutons et met un label à jour "joueur machin a gagné"

    SAUF, certaines combinaison, et je comprend pas pourquoi parce que mes méthodes sont des copiés-collés avec juste changement des chiffres des boutons.
    Alors vous m'excuserez le code hein, c'est simplifiable, plein des trucs sont déportables dans des méthode et j'ai une idée comment faire tout ca. Bref c'est dégueulasse mais c'est pas la question.

    Deux exemple de combinaison qui ne fonctionne pas :

    - - -
    x x x
    o o -

    et

    - - x
    - o x
    - o x

    Voila mon code GameActivity :

    Code:
    package fr.sorkar.morpion;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class GameActivity extends AppCompatActivity {
    
        Button bouton1;
        Button bouton2;
        Button bouton3;
        Button bouton4;
        Button bouton5;
        Button bouton6;
        Button bouton7;
        Button bouton8;
        Button bouton9;
        Button recommencer;
        public String nomJoueur1;
        public String nomJoueur2;
        public String tourJoueur;
        public TextView joueurGagnant;
        Button vignetteJoueur1;
        Button vignetteJoueur2;
        Boolean fin = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_game);
            recommencer = findViewById(R.id.Recommencer);
            TextView Noms = findViewById(R.id.feedback);
            nomJoueur1 = getIntent().getStringExtra("nomJoueur1");
            nomJoueur2 = getIntent().getStringExtra("nomJoueur2");
            Noms.setText(nomJoueur1 + " VS " + nomJoueur2);
            tourJoueur = getIntent().getStringExtra("nomJoueur1");
            joueurGagnant = findViewById(R.id.joueurGagnant);
            vignetteJoueur1 = findViewById(R.id.vignetteJoueur1);
            vignetteJoueur2 = findViewById(R.id.vignetteJoueur2);
            vignetteJoueur1.setText("X " + nomJoueur1);
            vignetteJoueur2.setText("O " +nomJoueur2);
            vignetteJoueur1.setBackgroundColor(getResources().getColor(R.color.blue));
            vignetteJoueur2.setBackgroundColor(getResources().getColor(R.color.grey));
            vignetteJoueur1.setClickable(false);
            vignetteJoueur2.setClickable(false);
            bouton1 = findViewById(R.id.button_1);
            bouton2 = findViewById(R.id.button_2);
            bouton3 = findViewById(R.id.button_3);
            bouton4 = findViewById(R.id.button_4);
            bouton5 = findViewById(R.id.button_5);
            bouton6 = findViewById(R.id.button_6);
            bouton7 = findViewById(R.id.button_7);
            bouton8 = findViewById(R.id.button_8);
            bouton9 = findViewById(R.id.button_9);
        }
    
    
        //Gere le changement des vignettes selon a qui le tour de jouer
        public void setBackgroundColorP1(){
            vignetteJoueur1.setBackgroundColor(getResources().getColor(R.color.blue));
            vignetteJoueur2.setBackgroundColor(getResources().getColor(R.color.grey));
        }
        public void setBackgroundColorP2(){
            vignetteJoueur2.setBackgroundColor(getResources().getColor(R.color.blue));
            vignetteJoueur1.setBackgroundColor(getResources().getColor(R.color.grey));
        }
    
        //Remet tout à 0
        public void resetGame(View view) {
            tourJoueur = nomJoueur1;
            setBackgroundColorP1();
            joueurGagnant.setText("");
            bouton1.setText("");
            bouton2.setText("");
            bouton3.setText("");
            bouton4.setText("");
            bouton5.setText("");
            bouton6.setText("");
            bouton7.setText("");
            bouton8.setText("");
            bouton9.setText("");
            bouton1.setClickable(true);
            bouton2.setClickable(true);
            bouton3.setClickable(true);
            bouton4.setClickable(true);
            bouton5.setClickable(true);
            bouton6.setClickable(true);
            bouton7.setClickable(true);
            bouton8.setClickable(true);
            bouton9.setClickable(true);
            fin = false;
        }
    
        //Desactiver tout les boutons
        public void DesactivationBoutons(){
            bouton1.setClickable(false);
            bouton2.setClickable(false);
            bouton3.setClickable(false);
            bouton4.setClickable(false);
            bouton5.setClickable(false);
            bouton6.setClickable(false);
            bouton7.setClickable(false);
            bouton8.setClickable(false);
            bouton9.setClickable(false);
        }
    
        //Fonction check condition de victoire
        public void gagnant() {
            if (bouton1.getText().toString().equals(bouton2.getText().toString()) &&
                    bouton2.getText().toString().equals(bouton3.getText().toString())) {
                if (bouton1.getText().toString().equals("X")){
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton1.getText().toString().equals("O")){
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else{
                    joueurGagnant.setText("");
                }
            }
            else if (bouton4.getText().toString().equals(bouton5.getText().toString()) &&
                    bouton5.getText().toString().equals(bouton6.getText().toString())) {
                if (bouton4.getText().toString().equals("X")){
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton4.getText().toString().equals("O")){
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else{
                    joueurGagnant.setText("");
                }
            }
            else if (bouton7.getText().toString().equals(bouton8.getText().toString()) &&
                    bouton8.getText().toString().equals(bouton9.getText().toString())) {
                if (bouton7.getText().toString().equals("X")){
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton7.getText().toString().equals("O")){
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else{
                    joueurGagnant.setText("");
                }
            }
            else if (bouton1.getText().toString().equals(bouton4.getText().toString()) &&
                    bouton4.getText().toString().equals(bouton7.getText().toString())) {
                if (bouton1.getText().toString().equals("X")) {
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton1.getText().toString().equals("O")) {
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                } else {
                    joueurGagnant.setText("");
                }
            }
            else if (bouton2.getText().toString().equals(bouton5.getText().toString()) &&
                    bouton5.getText().toString().equals(bouton8.getText().toString())) {
                if (bouton2.getText().toString().equals("X")) {
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton2.getText().toString().equals("O")) {
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else {
                    joueurGagnant.setText("");
                }
            }
            else if (bouton3.getText().toString().equals(bouton6.getText().toString()) &&
                    bouton6.getText().toString().equals(bouton9.getText().toString())) {
                if (bouton3.getText().toString().equals("X")) {
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton3.getText().toString().equals("O")) {
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else {
                    joueurGagnant.setText("");
                }
            }
            else if (bouton1.getText().toString().equals(bouton5.getText().toString()) &&
                    bouton5.getText().toString().equals(bouton9.getText().toString())) {
                if (bouton1.getText().toString().equals("X")) {
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton1.getText().toString().equals("O")) {
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else {
                    joueurGagnant.setText("");
                }
            }
            else if (bouton3.getText().toString().equals(bouton5.getText().toString()) &&
                    bouton5.getText().toString().equals(bouton7.getText().toString())) {
                if (bouton3.getText().toString().equals("X")) {
                    joueurGagnant.setText(nomJoueur1 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else if (bouton3.getText().toString().equals("O")) {
                    joueurGagnant.setText(nomJoueur2 + " a gagné !");
                    DesactivationBoutons();
                    fin = true;
                }
                else {
                    joueurGagnant.setText("");
                }
            }
        }
    
    // Parametrage de chaque clic bouton
            public void clic1 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton1.setText("X");
                gagnant();
                    if (!fin) {
                        tourJoueur = nomJoueur2;
                        setBackgroundColorP2();
                        bouton1.setClickable(false); //Rend le bouton non cliquable. Different de .setEnable(false) qui le désactive
                    }
                    else{
                        gagnant();
                    }
            } else {
                bouton1.setText("O");
                gagnant();
                    if (!fin) {
                        tourJoueur = nomJoueur1;
                        setBackgroundColorP1();
                        bouton1.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            }
        }
    
            public void clic2 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton2.setText("X");
                gagnant();
                    if (!fin) {
                        tourJoueur = nomJoueur2;
                        setBackgroundColorP2();
                        bouton2.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            } else {
                bouton2.setText("O");
                gagnant();
                    if (!fin) {
                        tourJoueur = nomJoueur1;
                        setBackgroundColorP1();
                        bouton2.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            }
        }
    
            public void clic3 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton3.setText("X");
                gagnant();
                    if (!fin) {
                        tourJoueur = nomJoueur2;
                        setBackgroundColorP2();
                        bouton3.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            } else {
                bouton3.setText("O");
                gagnant();
                    if(!fin) {
                        tourJoueur = nomJoueur1;
                        setBackgroundColorP1();
                        bouton3.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            }
        }
    
            public void clic4 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton4.setText("X");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur2;
                    setBackgroundColorP2();
                    bouton4.setClickable(false); //Rend le bouton non cliquable. Different de .setEnable(false) qui le désactive
                }
                else{
                    gagnant();
                }
            } else {
                bouton4.setText("O");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur1;
                    setBackgroundColorP1();
                    bouton4.setClickable(false);
                }
                else {
                    gagnant();
                }
            }
        }
    
            public void clic5 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton5.setText("X");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur2;
                    setBackgroundColorP2();
                    bouton5.setClickable(false); //Rend le bouton non cliquable. Different de .setEnable(false) qui le désactive
                }
                else{
                    gagnant();
                }
            } else {
                bouton5.setText("O");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur1;
                    setBackgroundColorP1();
                    bouton5.setClickable(false);
                }
                else{
                    gagnant();
                }
            }
        }
    
            public void clic6 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton6.setText("X");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur2;
                    setBackgroundColorP2();
                    bouton6.setClickable(false); //Rend le bouton non cliquable. Different de .setEnable(false) qui le désactive
                }
                else{
                    gagnant();
                }
            } else {
                bouton6.setText("O");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur1;
                    setBackgroundColorP1();
                    bouton6.setClickable(false);
                }
                else{
                    gagnant();
                }
            }
        }
    
            public void clic7 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton7.setText("X");
                gagnant();
                    if(!fin) {
                        tourJoueur = nomJoueur2;
                        setBackgroundColorP2();
                        bouton7.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            } else {
                bouton7.setText("O");
                gagnant();
                    if(!fin) {
                        tourJoueur = nomJoueur1;
                        setBackgroundColorP1();
                        bouton7.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            }
        }
    
            public void clic8 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton8.setText("X");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur2;
                    setBackgroundColorP2();
                    bouton8.setClickable(false); //Rend le bouton non cliquable. Different de .setEnable(false) qui le désactive
                }
                else{
                    gagnant();
                }
            } else {
                bouton8.setText("O");
                gagnant();
                if (!fin) {
                    tourJoueur = nomJoueur1;
                    setBackgroundColorP1();
                    bouton8.setClickable(false);
                }
                else{
                    gagnant();
                }
            }
        }
    
            public void clic9 (View view) {
            if (tourJoueur.equals(nomJoueur1)) {
                bouton9.setText("X");
                gagnant();
                    if(!fin) {
                        tourJoueur = nomJoueur2;
                        setBackgroundColorP2();
                        bouton9.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            } else {
                bouton9.setText("O");
                gagnant();
                    if(!fin) {
                        tourJoueur = nomJoueur1;
                        setBackgroundColorP1();
                        bouton9.setClickable(false);
                    }
                    else{
                        gagnant();
                    }
            }
        }
    
    }
    et le XML activity_game :

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:elevation="-1dp"
        tools:context=".GameActivity">
    
        <TextView
            android:id="@+id/feedback"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/textview"
            android:textColor="@color/black"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.495"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.092"
            tools:ignore="MissingConstraints" />
    
        <GridLayout
            android:id="@+id/grid_layout"
            android:layout_width="286dp"
            android:layout_height="193dp"
            android:columnCount="3"
            android:rowCount="3"
            android:useDefaultMargins="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <Button
                android:id="@+id/button_1"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="0"
                android:layout_column="0"
                android:onClick="clic1"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_2"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="0"
                android:layout_column="1"
                android:onClick="clic2"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_3"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="0"
                android:layout_column="2"
                android:onClick="clic3"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_4"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="1"
                android:layout_column="0"
                android:onClick="clic4"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_5"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="1"
                android:layout_column="1"
                android:onClick="clic5"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_6"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="1"
                android:layout_column="2"
                android:onClick="clic6"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_7"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="2"
                android:layout_column="0"
                android:onClick="clic7"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_8"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="2"
                android:layout_column="1"
                android:onClick="clic8"
                android:text=""
                android:textSize="40sp" />
    
            <Button
                android:id="@+id/button_9"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_row="2"
                android:layout_column="2"
                android:onClick="clic9"
                android:text=""
                android:textSize="40sp" />
    
        </GridLayout>
    
        <TextView
            android:id="@+id/joueurGagnant"
            android:layout_width="143dp"
            android:layout_height="48dp"
            android:text="@string/jouez"
            android:textAlignment="center"
            android:textColor="@color/black"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/grid_layout"
            app:layout_constraintVertical_bias="0.167" />
    
        <Button
            android:id="@+id/vignetteJoueur1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="60dp"
            android:layout_marginTop="164dp"
            android:text="@string/nomjoueur1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/vignetteJoueur2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="164dp"
            android:text="@string/nomjoueur2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.465"
            app:layout_constraintStart_toEndOf="@+id/vignetteJoueur1"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/Recommencer"
            style="@style/ButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="resetGame"
            android:text="@string/recommencer"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/joueurGagnant"
            app:layout_constraintVertical_bias="0.0" />
    
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    Au secours
    Citation Envoyé par poneyroux Voir le message
    c'est bien le seul aspect négatif du crack : ça coûte cher.

  24. #24
    Coin,

    avant de parler optimisation etc : as-tu pu lancer ton appli avec le debugger ? Tu mets un point d'arrêt sur le code qui évalue les conditions de victoire, et tu vois ce qui se passe. Tu comprendras pourquoi ça ne fait pas ce que tu désires.

  25. #25
    La méthode de détermination du vainqueur est "dure", en brute force. C'est normal de tout écrire explicitement si tu débutes, mais c'est plus long et plus dur à corriger. Evidemment, si tu oublies une combinaison, elle ne sera jamais prise en compte.

    Si tu stockais les résultats dans un tableau de 3x3 cases, tu pourrais le parcourir avec des boucles, dynamiquement, en testant seulement les lignes, colonnes et diagonales concernées par la dernière case jouée, sans avoir besoin de tester les autres combinaisons potentielles.

    Par exemple avec le tableau de 3x3, en ajoutant une variable numBouton renseignée lors du clic sur un bouton :
    (int)(numBouton/3) te donne la ligne - renvoie la partie entière de la division
    (numBouton%3)-1 te donne la colonne - numéro bouton modulo 3 moins 1 pour avoir 0,1,2 et pas 2,1,0.

    Ensuite il doit y avoir moyen de trouver un algo qui va tester la diagonale si la case jouée est un des coins ou les deux diagonales pour la case centrale, et la seulement la ligne et la colonne de la case jouée.


    Mais si ton code fonctionne, c'est l'essentiel, avant de chercher à optimiser et tout péter (parce que c'est comme ça que ça marche la programmation).

  26. #26
    Comme dit gros_bidule, attache le debugger et exécute ton code en pas à pas, en suivant ce que le programme fait pour comprendre pourquoi il "échoue" dans certains cas.
    Sans rentrer dans les détails de ton algo (que je n'ai pas lu), tu gagnerais grandement en lisibilité en faisant des raccourcis pour tes lectures de donnée dans chaque case.

    string bt1 = bouton1.getText().toString();
    string bt2 = bouton2.getText().toString();

    Et ensuite dans ton algo :

    bt1.equals(bt2)

    Rien que d'avoir un code plus lisible fera peut-être apparaitre une erreur manifeste dans ton code.


    Et sinon code en anglais :crosstopic:

  27. #27
    D'ailleurs y a pas moyen de se passer d'appeler la méthode toString() sur la valeur de retour de la méthode getText() ?
    Je connais pas ce langage et ces bibliothèques, mais ça me paraît redondant.

    Sinon le problème serait en effet beaucoup plus agréable à résoudre si le programme utilisait un tableau de cases.
    Dernière modification par Rashtek_Frites ; 23/01/2023 à 22h38.
    Citation Envoyé par LaVaBo Voir le message
    SANCTUARISATION DES TOILETTES !!

  28. #28
    Je suis entièrement d'accord avec les retours au dessus. Mais comme je disais la forme me pose pas problème pour le moment, je sais (enfin je vois, plutôt) comme améliorer ça.

    Non là, le soucis c'est que j'ai 90% des conditions de victoires qui fonctionnent, mais pas les autres. Avec un code relu plusieurs heure dont je suis sur.

    Le debugger..... Eh ben... C'est un truc intégré a Android studio ? Ça permet de genre exécuter le programme ligne par ligne c'est ça ? Ça pourrai bien m'aider effectivement.
    Je vais voir si je trouve ça.

  29. #29
    Ton problème est le suivant. Tu vérifies si tous les symboles de la première ligne sont identiques, et si oui, tu sors de la boucle. En particulier, dans ton premier exemple, tu vas t'arrêter à la 1ère ligne car les 3 symboles sont "-".
    Et comme tu utilises des "else if", tu ne vérifieras jamais les autres lignes. Tu me confirmeras ça en remarquant que toutes les configurations qui ne fonctionnent pas ont une ligne/colonne de "-" avant la ligne de X/O.
    Je pense qu'il suffit de remplacer les "else if" après chaque condition de victoire par un "if". On perd en efficacité, mais on gagne en correction
    Battle.net, BGA : S0uly

  30. #30
    Citation Envoyé par Souly Voir le message
    Ton problème est le suivant.
    Gloire à toi, paix et prospérité sur ta famille pour moulte générations !!!
    C'etait bien ça, j'ai plus une seule combinaison qui foire.
    Putain c'était bête comme chou, cette honte ahhhhhh....

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •