예제 #1
0
int		       	Game::play()
{
  while (m_running)
    {
      if (m_falling == false)
	addNewPiece();
      if (pieceCanFall())
	applyFalling();
      else
	{
	  fixPiece();
	  cleanLines();
	}
      display();
      movePiece(m_controler.getEvent());
      display();
      usleep((1000000 / 10) * (m_speed / m_speedup));
      m_turn++;
      std::cout << m_turn << " => " << m_piece.getY() << std::endl;
      if (m_turn % SPEED_UP_DELAY == 0 && m_speed > 1)
	m_speed--;
    }
  return (0);
}
예제 #2
0
int main(int argc, char** argv)
{
	
	int continuer = 1, vitesse = 4 , cadre = 10, score = 0, nbLignes = 0, nbLignesTotale = 0, scoring = 0, hasard, indexProchainePiece = 0;
	char *name;
	
	int i = 0,j = 0;
	clock_t depart, fin;
	GameMatrix *surface = NULL, *pieceSuivante = NULL;
	
	/// Titre de la fenêtre
	char caption[64];
	
	/** Gérer les FPS **/
	/// Nombre de FPS qu'on veut atteindre
	int goalFps = 30;
	/// Temps qui se passe entre deux frames (en millisecondes)
	int ticksBetweenFrames = 1*(1000/goalFps);
	/// Tick à attendre avant la prochaine frame (en millisecondes)
	int nextTick = 0;
	/// Vrais FPS
	int realFps = goalFps, realFpsCpt = 0, lastSecondTicks = 0;
	/// Compteur pour descendre la pièce mobile
	int moveDownCpt = 0;

	/** Variables SDL **/
	SDL_Surface *screen = NULL;
	SDL_Event event;
	TTF_Font *police = NULL;

	
	// Tableau qui représente toutes les pièces possibles
	int pieces[NB_PIECES][5][5] = {{{0,0,10,0,0},{0,0,10,0,0},{0,0,11,0,0},{0,0,10,0,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,20,20,0,0},{0,20,21,0,0},{0,0,0,0,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,0,0,0,0},{0,30,31,30,0},{0,0,30,0,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,0,40,0,0},{0,0,41,0,0},{0,0,40,40,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,0,50,0,0},{0,0,51,0,0},{0,50,50,0,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,0,60,0,0},{0,60,61,0,0},{0,60,0,0,0},{0,0,0,0,0}},
								   {{0,0,0,0,0},{0,0,70,0,0},{0,0,71,70,0},{0,0,0,70,0},{0,0,0,0,0}}};
		
	
	

	srand(time(NULL));
	
	
	
	


	// Envoie l'adresse du pointeur de sorte à le modifier
	initSDL(&screen, &police);
	

	SDL_EnableKeyRepeat(100, 50);
	mainMenu(screen, police);
	
	// Régule les FPS
	tempoFps(&nextTick, ticksBetweenFrames);
	// Calcul les vrais FPS
	computeTrueFps(&realFps, &realFpsCpt, &lastSecondTicks);	
	
	// Crée une nouvelle surface de jeu
	surface = newGameMatrix(screen, 22,10);
	//Crée la zone d'affichage de la prochaine piece
	pieceSuivante = newGameMatrix(screen, 22, 10);
	// Régule les FPS
	tempoFps(&nextTick, ticksBetweenFrames);
	// Calcul les vrais FPS
	computeTrueFps(&realFps, &realFpsCpt, &lastSecondTicks);	
	
	// Ajoute une nouvelle pièce
	indexProchainePiece = rand()%NB_PIECES;
	addPiece(surface, pieces, indexProchainePiece);
	// Génère la nouvelle pièce et met à jour l'affichage de pièce suivante
	indexProchainePiece = rand()%NB_PIECES;
	afficherProchainePiece(pieceSuivante, indexProchainePiece, pieces, police, screen);
	
	do
	{
		SDL_Flip(screen);
		
		moveDownCpt++;
		realFpsCpt++;
		nbLignes = 0;		
		scoring = 0;
		/* Gère les évenements */
		while(SDL_PollEvent(&event))
		{
			
			switch(event.type)
			{
				case SDL_KEYDOWN: // Gère l'appui sur une touche
					switch(event.key.keysym.sym)
					{
						case SDLK_LEFT:
							moveLeft(surface);
							break;
						case SDLK_RIGHT:
							moveRight(surface);
							break;
						case SDLK_UP:
							rotate(surface);
							break;
						case SDLK_ESCAPE:
							continuer = 0;
						case SDLK_DOWN:
							SDL_EnableKeyRepeat(0, 0);
							vitesse*=5;						
						default:
							break;
					}
					break;
				case SDL_KEYUP:
					switch(event.key.keysym.sym)
					{
						case SDLK_DOWN: //pour descendre plus vite
							vitesse/=5;
							SDL_EnableKeyRepeat(100, 50);
							break;
						
						default:
							break;	
							
					}	
					break;		
				case SDL_QUIT:
					continuer = 0;
			}
		}
		
		/* Rempli l'écran de noir */
		SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 50,50,50));
		
	
		inGameInterface(screen, police, score);
				
		drawGrid(screen, surface->coteBloc, surface->width, surface->height, cadre);
		drawGameMatrix(screen, surface, cadre);
		// Affiche la prochaine pièce
		drawGameMatrix(screen, pieceSuivante, 250); 
		
		// Régule les FPS
		tempoFps(&nextTick, ticksBetweenFrames);
		// Calcul les vrais FPS
		computeTrueFps(&realFps, &realFpsCpt, &lastSecondTicks);
		
		// Met à jour le titre de la fenêtre
		sprintf(caption, "Tetris Powaaa ! %d fps !", realFps);
		SDL_WM_SetCaption(caption, NULL);

		if(moveDownCpt >= realFps/vitesse)
		{
			moveDownCpt = 0;
			// Si la pièce ne peut plus bouger
			if(moveDown(surface) == 1)
			{
				
				// Compte les lignes pleines lorsque la pièce atteint le bas du tableau
				nbLignes = (fixPiece(surface));
				printf("nombre de lignes = %d\n",nbLignesTotale);
				
				
				scoring = pow(2,nbLignes-1)*100;
				if (scoring < 100)
					score -= 50;
					
				score += scoring;
				
				printf("score = %d\n", score);
				
				nbLignesTotale += nbLignes;
				// Augemente la vitesse toutes les 10 lignes supprimées
				if (nbLignesTotale >= 10)
				{
					nbLignesTotale -= 10;
					vitesse += 2; 
				}
				// Haut du tableau atteint, fin du jeu
				if (surface->surf[2][4] !=0)
				{	
					name = SaisieNom(screen, police);
					printf("nom final = %s",name);
					
					EnregistrerScore(score,name);
					
					continuer = 0;
				}	
				// On continue normalement
				else
				{
					addPiece(surface, pieces, indexProchainePiece);
					// Génère la nouvelle pièce
					indexProchainePiece = rand()%NB_PIECES;
					// Met à jour l'affichage de la prochaine pièce
					afficherProchainePiece(pieceSuivante, indexProchainePiece, pieces, police, screen);

				}
			}
		}
		
		
	}while (continuer);
	
	TTF_CloseFont(police); /* Doit être avant TTF_Quit() */
	TTF_Quit();
	
	SDL_FreeSurface(screen);
	
	
	return EXIT_SUCCESS;
}