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 :

Tetris probleme fin de tour


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 13
    Points
    13
    Par défaut Tetris probleme fin de tour
    Bonsoir,
    Je ne suis pas sur de demander l'aide au bon endroit m'enfin, je dois coder un Tetris en C en utilisant GTK+ (version 2.0).
    La version de base "marche" mais j'ai un soucis pour lequel je ne trouve pas de solution convenable. Pour l'instant la piece tombe de ligne en ligne a un rythme donné. Quand elle ne peux plus descendre, sa position final est validé et une autre piece repars.
    Le probleme etant que l'etape de "la validation de la piece" dur le temps d'une boucle (le meme temps que met la piece a descendre d'une ligne). Or j'aimerais pouvoir deplacer ma piece à droite ou à gauche plus longtemps avant de passer à la piece suivante.

    J'utilise g_timeout_add() pour appeller la fonction qui fait descendre la piece a intervalle regulier. Comme premiere solution pour mon probleme, j'avais pensé à creer un second timeout quand la piece arrive en bout de course, appelé une seul fois, et pour lequel la fonction arrete le premier timer (celui qui fait descendre les piece). Puis lorsque ce second timer arrive a son terme, appelle une fonction qui crée une nouvelle piece et relance l'animation. Le probleme etant que je me reretrouve coincé, car lorsqu'une piece se retrouve en bout de course, la fonction lance forcement la fin du tour, or il se peut qu'en deplaçant ma piece à droite ou à gauche ensuite, elle puisse continuer à descendre, or ici elle ne le fera pas (ou alors elle descendra le temps que le timeout finisse puis s'arretera à ce moment, ce qui peut amener la piece à s'arreter simplement dans le vide.

    Les fonctions dont je parle :

    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
    gboolean on_timeout2(gpointer data){
    	Gui *g = gui_check (data);
    	//Info * info = g->info;
    	next_step_piece(data);
    	area_redraw(g->area);
    	return TRUE;
    }
     
    gboolean on_timeout3(gpointer data){
    	//Gui *g = gui_check (data);
    	Gui * g = data;
    	Info * info = g->info;
    	info_anim_stop(info);
    	return FALSE;
    }
     
     
     
    void info_anim_start(gpointer data){
    	Gui * g = data;
    	Info * info = g->info;
    	if(info->timeout1 == 0 || info->timeout2 == 0){
    		info->timeout1 = g_timeout_add(TIMEOUT1, on_timeout1, data);
    		info->timeout2 = g_timeout_add(TIMEOUT2, on_timeout2, data);
    	}
    }
     
    void info_anim_stop(Info * info){
    	if(!info->timeout1 || !info->timeout2)
    		return;
    	g_source_remove(info->timeout1);
    	info->timeout1 = 0;
    	g_source_remove(info->timeout2);
    	info->timeout2 = 0;
     
    }
     
    void choose_new_piece(gpointer data){
    	Gui * g = data;
    	Info * info = g->info;
    	g_source_remove(info->timeout3);
    	info->action = 1;
    	int piece = rand()%7;
    	switch(piece){
    		case 0 : create_tetramino_I(&info->piece); break;
    		case 1 : create_tetramino_S(&info->piece); break;
    		case 2 : create_tetramino_Z(&info->piece); break;
    		case 3 : create_tetramino_J(&info->piece); break;
    		case 4 : create_tetramino_L(&info->piece); break;
    		case 5 : create_tetramino_T(&info->piece); break;
    		case 6 : create_tetramino_O(&info->piece); break;
    		default : printf("erreur piece non valide\n"); break;
    	}
    	info->piece.colonne = PIECE_STARTING_COLUMN;
    	info->piece.ligne = PIECE_STARTING_LINE;
    	printf("je suis coincé ? \n");
    	info_anim_start(data);
    	check_grid(info);
    }
     
    void next_step_piece(gpointer data){
    	Gui * g = data;
    	Info * info = g->info;
    	Piece * piece = &info->piece;
    	Grid * grid = &info->grid;
    	area_redraw(g->area);
    	if(piece_can_move_down(info) == 0){
    		check_grid(info);
    		if(info->action == 1){
    			info->action = 0;
    			info->timeout3 = g_timeout_add_full(-50,5*TIMEOUT2, on_timeout3, data, choose_new_piece);
    		}
    		return;
    	}
    	set_piece_in_grid(info,FALSE);				
    	piece->ligne++;
    	set_piece_in_grid(info,TRUE);
    }

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur UNIFACE, C, C++, C#, Java
    Inscrit en
    Janvier 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur UNIFACE, C, C++, C#, Java
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    Salut Traknir,

    As-tu essayé de faire une boucle à 2 conditions ?

    du style :

    Tant que ( pièce descend && pièce à terre = 0 )
    descente de la pièce...
    descente de la pièce...
    descente de la pièce...
    ...
    Test si pièce à terre
    Si oui
    pièce à terre = 1 et tu lance la sauvegarde + l'autre pièce
    Fin Si
    Fin Tant que

    Je pense que tu es pas loin du tout. bon courage

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Merci de ton aide, j'ai pas fais comme ça, mais je me suis debrouillé de mon coté j'ai trouvé une solution. Merci de ton aide quand meme

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

Discussions similaires

  1. probleme pc ienovo tour au demarrage. que se passe t il.
    Par olivia001 dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 14/02/2015, 21h10
  2. probleme fin de fichier
    Par fahdijbeli dans le forum Débuter
    Réponses: 5
    Dernier message: 25/04/2013, 14h36
  3. Probleme pc : ma tour reboot toute seule !
    Par blob51100 dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 03/12/2012, 20h01
  4. Probleme fin de boutton ( pas biactol non^^)
    Par Valkirion dans le forum C++
    Réponses: 2
    Dernier message: 07/04/2007, 17h52
  5. thread (probleme avec une tour lego USB)
    Par JuuL.LapinouX dans le forum POSIX
    Réponses: 9
    Dernier message: 01/08/2006, 10h05

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