Sokoban  1.1.3
Le fameux jeu Sokoban, poussez les boîtes !
main.c
Aller à la documentation de ce fichier.
1 /*
2 Sokoban is a terminal and GUI puzzle game
3 Copyright (C) 2022, 2023 Efe ERKEN
4 
5 This file is part of Sokoban
6 
7 Sokoban is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 Sokoban is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Sokoban. If not, see <https://www.gnu.org/licenses/>.
19 
20 SPDX-License-Identifier: GPL-3.0-or-later
21 */
22 
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <stdbool.h>
37 #include <string.h>
38 #include "grid.h"
39 #include "player.h"
40 #include "sdl2.h"
41 
42 // on declare les pointeurs de fonction pour passer de <ncurses.h> à SDL2 et vice versa
43 // facilement en fonction des options donnée en ligne de commande
44 // ces fonctions ont la portée globale pour pouvoir être utilisé dans d'autres fichiers source
45 void (*handle_init)() = NULL;
46 enum Event (*handle_event)() = NULL;
47 void (*handle_display)(grid *) = NULL;
48 void (*handle_quit)() = NULL;
49 
66 int main(int argc, char *argv[])
67 {
68  if (argc == 1 || (argc == 2 && strcmp(argv[1], "--console") == 0))
69  {
70  // on initialise les pointeurs de fonction pour l'affichage <ncurses.h>
75  }
76  else if (argc == 2 && strcmp(argv[1], "--sdl2") == 0)
77  {
78  // on initialise les pointeurs de fonction pour l'affichage SDL2
83  }
84  else
85  {
86  // on affiche un message d'erreur si l'utilisateur a mal donné les options de lancement
87  printf("Utilisation :\n");
88  printf("./sokoban [--console|--sdl2]\n");
89  // on quitte le programme
90  exit(1);
91  }
92  // on charge le niveau de jeu depuis un fichier
93  grid *level = init_level("levels/level1.txt");
94  // on initialise le système d'affichage de niveau
95  handle_init();
96  bool run = true; // on initialise l'interrupteur de boucle
97  // on continue le jeu tant que l'utilisateur n'a pas quitté le jeu
98  while (run)
99  {
100  // on affiche le niveau de jeu
101  handle_display(level);
102  // on récupère l'événement de l'utilisateur
103  enum Event event = handle_event();
104  // on décide ce qu'on va faire en fonction de l'événement
105  switch (event)
106  {
107  case EVENT_NONE:
108  break;
109  // on quitte le jeu si événement = quitter le jeu
110  case EVENT_QUIT:
111  run = false;
112  break;
113  // on bouge le jouer dans le sens correspondant si événement = bouger dans un sens
114  case EVENT_LEFT:
115  move_player(level, LEFT);
116  break;
117  case EVENT_DOWN:
118  move_player(level, BOTTOM);
119  break;
120  case EVENT_UP:
121  move_player(level, TOP);
122  break;
123  case EVENT_RIGHT:
124  move_player(level, RIGHT);
125  break;
126  }
127  // on termine le jeu si tous les objectifs sont réussis
128  if (level->goal_number == level->box_over_goal_number)
129  {
130  run = false;
131  }
132  }
133  exit_routine(level);
134  return EXIT_SUCCESS;
135 }
void exit_routine(grid *G)
Fonction qui s'occupe des routines de fermeture du programme.
Definition: grid.c:598
enum Event event()
Fonction qui renvoie un événement en fonction du clavier.
Definition: grid.c:440
void display_sdl2(grid *G)
Fonction qui affiche le niveau en paramètre dans une fenêtre avec SDL2.
Definition: grid.c:365
enum Event event_sdl2()
Fonction qui renvoie un événement en fonction du clavier en utilisant SDL2.
Definition: grid.c:540
void display_ncurses_init()
Fonction qui initialise la bibliothèque d'affichage ncurses.
Definition: grid.c:224
void display_ncurses_end()
Fonction qui termine l'affichage ncurses.
Definition: grid.c:343
void display_ncurses_draw(grid *G)
Fonction qui affiche le niveau en paramètre dans le terminal avec ncurses.
Definition: grid.c:249
grid * init_level(const char *file_path)
Fonction qui charge le niveau de jeu depuis un fichier dans la structure grid.
Definition: grid.c:133
enum Event event_ncurses()
Fonction qui renvoie un événement en fonction du clavier en utilisant <ncurses.h>
Definition: grid.c:490
Fichier header contenant les structures de données pour traiter les niveaux du jeu sokoban.
Event
Structure indiquant les différents événements dans le jeu.
Definition: grid.h:66
@ EVENT_RIGHT
Bouger le jouer vers la droite.
Definition: grid.h:71
@ EVENT_DOWN
Bouger le joueur vers le bas.
Definition: grid.h:69
@ EVENT_LEFT
Bouger le joueur vers la gauche.
Definition: grid.h:68
@ EVENT_NONE
Tout autre événement qui n'est pas géré dans le jeu.
Definition: grid.h:72
@ EVENT_QUIT
Quitter le jeu.
Definition: grid.h:67
@ EVENT_UP
Bouger le joueur vers le haut.
Definition: grid.h:70
int main(int argc, char *argv[])
La fonction qui réunit toutes les autres fonctions et structures.
Definition: main.c:66
enum Event(* handle_event)()
Fonction d'évènement de <ncurses.h> ou SDL2.
Definition: main.c:46
void(* handle_display)(grid *)
Fonction d'affichage de <ncurses.h> ou SDL2.
Definition: main.c:47
void(* handle_init)()
Fonction d'initialisation de <ncurses.h> ou SDL2.
Definition: main.c:45
void(* handle_quit)()
Fonction de fermeture de <ncurses.h> ou SDL2.
Definition: main.c:48
void move_player(grid *G, enum Direction D)
Fonction qui bouge le joueur dans la direction voulue dans le niveau.
Definition: player.c:65
Fichier header contenant les structures pour traiter le joueur et son mouvement.
@ TOP
La direction haute.
Definition: player.h:63
@ BOTTOM
La direction basse.
Definition: player.h:62
@ LEFT
La direction gauche.
Definition: player.h:61
@ RIGHT
La direction droite.
Definition: player.h:64
void sdl_quit()
Fonction qui referme la bibliothèque SDL2.
Definition: sdl2.c:82
void sdl_init()
Fonction qui lance SDL2 et crée une fenêtre.
Definition: sdl2.c:48
Fichier header contenant la structure pour gérer SDL2 pour le jeu.
Cette structure contient les informations concernant le niveau du jeu et son contenu.
Definition: grid.h:84
int goal_number
Nombre d'objectifs de game_grid.
Definition: grid.h:88
int box_over_goal_number
Nombre d'objectifs réussi de game_grid.
Definition: grid.h:89