IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Probleme Robot de screenshot


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Probleme Robot de screenshot
    Bonjour,

    Voici mon problème, je suis en train de créer un robot pour automatiser une prise de capture d'écran (j'apprend avec mon frère mais il n'est actuellement pas la et pour un bon moment)
    mais j'ai un problème d'accolade que voici :
    J'accepterais volontier toute aide ou tous conseil.



    Pièce jointe 310083Pièce jointe 310088

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il nous faudrait au moins le source pour pouvoir t'aider. Tu as cherché à l'inclure sous forme de pièce jointe, mais tu l'as supprimée. C'est mieux de le coller directement dans le message en l'encadrant de balises CODE (voir cette animation pour savoir comment faire).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Excuse moi je suis nouveau ici

    C'est la derniere accolade qui me pose probleme


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    import java.awt.Robot;
    import java.lang.Exception;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.awt.image.BufferedImage;
    import java.awt.Rectangle;
    import java.io.File;
    import javax.imageio.ImageIO;
     
    class hearthstone{
    	public static void main(String[] args){
    		boolean b = true;
    		int screen = 0;
    		int result = 0;
    		while(b){
    			b = !check();
    		}
    	}
     
    	public static boolean check(){
    		try{
    			Robot roby = new Robot();
    			BufferedReader br = new BufferedReader(new FileReader("E:\\Jeux\\Hearthstone\\Logs\\Power.log"));
    			String line = br.readLine();
    			while (line != null){
    				if(line.contains("value=WON")){
    					result++;
    					if(screen == result - 1){
    						result++;
    						Thread.sleep(5000);
    						BufferedImage img = roby.createScreenCapture(new Rectangle(1920, 1080));
    						File output = new File("proof.jpg");
    						ImageIO.write(img, "jpg", output);
    						screen++;
    						return true;
    						}	
    					}
    					line = br.readLine();	
    				}
    			} catch (Exception e){
    				return false;
    				System.out.println("NON");
    			}
    		}

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu m'as vraiment tout copier, alors il ne manque qu'une seule accolade, tout simplement celle qui ferme celle qui ouvre la classe. Donc il te suffit d'ajouter à la fin du fichier }. Tu le dis d'ailleurs toi-même.

    Mais ce n'est pas le seul souci de ton code.

    1. Tu ne peux pas déclarer des variables dans une méthode et les utiliser dans une autre.
      Une variable déclarée dans une méthode est locale à la méthode. On peut passer la valeur d'une variable locale à une autre méthode par paramètre de cette dernière, et on peut modifier la valeur de la variable par le valeur de retour. C'est tout ce qu'on peut faire.

      Mais tu peux faire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
       
       
      class hearthstone {
      	int screen = 0;
      	int result = 0;
       
              hearthstone() {
      		boolean b = true;
      		while (b) {
      			b = !check();
      		}
              }
       
      	public boolean check() {
                    /*... ton code ... */
              }
       
      	public static void main(String[] args) {
                    new hearthstone();
      	}
       
       
       
      }
      Ici, screen et result sont des attributs de la classe, donc visibles de toutes les méthodes d'instance (non static) de la classe. Mais ça c'est dans l'optique qu'on veut conserver la valeur de ces variables entre chaque appel de check(). Sinon, il suffit de les déclarer dans check().

    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      return false;
      			System.out.println("NON");
      Il n'est pas possible d'exécuter du code après qu'on soit sorti de la méthode (ici par le return).
      En fait on peut avec un finally, mais ça ne sert à rien ici, puisqu'il suffit d'inverser :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
       
      System.out.println("NON");
      return false;

    3. Une méthode qui a un type de retour doit toujours renvoyer une valeur dans tous les cas, ou soulever une exception.
      Lorsqu'on lit le fichier jusqu'au bout et qu'on ne trouve pas de "value=WON", on ne retourne rien.

      Ajoute juste un return false; après la boucle. Ou sort le return false; du catch pour le mettre après.
    4. Il faut toujours fermer les ressources utilisées pour lire ou écrire un fichier, pour libérer les ressources éventuellement utilisées, et dans le cas d'écriture pour s'assurer que tout ce qu'on a écrit est bien dans le fichier (flush).
      Une solution simple est d'utiliser un try-with-ressource :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      try (BufferedReader br = new BufferedReader(new FileReader("E:\\Jeux\\Hearthstone\\Logs\\Power.log"))){
      			Robot roby = new Robot();
      			String line = br.readLine();
                              /**...**/
      } catch(Exception e) {
          /**...**/
      }
    5. Attention à la problématique de lire un fichier en boucle. Si le fichier ne contient pas la chaîne cherchée, tu vas le lire en boucle sans arrêt, ce qui risque de mettre à plat ton disque, de ne pas laisser beaucoup de temps à d'autres programmes qui cherchent aussi à l'utiliser, en particulier celui qui doit écrire la chaîne que tu cherches.
      En revanche, attendre 5 secondes avant de créer l'image, en laissant le fichier ouvert, ce n'est pas terrible, je fermerais le fichier et si c'est vraiment nécessaire, j'attendrais les 5 seconde après.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      boolean found = false;
       
      String line = br.readLine();
      while (line != null && !found ) {
      if (line.contains("value=WON")) {
      	result++;
      	if (screen == result - 1) {
      		result++;
      		found=true;
      	}
      }
      line = br.readLine();
      }
      if ( found ) {
      	Thread.sleep(5000);
      	Robot roby = new Robot();
      	BufferedImage img = roby.createScreenCapture(new Rectangle(1920, 1080));
      	File output = new File("proof.jpg");
      	ImageIO.write(img, "jpg", output);
      	screen++;
      	return true;
       
      }

    6. Je ne vois pas bien à quoi servent screen et result.
      Dès qu'une screenshot est fait, on retourne true, et donc on sort duwhile (b).
      Quand on trouve value=WON dans le fichier, la première fois, result vaut 0 et screen aussi.
      On fait result++, donc result vaut 1. on compare screen à result -1 : screen vaut 0, result-1 vaut 0, ils sont égaux. On fait le screenshot, on passe result à 2 et screen à 1 et le programme s'arrête. Donc tu peux complètement supprimer ces deux variables, le programme fera la même chose avec ou sans. Mais probablement que tu cherches à faire autre chose avec ces variables.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Déjà merci , ensuite

    1)Si j'ai bien compris je pourrais donc rentrer mais 2 variable au début de mon try catch?

    2)Rien a dire

    3)J'avoue ne pas bien avoir compris, j'ai déjà un return false; non?

    4)Je n'ai pas bien compris en quoi tu ferme les ressource la

    5)Enfaite le programme est censé tourner jusqu'à ce que j'ai fini mes partie, je dois donc l'arrêter moi même ou je peu faire qu'il sarrette lorsque je ferme mon programme, il faut que je vois

    6)Le fichier log ne se vide que lorsque le hearstone se ferme, donc j'ai mis en place ces variable dans l'optique de compter le nombre de partie finie et ne faire un screenshot que lorsque une nouvelle se fini. Mais d'apres mes calcul avec le result - 1 tous devrait bien tourne

    Merci encore pour tout !

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Zhyte Voir le message
    1)Si j'ai bien compris je pourrais donc rentrer mais 2 variable au début de mon try catch?
    Hum, là, c'est moi qui ne suis pas sûr de comprendre ce que tu veux dire. Tu parles de déclarer les variables au début tu bloc try comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static boolean check(){
    try{
         int screen = 0;
    	int result = 0;
    }
    catch(/*...*/) {
       /*...*/
    }
    Alors oui, ça tu peux.

    Citation Envoyé par Zhyte Voir le message
    3)J'avoue ne pas bien avoir compris, j'ai déjà un return false; non?
    Oui...et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    } catch (Exception e){
    				return false;
    				System.out.println("NON");
    			}
    Le return false est dans le bloc catch : il ne peut être exécuté que si une exception est soulevée. Si le fichier est lu jusqu'au bout sans exception, alors on arrive à la fin de la méthode, et là, ce qu'il y a dans le bloc catch ne sera pas exécuté, et il faut retourner une valeur. Si tu ne mets pas de return true, ton code ne compilera pas de toute manière : le compilateur te dira justement qu'il manque un retour de valeur.

    Citation Envoyé par Zhyte Voir le message
    4)Je n'ai pas bien compris en quoi tu ferme les ressource la
    C'est la syntaxe du try-with-resource qui fait ça.

    Sans try-with-resource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BufferedReader br = null;
    try{
       br = new BufferedReader(new FileReader("E:\\Jeux\\Hearthstone\\Logs\\Power.log"))
        /*... lecture fichier .. */
    }
    catch(IOException e) {
       e.printStackTrace();
    }
    finally {
        if ( br!=null ) {
              try {
                  br.close();
              }
              catch(IOException e) {
                  e.printStackTrace();
              }
        }
    }
    Avec try-with-resource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (
    try( BufferedReader br = new BufferedReader(new FileReader("E:\\Jeux\\Hearthstone\\Logs\\Power.log"))){
        /*... lecture fichier .. */
    }
    catch(IOException e) {
       e.printStackTrace();
    }
    C'est le compilateur qui va s'occuper de transformer ce code dans un code du genre de celui au-dessus. Et je pense que je n'ai pas besoin de t'expliquer que c'est quand même plus sympa d'avoir à écrire la deuxième syntaxe que la première.


    Citation Envoyé par Zhyte Voir le message
    5)Enfaite le programme est censé tourner jusqu'à ce que j'ai fini mes partie, je dois donc l'arrêter moi même ou je peu faire qu'il sarrette lorsque je ferme mon programme, il faut que je vois

    6)Le fichier log ne se vide que lorsque le hearstone se ferme, donc j'ai mis en place ces variable dans l'optique de compter le nombre de partie finie et ne faire un screenshot que lorsque une nouvelle se fini. Mais d'apres mes calcul avec le result - 1 tous devrait bien tourne
    Pas tout compris, mais comme je ne sais pas ce qu'il y a exactement dans ce fichier, comment ça évolue, etc.

    Déjà, si je comprends bien, si le fichier est vidé lorsque Hearthstone se ferme. Est-il vide au début ?
    Sinon, alors tu peux utiliser le fait qu'il y a des lignes dans le fichier pour savoir que le programme doit continuer à tourner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boolean run=true;
    while (lire());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public boolean lire() {
    boolean vide=true;
    try( BufferedReader br = new BufferedReader(new FileReader("E:\\Jeux\\Hearthstone\\Logs\\Power.log"))){
          for(String ligne = br.readLine(); ligne!=null; ligne=br.readLine()) {
                  vide=false;
                  /** traitement **/
          }
    }
    catch(IOException e) {
       e.printStackTrace();
    }
    return vide;
    }
    Après, j'ai l'impression que ce qui t'intéresse c'est toujours la dernière ligne, si elle n'a pas encore été lue, non ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [Probleme]Robot en Perl
    Par kzay83 dans le forum Web
    Réponses: 2
    Dernier message: 14/01/2010, 15h03
  2. probleme de robots ou autre qui "pompe" mes fichiers
    Par silvain dans le forum Serveurs (Apache, IIS,...)
    Réponses: 5
    Dernier message: 24/11/2006, 13h48
  3. Prise de ScreenShot : probleme
    Par spyk dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 05/09/2005, 18h42
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo