Beispiel #1
0
bool play_move(game g, int piece_num, dir d, int distance) {
    piece p=g->piece_list[piece_num];
    int travel=0;
    while (distance!=0) {
        move_piece(p, d, 1);
        g->nb_moves+=1;
        distance--;
        travel++;
        for (int i=0; i<game_nb_pieces(g); ++i) {
            if (p==g->piece_list[i]) {
                i++;
                if (i>=game_nb_pieces(g))
                    break;
            }
            if (intersect(p, game_piece(g, i))) {
                fprintf(stderr, "Unauthorized move: Piece %d is preventing %d from moving.\n\n", i, piece_num);
                move_piece(p, d, travel*-1);
                g->nb_moves-=travel;
                return false;
            }
            if (out_of_grid(p, g)) {
                fprintf(stderr, "Unauthorized move: %d would be out of bounds.\n\n", piece_num);
                move_piece(p, d, travel*-1);
                g->nb_moves-=travel;
                return false;
            }
            if (((d==LEFT||d==RIGHT)&&(!can_move_x(p)))||((d==UP||d==DOWN)&&(!can_move_y(p)))) {
                fprintf(stderr, "Unauthorized move: Piece orientation doesn't match move direction.\n\n");
                return false;
            }
        }
    }
    return true;
}
Beispiel #2
0
bool play_move(game g, int piece_num, dir d, int distance){
	if ((!can_move_y(g->pieces[piece_num]) && (d == 0 || d == 2))
			|| ((!can_move_x(g->pieces[piece_num])) && (d == 1 || d == 3))) return false;
	bool move_isAllowed = true;
	piece tmp_piece = new_piece(0,0,0,0,true,true); // Initialisation d'une pièce temporaire (mallocs)
	copy_piece(g->pieces[piece_num],tmp_piece); 
	
	for (int i = 0; i < distance; i++) { // On decompose le mouvement en déplacement de une case
		move_piece(g->pieces[piece_num], d, 1);
		if ((get_x(g->pieces[piece_num])+get_width(g->pieces[piece_num])-1 >= game_width(g) || get_x(g->pieces[piece_num]) < 0)
				|| (get_y(g->pieces[piece_num])+get_height(g->pieces[piece_num])-1 >= game_height(g) || get_y(g->pieces[piece_num]) < 0)) move_isAllowed = false;
		for(int p = 0; p < game_nb_pieces(g);++p) { // On verifie si le mouvement est valide (intersect+depassement grille)
			if (piece_num != p && intersect(g->pieces[piece_num], g->pieces[p])) move_isAllowed = false;
		}
	}
	if (move_isAllowed) {
		for(int p = 0; p < game_nb_pieces(g);++p) {
			if (piece_num != p && intersect(g->pieces[piece_num], g->pieces[p])) printf("Erreur\n");
		}
		g->nb_mouv += distance;
		delete_piece(tmp_piece);
		return true;
	}
	// si le mouvement n'est pas valide on remets la piece a sa place initiale
	copy_piece(tmp_piece, g->pieces[piece_num]);
	delete_piece(tmp_piece);
	return false;
}
Beispiel #3
0
void erase_game(game newGame, WINDOW *my_win, WINDOW **car, WINDOW *score)
{
    destroy_win(my_win); /*Destroy window    */
    for (int i = 0; i < game_nb_pieces(newGame); i++) /*to create new one */
        destroy_win(car[i]); /*                  */
    destroy_win(score); /*                  */
}
Beispiel #4
0
void fillQueue(nodeQueue currentNode, nodeQueue queueTop, map previousState, list listMap, bool* cleared, bool isRH)
{
	//crée une map pour currentNode: currentMap si non présente dans la liste, si elle y est, on récupère
	//cherche tous les coups possibles
	for (int p = 0; p < game_nb_pieces(currentNode->m->g); p++)
	{
		//for (int dist = 1; dist < 1; dist++)
			for (int d = 0; d < 4; d++)
			{

				map r = createNewState(previousState, p, d, 1);
				if (r != NULL)
				{
					r = checkMapExistence(r, listMap);
					if (r != NULL)
					{
						//drawInterface(r->g, "TEST");
						queueTop = newQueueItem(r, queueTop);
						if (isCleared(queueTop, isRH))
						{
							//drawInterface(queueTop->m->g, "TEST");
							currentNode = queueTop;
							*cleared = true;
							return;
						}
						// queueTop = queueTop->next;
					}
				}
			}
	}
	
	//pour chaque coup (donc game), on crée une Map: newMap(newGame, currentMap)
	//si la map n'est pas présente dans  listMap, alors on l'y insère. On y ajoute un nouveau node dans la file, � partir de top
		//et on "incrémente" top (top = top->next or something)
}
Beispiel #5
0
int take_piece_num(game g, char* buf, int* piece_num){
  while(true){
    printf("What piece do you want to move?\n");
    read(0, buf, sizeof(char)*100);
    if(strcmp(buf, "cancel") == 10)
      break;
    if(strcmp(buf, "exit") == 10)
      return -1;
    if(buf[0]<48 || buf[0]>=48+game_nb_pieces(g) || buf[1] != 10)
      printf("Write a number between 0 and %dt\tor write cancel or exit.\n",game_nb_pieces(g)-1);
    else{
      *(piece_num) = atoi(buf);
      if(!can_move(g,*(piece_num)))
	printf("The piece %d cannot move.\n", *(piece_num));
      else
	return 1;
    }
  }
  return 0;
}
Beispiel #6
0
bool game_equals_not_mov(cgame G1, cgame G2){
  bool res = true;
  res = res && game_width(G1) == game_width(G2);
  res = res && game_height(G1) == game_height(G2);
  res = res && game_nb_pieces(G1) == game_nb_pieces(G2);
  if(res){
    int pieces = 0;
    for(int i = 0 ; i<game_nb_pieces(G1) ; i++){
      for(int j = 0 ; j<game_nb_pieces(G2) ;j++){
	if(piece_equals(game_piece(G1, i), game_piece(G2, j))){
	  pieces ++;
	  break;
	}
      }
      if(i+1 != pieces) return false;
    }
    if(pieces == game_nb_pieces(G1)) return true;
  }
  return false;
}
Beispiel #7
0
game copy_game_for_solver(cgame src){
  int nb_pieces = game_nb_pieces(src);
  int w = game_width(src);
  int h = game_height(src);
  piece *tab = malloc(sizeof(piece)*nb_pieces);
  for (int i=0;i<nb_pieces;i++){
    tab[i] = copy_piece_for_solver(game_piece(src, i));
  }
  game dst = new_game (w, h, nb_pieces, tab);
  delete_pieces_array(tab, nb_pieces);
  return dst;
}
Beispiel #8
0
int get_car_with_mouse(int x, int y, game tmpGame)
{
    int miny, minx, maxx, maxy;
    for (int i = 0; i < game_nb_pieces(tmpGame); i++) {
        cpiece tmp = game_piece(tmpGame, i);
        minx = get_x(tmp) * RATIO;
        miny = (game_height(tmpGame) - get_y(tmp) - get_height(tmp)) * RATIO;
        maxx = (get_x(tmp) + get_width(tmp)) * RATIO;
        maxy = (game_height(tmpGame) - get_y(tmp)) * RATIO;
        if (x >= minx && x <= maxx &&
                y >= miny && y <= maxy) {
            return i;
        }
    }
    return -1;
}
Beispiel #9
0
bool compareMap(map m1, map m2)
{
	//char* s1 = (char*) malloc(256*sizeof(char));
	//char* s2 = (char*) malloc(256*sizeof(char));
	//getIdFromGame(m1->g, s1);
	//getIdFromGame(m2->g, s2);
	//int r = strcmp(s1, s2);
	//free(s1);
	//free(s2);
	for (int i = 0; i < game_nb_pieces(m1->g); i++)
	{
		if ((get_x(game_piece(m1->g, i)) != get_x(game_piece(m2->g, i))) || (get_y(game_piece(m1->g, i)) != get_y(game_piece(m2->g, i))))
			return false;			
	}
	return true;
	//return (r == 0);	//retourne true si les chaines sont identiques
}
Beispiel #10
0
void draw_game(game newGame, int starty, int startx, int MAXROW, int MAXCOL, WINDOW **grid, WINDOW **car, WINDOW **score, int choosenCar, char *message, bool gameOverRh)
{
    *grid = create_newgrid(starty, startx, MAXROW, MAXCOL, SIZE, gameOverRh); // Create new grid
    wmove(*grid, 0, 0);
    //Create each car and highlight the selected one
    for (int i = 0; i < game_nb_pieces(newGame); i++) {
        if (choosenCar == i) {
            car[i] = create_newcar(game_piece(newGame, i), i, true, SIZE, MAXROW); // Create new car and highlight it
            continue;
        }
        car[i] = create_newcar(game_piece(newGame, i), i, false, SIZE, MAXROW); // Create new car
    }
    wmove(*grid, 0, 0);
    //Create score on right of the grid
    *score = create_newscore(SIZE * MAXROW + 1, SIZE*MAXCOL, starty, startx + SIZE * MAXCOL * 2 + 1, game_nb_moves(newGame), message);
    wmove(*grid, 0, 0);
}
Beispiel #11
0
void tableau_1D(int *t, game g){
    int taille_tab = game_height(g)*game_width(g);
    for (int i = 0; i<taille_tab; ++i){
        t[i] = -1;
    }
    for (int num_piece = 0; num_piece<game_nb_pieces(g); ++num_piece){
        cpiece p=game_piece(g, num_piece);
        t[get_x(p)+(get_y(p)*6)] = num_piece;
        if (get_width(p)>1){
            for (int i = 1; i<get_width(p); ++i){
                t[get_x(p)+(get_y(p)*6)+i] = num_piece;
            }
        }
        if (get_height(p)>1){
            for (int j = 1; j<get_height(p); ++j){
                t[get_x(p)+((get_y(p)*6)+(j*6))] = num_piece;
            }
        }
    }
}
Beispiel #12
0
// return the number of the piece in (,y) or -1
int is_piece(game g, int x, int y){
  for(int i=0; i<game_nb_pieces(g); ++i){
    cpiece p = game_piece(g, i);
    int x_piece = get_x(p);
    int y_piece = get_y(p);
    if(x_piece == x && !is_horizontal(p)){
      if(y_piece == y || y_piece == y-1)
	return i;
      if(get_height(p) == 3 && y_piece == y-2)
	return i;
    }
    if(y_piece == y && is_horizontal(p)){
      if(x_piece == x || x_piece == x-1)
	return i;
      if(get_width(p) == 3 && x_piece == x-2)
	return i;
    }
  }
  return -1;
}
Beispiel #13
0
void play_input(game newGame, int ch, int *choosenCar)
{
    if (ch >= '0' && ch <= '9') {
        *choosenCar = ch - '0';
    }
    if (*choosenCar != -1 && *choosenCar < game_nb_pieces(newGame)) {
        switch (ch) {
        case KEY_LEFT:
            play_move(newGame, *choosenCar, LEFT, 1);
            break;
        case KEY_RIGHT:
            play_move(newGame, *choosenCar, RIGHT, 1);
            break;
        case KEY_DOWN:
            play_move(newGame, *choosenCar, DOWN, 1);
            break;
        case KEY_UP:
            play_move(newGame, *choosenCar, UP, 1);
            break;
        }
    }
}
Beispiel #14
0
char* convertGame(game newGame)
{
    int n = game_nb_pieces(newGame);
    cpiece *arrPieces;
    arrPieces = malloc(sizeof (piece) * n);
    for (int i = 0; i < n; i++) {
        arrPieces[i] = game_piece(newGame, i);
    }
    //Sort
    for (int i = 0; i < (n - 1); i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (sup(arrPieces[j], arrPieces[j + 1])) {
                cpiece swap = arrPieces[j];
                arrPieces[j] = arrPieces[j + 1];
                arrPieces[j + 1] = swap;
            }
        }
    }
    char *parsed = serialize(arrPieces, n);
    free(arrPieces);
    return parsed;
}
Beispiel #15
0
int game_square_piece (game g, int x, int y){
	/*for (int p = 0; p < game_nb_pieces(g); ++p) {
		for(int i = 0; i < get_height(g->pieces[p]); ++i) {
			for(int j = 0; j < get_width(g->pieces[p]); ++j) { 
				if (get_x(g->pieces[p])+i == x && get_y(g->pieces[p])+j == y) return p;
			}
		}
	}
	return -1;*/
	int		size_x = game_width(g);
	int		size_y = game_height(g);
	int		nb_pieces = game_nb_pieces(g);
	int 	**grid = malloc(sizeof(int*)*size_y);
	int		output;
	
	for (int i = 0; i < size_y; ++i){
		grid[i] = malloc(sizeof(int)*size_x);
	}
	for(int x = 0; x < size_x; ++x){
		for(int y = 0; y < size_y; ++y){
			grid[y][x] = -1;
		}
	}
	for (int i = 0; i < nb_pieces; i++) {
		for (int x = 0; x < get_width(game_piece(g, i)); x++) {
			for (int y = 0; y < get_height(game_piece(g, i)); y++) {
				grid[get_y(game_piece(g, i))+y][get_x(game_piece(g, i))+x] = i;
			}
		}
	}
	output = grid[y][x];
	for (int i = 0; i < size_y; ++i){
		free(grid[i]);
	}
	free(grid);
	
	return output;
}
Beispiel #16
0
int main(int argc, char *argv[])
{
    WINDOW *my_win, *score;
    WINDOW **car;
    game newGame, tmpGame;
    MEVENT event;

    int ch = 0, choosenCar = -1, soluce_move = 0;
    char message[1024];
    bool quit = false;
    bool show_solution = false;
    gameStruct *resultSolv = NULL;
    //INIT
    setup();
    //END INIT
    //Wait for good size
    wait_for_size(MINH, MINW);
    //Instruction
    show_instruction(MINH, MINW);
    while (!quit) {
        quit = false;
        show_solution = false;
        soluce_move = 0;
        strcpy(message, "Playing");
        //Select game
        newGame = select_game();
        //Check for level file
        if (handle_level(&tmpGame)) {
            delete_game(newGame);
            newGame = tmpGame;
            MAXCOL = game_width(newGame);
            MAXROW = game_height(newGame);
            MINH = MAXROW * SIZE + 2;
            MINW = MAXCOL * SIZE;
        }
        car = malloc(sizeof (WINDOW*) * game_nb_pieces(newGame));
        //First draw
        draw_game(newGame, 0, 0, MAXROW, MAXCOL, &my_win, car, &score, choosenCar, message, gameOverRh);
        //Loop while the game is not finished
        while (!game_over(newGame)) {
            //Print on bottom of grid
            mvprintw(MAXROW * SIZE + 1, 0, "Please choose car :");
            ch = getch();
            if (ch == 's' && !show_solution) {
                show_solution = true;
                strcpy(message, "Solution");
                resultSolv = solv(newGame, gameOverRh,true);
                if(!resultSolv){
                    strcpy(message, "No solution");
                    show_solution=false;
                }
            }
            if (show_solution) {
                newGame = play_solution(newGame, resultSolv, soluce_move++);
            } else {
                if (KEY_MOUSE == ch) {
                    /* Mouse event. */
                    if (OK == getmouse(&event)) {
                        choosenCar = get_car_with_mouse(event.y, event.x, car, game_nb_pieces(newGame));
                    }
                } else {
                    if (ch == 'q') {
                        quit = true;
                        break;
                    }
                    play_input(newGame, ch, &choosenCar);
                }
            }
            wait_for_size(MINH, MINW);
            erase_game(newGame, my_win, car, score);
            draw_game(newGame, 0, 0, MAXROW, MAXCOL, &my_win, car, &score, choosenCar, message, gameOverRh);
        }
        if (!quit) {
            display_score(newGame);
        }
        for (int i = 0; i < game_nb_pieces(newGame); i++) {
            destroy_win(car[i]);
        }
        destroy_win(my_win);
        destroy_win(score);
        free(car);
        delete_game(newGame);
        if (resultSolv != NULL) {
            delete_game(resultSolv->current);
            free(resultSolv->move);
            free(resultSolv);
            resultSolv = NULL;
        }
    }
    endwin(); /* End curses mode		  */
    return 0;
}
Beispiel #17
0
/*
 * @brief Show different game and wait for user to choose
 * @return game The new game created
 */
static game select_game()
{
    int row, col;
    int pos = 0;
    int ch = 0;
    game newGame = NULL;
    while (ch != '\n') {
        clear();
        getmaxyx(stdscr, row, col);
        mvprintw(row / 2, col / 2 - 20, "Use arrow key to select your game");
        if (pos == 0) {
            mvprintw(row / 2 + 1, col / 2 - 20, "-> Rush Hour");
            mvprintw(row / 2 + 2, col / 2 - 20, "   Ane rouge");
        } else {
            mvprintw(row / 2 + 1, col / 2 - 20, "   Rush Hour");
            mvprintw(row / 2 + 2, col / 2 - 20, "-> Ane rouge");
        }
        ch = getch();
        if (ch == KEY_UP) {
            if (pos > 0)
                pos--;
        } else if (ch == KEY_DOWN) {
            if (pos < 1)
                pos++;
        }
        refresh();
    }
    if (pos == 0) {
        //Rush hour
        piece pieces[4];
        pieces[0] = new_piece_rh(3, 3, true, true);
        pieces[1] = new_piece_rh(3, 0, true, false);
        pieces[2] = new_piece_rh(4, 1, true, true);
        pieces[3] = new_piece_rh(5, 3, false, false);
        newGame = new_game(6, 6, 4, pieces);
        MAXCOL = game_width(newGame);
        MAXROW = game_height(newGame);
        MINH = MAXROW * SIZE + 2;
        MINW = MAXCOL * SIZE;
        game_over = game_over_hr;
        gameOverRh = true;
        for (int i = 0; i < game_nb_pieces(newGame); i++) {
            delete_piece(pieces[i]);
        }
        clear();
        refresh();
        return newGame;
    } else {
        //Ane rouge
        piece pieces[10];
        pieces[0] = new_piece(1, 3, 2, 2, true, true); //Rouge
        pieces[1] = new_piece(3, 3, 1, 2, true, true); // 2
        pieces[2] = new_piece(3, 1, 1, 2, true, true); // 3
        pieces[3] = new_piece(3, 0, 1, 1, true, true); // 4
        pieces[4] = new_piece(1, 2, 2, 1, true, true); // 5
        pieces[5] = new_piece(2, 1, 1, 1, true, true); // 6
        pieces[6] = new_piece(1, 1, 1, 1, true, true); // 7
        pieces[7] = new_piece(0, 0, 1, 1, true, true); // 8
        pieces[8] = new_piece(0, 1, 1, 2, true, true); // 9
        pieces[9] = new_piece(0, 3, 1, 2, true, true); // 10
        newGame = new_game(4, 5, 10, pieces);
        MAXCOL = game_width(newGame);
        MAXROW = game_height(newGame);
        MINH = MAXROW * SIZE + 2;
        MINW = MAXCOL * SIZE;
        game_over = game_over_an;
        gameOverRh = false;
        for (int i = 0; i < game_nb_pieces(newGame); i++) {
            delete_piece(pieces[i]);
        }
        clear();
        refresh();
        return newGame;
    }
}
Beispiel #18
0
void SDL_Display(game g, SDL_Renderer* rdr, TTF_Font* font, int popup){
	SDL_Rect rect;
	
	SDL_Color fontColor = {255, 255, 255};

	rect.w = (SCREEN_Y/game_height(g));
	rect.h = (SCREEN_Y/game_height(g));

	SDL_SetRenderDrawColor(rdr, 192,192,192, 255);
	SDL_RenderClear(rdr);
	SDL_SetRenderDrawColor(rdr, 0,255,127, 255);

	if(rules==0){//pour la Sortie des piece de Rush hour 
		rect.y = (SCREEN_Y/game_height(g))*2;
		rect.x = (SCREEN_Y/game_height(g))*game_width(g);
		rect.h = (SCREEN_Y/game_height(g));
		rect.w = 10;
		SDL_RenderFillRect(rdr, &rect);
		SDL_SetRenderDrawColor(rdr, 105,105,105, 255);
		rect.y = 0;
		rect.x = (SCREEN_Y/game_height(g))*game_width(g);
		rect.w = 10;
		rect.h = ((SCREEN_Y/game_height(g))*2);
		SDL_RenderFillRect(rdr, &rect);
		rect.y = ((SCREEN_Y/game_height(g))*3);
		rect.x = (SCREEN_Y/game_height(g))*game_width(g);
		rect.w = 10;
		rect.h = ((SCREEN_Y/game_height(g))*3);
		SDL_RenderFillRect(rdr, &rect);
		rect.y = (SCREEN_Y);
		rect.x = 0;
		rect.w = SCREEN_X ;
		rect.h = 10;
		SDL_RenderFillRect(rdr, &rect);
	}

	else if(rules==1){ //pour la Sortie des piece de Ane rouge 

		rect.y = SCREEN_Y;
		rect.x = (SCREEN_Y/game_height(g));
		rect.h = 10;
		rect.w = (SCREEN_Y/game_height(g))*2;
		SDL_RenderFillRect(rdr, &rect);
		SDL_SetRenderDrawColor(rdr, 105,105,105, 255);
		rect.y = 0;
		rect.x = (SCREEN_Y/game_height(g))*game_width(g);
		rect.w = 10;
		rect.h = SCREEN_Y;
		SDL_RenderFillRect(rdr, &rect);
		rect.y = SCREEN_Y;
		rect.x = 0;
		rect.w = (SCREEN_Y/game_height(g));
		rect.h = 10;
		SDL_RenderFillRect(rdr, &rect);
		rect.y = SCREEN_Y;
		rect.x = ((SCREEN_Y/game_height(g))*3);
		rect.w = ((SCREEN_Y/game_height(g))*6);
		rect.h = 10;
		SDL_RenderFillRect(rdr, &rect);
	}
	
	
	
	//Affichage des pièces
	for(int i = 0; i < game_nb_pieces(g); ++i){
		SDL_SetRenderDrawColor(rdr, color[i][0],color[i][1],color[i][2], 255);
		rect.x = get_x(game_piece(g,i))*(SCREEN_Y/game_height(g));
		rect.y = (SCREEN_Y - (get_y(game_piece(g,i))*(SCREEN_Y/game_height(g))));
		rect.w = get_width(game_piece(g,i))*(SCREEN_Y/game_height(g));
		rect.h = get_height(game_piece(g,i))*(SCREEN_Y/game_height(g));
		rect.y -= rect.h;
		SDL_RenderFillRect(rdr, &rect);
	}

	//Affichage du nombre de mouvements
	char disp_moves[20]; //contiendra l'affichage du nombre de mouvements
	char end_msg[30]; //contiendra le message de fin de partie
	
	sprintf(disp_moves," Mouvements : %d ",game_nb_moves(g));// Convertie le nb_mouv en caractère 
	drawText(rdr, font, fontColor,SCREEN_X-250 ,SCREEN_Y/2-SCREEN_Y/6 -200 ,disp_moves); //affichage nombre de mouvements 

	//Affichage des règles
	drawText(rdr, font, fontColor,(SCREEN_Y/game_height(g))*game_width(g)+120 ,SCREEN_Y-40 ,"R : Relancer");
	drawText(rdr, font, fontColor,SCREEN_X-120 ,SCREEN_Y-40 ,"Q : Quitter");

	if (popup != 0){
		SDL_SetRenderDrawColor(rdr, 50, 50, 50, 170);
		rect.x = 0;
		rect.y = SCREEN_Y/4;
		rect.w = SCREEN_X;
		rect.h = SCREEN_Y/2;
		SDL_RenderFillRect(rdr, &rect);
		if (popup == 1){
			drawText(rdr, font, fontColor,SCREEN_X/2 ,SCREEN_Y/2-SCREEN_Y/8 ,"Voulez-vous lancer une nouvelle partie ?");
		} else if (popup == 2){
			drawText(rdr, font, fontColor,SCREEN_X/2 ,SCREEN_Y/2-SCREEN_Y/8 ,"Voulez-vous quitter le jeu en cours ?");
		} else if (popup == 3){

			sprintf(end_msg,"Partie finie en %d mouvements",game_nb_moves(g));
			drawText(rdr, font, fontColor,SCREEN_X/2, SCREEN_Y/2-SCREEN_Y/8, end_msg);
			drawText(rdr, font, fontColor,SCREEN_X/2, SCREEN_Y/2-SCREEN_Y/17, "Voulez vous rejouer ?");
		}
		drawText(rdr, font, fontColor,SCREEN_X/6 ,SCREEN_Y/2+SCREEN_Y/8 ,"Echap : Non");
		drawText(rdr, font, fontColor,SCREEN_X-SCREEN_X/6 ,SCREEN_Y/2+SCREEN_Y/8 ,"Entree : Oui");
	}
	SDL_RenderPresent(rdr);
	SDL_Delay(50);
}