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

C Discussion :

Un problème avec un jeu de tennis


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Par défaut Un problème avec un jeu de tennis
    Bonjour à tous !

    Je voudrais coder un petit jeu de tennis en C et en mode console.
    Mais avant de me lancer dans le jeu lui même, j'ai voulu vérifier que cela était possible, mais je suis déjà confronté à un problème : le joueur ne peut déplacer la raquette qu'au rythme de la balle ... et cela est un peu gênant.
    Je n'ai trouvé aucune solution, alors si quelqu'un en a une ...

    Cordialement.

    main.c :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio2.h>
    #include <windows.h>
    #include "affichage.h"
     
    int main(int argc, char *argv[])
    {
        long x_raquette = 19;
     
        long y_raquette1 = 9;
     
        long y_raquette2 = 10;
     
        long y_raquette3 = 11;
     
        long x_balle = 40;
        long y_balle = 14;
     
        long toucheAppuyee = '0';
     
        char raquette_1 = '|';
        char raquette_2 = '|';
        char raquette_3 = '|';
     
        titre();
        terrain();
     
        do
        {
          gotoxy (x_raquette, y_raquette1);
          printf("%c", raquette_1);
     
          gotoxy (x_raquette, y_raquette2);
          printf("%c", raquette_2);
     
          gotoxy (x_raquette, y_raquette3);
          printf("%c", raquette_3);
     
          gotoxy( x_balle, y_balle);
          putch(' ');
     
          x_balle--;
     
          gotoxy( x_balle, y_balle);
          putch('o');
          sleep(300);  
     
          if (kbhit ())
          {
                    toucheAppuyee = getch();
                    if (toucheAppuyee == '8' && y_raquette1 != 7)
                    {
                                      y_raquette1--;
                                      y_raquette2--;
                                      y_raquette3--;
     
                                      gotoxy( x_raquette, y_raquette3 + 1);
                                      putch(' ');
                    }
     
                    if (toucheAppuyee == '2' && y_raquette3 != 21)
                    {
                                      y_raquette1++;
                                      y_raquette2++;
                                      y_raquette3++;
     
                                      gotoxy( x_raquette, y_raquette1 - 1);
                                      putch(' ');
                    }
          }
     
         } while (x_balle != x_raquette + 1);
     
     
      getch();      
      return 0;
    }
    affichage.c :
    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
    #include "affichage.h"
     
    void titre()
     
    {
         printf("\t\t\t\t+----------------+\n");
         printf("\t\t\t\t|  OPEN CONSOLE  |\n");
         printf("\t\t\t\t+----------------+");
    }
     
    void terrain()
     
    { 
         printf("\n\n\n");
         printf("\t\t+-----------------------+-----------------------+\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t|                       |                       |\n");
         printf("\t\t+-----------------------+-----------------------+");  
    }
    affichage.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void titre();
    void terrain();

  2. #2
    Membre confirmé Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Par défaut
    Personne n'a de solution ???
    Ou au moins pour faire en sorte que lorsque le joueur appuie 5 fois sur 8 et que le rythme de la balle oblige la raquette a ne se déplacer que de 3 mesures, lorsque le joueur appuie sur 2, le programme fasse descendre la raquette immédiatement et n'attende pas que les 5 entrées soient traitées.
    Si vous ne voyez pas ce que je veux dire, compilez mon code et appuiez 5 fois sur le 8 et tout de suite après 1 fois sur le 2 et vous comprendrez !

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'abord dans tes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                    if (toucheAppuyee == '8' && y_raquette1 != 7)
    tu ferais mieux de mettre des else ...

    Parce que dans chaque cas tu modifies les valeurs sur lesqelles tu testes....

  4. #4
    Membre confirmé Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Par défaut
    Oui mais si après je ne met pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (toucheAppuyee == '2' && y_raquette3 != 21)
    je peux faire descendre la raquette en appuyant sur n'importe quelle touche (et cela est très gênant d'autant plus qu'après il y aura une touche pour mettre la balle en jeu, une pour mettre pause, une pour quitter ...) !

  5. #5
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    je vais probablement dire une betise ou etre tres incomplet
    mais pour faire plusieurs taches a la fois ne suffit t il pas de laisser le systeme gerer ca ? en creant un processus fils pour gerer la balle ?

    ainsi le systeme se debrouille pour gere les processus ton programme n'a qu'a verifier les coordonnees de la balle et des raquettes et le clavier sur 3 processus

    il integrera ainsi ces processus dans les files d'attende du multithread

    probablement en utilisant l'include <unistd.h>
    et des pid=fork();
    des waitpid(pid,&etat,WUNTRACED)

    etc... pour gerer les differents processus ...

    mais bon la faudrai demander a plus expert que moi de te donner un exemple concret.

  6. #6
    Membre confirmé Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Par défaut
    Oui mais si j'utilise une FIFO, il faut bien que je la boucle ?!
    Et je ne peux pas mettre une boucle à l'interrieur d'une autre ?!
    Enfin ce n'est qu'une supposition, dites-moi si je me trompe ?!

    Sinon on m'a conseillé de vider le buffer du clavier après chaque entrée pour résoudre ma seconde proposition. J'ai donc trouvé ce code et je suis en train d'essayé de l'intègrer à l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <stdio.h>
     
    int c;
    while ((c = getchar()) != '\n' && c != EOF);

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Electroniktor
    Sinon on m'a conseillé de vider le buffer du clavier après chaque entrée pour résoudre ma seconde proposition. J'ai donc trouvé ce code et je suis en train d'essayé de l'intègrer à l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <stdio.h>
     
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    Il est impossible de faire un jeu réactif avec les fonctions d'E/S standard ni même conio et autre getch() ou kbhit() (pas de gestion de la répétition). Je te conseille la bibliothèque SDL qui est faite pour ça.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par frp31
    je vais probablement dire une betise ou etre tres incomplet
    mais pour faire plusieurs taches a la fois ne suffit t il pas de laisser le systeme gerer ca ? en creant un processus fils pour gerer la balle ?
    Bien sûr que c'est faisable, mais je préfèrerais qu'on utilise les pthreads qui sont plus portables, de même que je préfèrerais PDCurses à conio... Mais bon, le P.O. est parti comme ça, ce qui compte c'est l'algo. Le portage est un autre problème.

    Ne pas oublier non plus qu'il faut savoir détecter les collisions. Il faut donc pouvoir partager des données entre processus (balle, raquette...)... Compliqué. Là encore, les threads sont beaucoup plus simples.

  9. #9
    Membre confirmé Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Par défaut
    Euh ... c'est quoi cette bibliothèque PDCurses ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec un jeu
    Par Alex' dans le forum Windows XP
    Réponses: 15
    Dernier message: 25/09/2009, 08h41
  2. [SDL et C] Problème avec mon jeu de la vie
    Par _SamSoft_ dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 24/05/2008, 09h43
  3. [Installation]Problème avec le jeu de caractère NLS
    Par Benzeghiba dans le forum Oracle
    Réponses: 2
    Dernier message: 27/12/2006, 08h35
  4. Problème avec le jeu : "la bataille"
    Par rouliane dans le forum C++
    Réponses: 5
    Dernier message: 21/12/2006, 12h36
  5. Problème avec un jeu
    Par CCin dans le forum C
    Réponses: 6
    Dernier message: 25/10/2005, 18h10

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