Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#51 29-10-2016 21:05:45

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

kao a écrit :

Puisque tu sembles être un joueur invétéré que penses-tu de l'ajout d'un CTRL+Z et d'un compteur du nombre de déplacement ?


Je ne suis certainement pas un joueur invétéré, je jouais à sokoban il y a plus de 10 ans déjà…
Pour tes propositions, je suis pour, la possibilité d'avoir un undo et le compteur de mouvement
sont une bonne idée wink

Dans rocksndiamond (qui est dans debian) ils avaient repris un sokoban avec les niveaux originaux,
il n'y avait pas de undo. J'ai découvert sokoban avec gforth (un interpréteur forth), le leur se joue en
mode texte  ; c'est avec celui-là que j'ai passé des heures smile
Comme quoi pas besoin de graphisme extra pour être jouable wink

Sinon dans debian tu peux regarder berusky, c'est basé sur sokoban, ça pourrait te donner des idées
pour ton jeu.

Et pour terminer j'ai trouvé un bug. Lorsque le jeu est en cours et que je change de bureau, lorsque je reviens
sur le jeu, la fenêtre n'est pas redessiné. Ce qui fait que ça affiche n'importe quoi. Il faut alors appuyer sur une
touche pour que soit affiché de nouveau correctement. Il doit avoir un moyen dans SDL pour lui demander de
faire cela, mais je ne connais pas du tout… Aller, je sens que tu vas trouver la solution wink


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#52 30-10-2016 11:24:11

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Merci pour les noms de jeux, je vais regarder ça.

Pour l'entrée sortie de bureau, je n'ai pas ce comportement sous Gnome.

Je pense que ça se trouve au niveau des events :
https://wiki.libsdl.org/SDL_WindowEvent
Je ne les ai pas implementer pour le moment.
Une détection d'event puis un refresh devrait faire l'affaire.
Je veux bien une capture pour rigoler.

Hors ligne

#53 30-10-2016 11:47:10

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Pour la capture, c'est fichu, ça ne le fait plus… Je n'arrive pas à reproduire ce bug… Étrange hmm

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#54 30-10-2016 12:02:17

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

En fait ce n'est pas le changement de bureau, c'est quand il y a deux fenêtres l'une sur l'autre.
Quand je bascule à la fenêtre du « dessous » et que je reviens au jeu voilà ce que cela donne :

file-R302659a8c544f863854ebac410dabf61

Ensuite, il suffit de passer la souris sur la fenêtre du jeu pour que ça se redessine correctement.

Et puis ça refait le coup sur les changements de bureaux, seulement il faut avoir commencé
à jouer pour que le bug se produise. Pas simple…

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#55 30-10-2016 18:32:31

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

J'ai testé et reproduit le problème avec OpenBOX dans une VM.
Dès que la fenêtre de devant bouge ou que l'on déplace la fenêtre sur les bords il y a soucis d'affichage donc il faut rafraîchir.
J'ai donc utilisé SDL_WINDOWEVENT_EXPOSED pour détecter tout changement.
Maintenant quand je bouge une fenêtre, situé devant, avec la souris, il n'y a plus d'effet de lag. Mais j'ai peur que cela consomme beaucoup de ressource pour une fenêtre que l'on utilise pas...
Gnome 3 semble gérer ça complètement différemment, le status de SDL_WINDOWEVENT_EXPOSED n'est jamais changé et pourtant je n'ai pas de problème d'affichage.
Il faut que je vois si je peux faire mieux.

Le fix est dans la branche develop pour le moment.

git checkout develop


pour changer de branche.

Hors ligne

#56 30-10-2016 18:35:42

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Ok, je vais tester cela wink

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#57 30-10-2016 18:41:03

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

En fait ça marche parfaitement bien, et ça ne prend aucun temps processeur visible supplémentaire.
Il faut comprendre que SDL est une machine qui gère les événements de façon intelligente…

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#58 30-10-2016 19:43:11

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

En regardant ton code, je pense à un détail de typographie. Pour les parenthèses,
lorsqu'il s'agit d'une fonction, je ne mets jamais d'espace devant la parenthèse.
Par contre j'en mets toujours une (espace) derrière un mot clef du langage comme
if, for, else… ce que tu sembles aussi faire.

Il y a des éditeurs de texte pour programmeur qui aide grandement aussi à la mise
en forme du source (je pense à emacs et vim). Je ne sais pas avec quel éditeur tu
travailles… J'ai vu que dans le lien sur le cours ils conseillaient Code::Blocks, je pense
qu'il doit faire ce genre de chose, non ?

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#59 30-10-2016 20:12:40

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Tiens, je me pose une question. J'ai vu que dans le fichier levels/Alberto_Garcia_Arranged.slc
il y a 245 tableaux… alors comment se fait-il que l'on ne se retrouve qu'avec que 236 tableaux
au niveau du jeu. Il devrait y en avoir 245+106+5=356 non ?

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#60 31-10-2016 13:57:21

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Pour les codes et les parenthèses j'utilises indent.

apt get install indent


indent -gnu file.c


L'outils permet de mettre en forme le code dans avec des conventions spécifiques (gnu dans mon cas).
Le problème c'est que je ne connais pas toutes ses conventions, et que je n'applique pas suffisamment indent à mon code, du coup j'ai un peu tout les styles qui se mélange.
A cela s'ajoute gnome-builder qui essaye de s'adapter à mon style mais pas toujours bien et le fait que j'essaye de me mettre à vim. Je manque donc encore de pratique et d'autodiscipline sur le sujet.

Pour les niveaux, je ne prends pas en compte ceux qui sont trop grand par rapport à la résolution choisit dans les préférences.
Les sprites font 40/40px si la résolution fait 400 * 600px je ne prends que les tableaux qui font 400/40 * 600/40 soit 10 par 15 cases.
Il faut aussi penser au menu qui prends une case (40px) dans la hauteur.
C'est donc normal de mon point de vue.

Hors ligne

#61 31-10-2016 15:12:15

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

ok, j'ai compris. Au sujet des niveaux si tu veux, je peux transformer ceux qu'il y a dans gforth
au format « slc », ça me demanderai pas trop de travail ; un petit script en ruby devrait faire l'affaire wink

Pour ce qui est des espaces entre le nom d'une fonction et de la parenthèse ouvrante, pratiquement
personne n'en met. C'est sûr qu'au début ça demande de s'éduquer un peu avant que ça devienne
un réflexe  smile Pour le reste de l'indentation, je sais pas c'est chacun à sa façon… À moins de suivre une
façon de faire explicite. Personnellement, je laisse faire vim à sa sauce, (sauf à quelques détails près).

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#62 31-10-2016 15:36:25

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

enicar a écrit :

ok, j'ai compris. Au sujet des niveaux si tu veux, je peux transformer ceux qu'il y a dans gforth
au format « slc », ça me demanderai pas trop de travail ; un petit script en ruby devrait faire l'affaire wink


Si tu as du temps je veux bien.
J'ai pris les fichiers "AC_Smileys_2.SLC" et   "Alberto_Garcia_Arranged.slc" comme base de travail mais je ne sais pas si j'ai le droit de m'en servir. Je comptais les supprimer pour éviter les problèmes de licence.
J'avais créé le fichier SokoRobot.slc justement pour éviter cela et je comptais l'alimenter avec des niveaux fait maison. Mais pour l'instant je n'en ai fabriqué qu'un seul smile
Si tu penses que l'on peut importer des niveaux issus d'un autre projet n'hésite pas. Si tu te sens d'en inventer de nouveau, on peut très bien les rajouter au fichier SokoRobot.slc ou à un fichier Enicar.slc tongue

enicar a écrit :


Pour ce qui est des espaces entre le nom d'une fonction et de la parenthèse ouvrante, pratiquement
personne n'en met. C'est sûr qu'au début ça demande de s'éduquer un peu avant que ça devienne
un réflexe  smile Pour le reste de l'indentation, je sais pas c'est chacun à sa façon… À moins de suivre une
façon de faire explicite. Personnellement, je laisse faire vim à sa sauce, (sauf à quelques détails près).


Je viens de tester et c'est bien l'indent -gnu qui ajoute les espaces avant les parenthèses...
Je serais d'avis de coller à indent afin de faciliter le travail, mais c'est vrai que c'est un peu bizarre.

Hors ligne

#63 31-10-2016 15:53:49

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Bon, je vais convertir les niveaux qui sont dans gforth. Je fais ça demain. Quant à en créer soi même
pourquoi pas, mais il faut qu'il soit suffisamment difficile pour être intéressant tout en restant possible…

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#64 31-10-2016 19:08:10

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

enicar a écrit :

Bon, je vais convertir les niveaux qui sont dans gforth. Je fais ça demain. Quant à en créer soi même
pourquoi pas, mais il faut qu'il soit suffisamment difficile pour être intéressant tout en restant possible…


Tout a fait, c'est un exercice intéressant, et rien de mieux qu'un cahier à carreaux et un crayon pour se lancer wink

Hors ligne

#65 31-10-2016 20:53:30

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Tiens j'ai trouvé aussi une version de sokoban écrite pour kde. Ça a été porté en python3
ça marche (sauf que ça plante lamentablement quand on quitte…). On peut récupérer
le jeu ici : http://www.cmi.ac.in/~prateek/ksokoban-ng/
Je pourrais repiquer leurs niveaux qui sont intéressants aussi ; ce sont de simples fichiers
textes, ça sera très facile wink

Dernière modification par enicar (01-11-2016 19:26:15)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#66 01-11-2016 13:06:32

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

J'ai dessiner les boutons pour le menu, je les ai disposé dans l'interface, mais il ne sont pas encore actif :
1477998080.png
Il faut que je trouve la place de mettre le compteur de coup aussi smile Je pensais le mettre en plus petit sous l'indication du niveau

Il faut aussi que je retravaille l'intégration de la souris afin de rendre le code plus souple. Ça risque de me demander un peu de temps et de creuse méninge scratchhead.gif

Hors ligne

#67 01-11-2016 23:56:09

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Ils sont chouettes tes boutons wink

Ce qu'il faudrait, c'est pouvoir parcourir les tableaux par fichier (puisqu'il y a plusieurs fichiers).
Chaque fichier serait vu comme une collection différentes de tableaux. Évidemment, ça demande
du travail tout ça wink

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#68 02-11-2016 10:13:50

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Oui ce serait intéressant, il faudrait un panneau de configuration accessible dans le menu, dans lequel il serait possible de décocher les fichiers qui nous intéresse moins. Cela servirait de filtre.
L'idée est à creuser...

Hors ligne

#69 02-01-2017 15:37:36

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Petit point sur l’avancement

J’ai pas mal bossé en fait, même si cela ne se voit pas trop.
Enicar proposait de pouvoir voir la liste des fichiers dans le menu et de pouvoir en sélectionner que quelques-uns. Je trouve que c’est une très bonne idée, mais comme je n’avais pas choisit la bonne approche pour l’organisation des menus, il fallait que je repense mon code. Il fallait aussi que je le rende plus souple pour pouvoir gérer correctement la souris et activer les boutons.
J’avance à tâtons, je découvre au fur et à mesure de nouvelles techniques pour penser mon code et organiser mon interface.

Dunatotatos a aussi ouvert un « issue » ici : https://github.com/kaochen/SokoRobot/issues/1
et qui pointe un manque d’organisation sur la gestion des préférences.

Les préférences :

Je m’y suis pris à plusieurs reprises et je n’ai pas fini, mais j’ai utilisé une structure C pour stocker l’ensemble des préférences logicielles (S_preferences pref;). J’ai aussi déclaré une autre structure (S_menuchoice menuChoice) pour stocker l’état du menu.

Ces deux structures sont déclarées de manière globale, elles sont donc accessibles depuis n’importe quelle fonction et me permette de passer certaines informations d’une fonction à l’autre, comme la taille des fenêtres ou le statut du menu (ouvert/fermé…)

Les grilles :
1483364055.png
Afin de pouvoir mémoriser la position du joueur et des différents éléments, j’avais généré une grille  de la taille de la fenêtre en la découpant en bloc de 40px par 40px.

Quand j’appuie sur la flèche de droite par exemple. Je viens lire la grille case par case pour trouver la position du joueur. Une fois que j’ai sa position dans la grille, je peux tester les cases situées à côtés (n+1) pour voir s’il y a une caisse ou un mur, ou s’il n’y a pas une caisse puis un mur (n+2). En fonction de cela, j’autorise le mouvement ou pas et je mets à jour les positions : n devient vide, n+1 devient le joueur, n+2 devient la caisse, et n+3 reste un mur.

Une fois que les statuts sont à jours dans la grille, je peux venir lire case par case et afficher l’image (sprite) qui corresponds à chaque case ( 0:0 un décor, 0:1 un mur, 0:2 une caisse etc.)

J’ai dupliqué ce principe au menu. Cela me permet de stocker la position d’un menu, ou d’un bouton. Quand je clique avec la souris, je viens lire la grille du jeu et celle du menu pour voir s’il n’y a pas un bouton ou une action à faire sur cet endroit.



Pour l’organisation du menu, comme je devais ajouter encore des sous-menus, j’ai utilisé des onglets avec des icônes. Cela permet d’en avoir plus.
Avant :
1476461856.png
Après :
1483363952.png


Pour la suite, je vais me laisser porter par les bugs et questions que je vais rencontrer.
J’essaye d’améliorer mon code au fur et à mesure que je comprends mieux les subtilités du C.
Le fait de le publier m’oblige à le rendre plus lisible et plus clair. Ce qui rend la relecture plus facile et l’ajout de nouvelle fonction plus simple aussi. Je passe donc pas mal de temps à nettoyer mon propre code. C’est plus long au démarrage, mais je gagnerai du temps après.

A suivre
Kao

Hors ligne

#70 02-01-2017 15:42:55

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Gros ajout de fichiers niveaux aussi.
Enicar a transformé  au format .slc une quinzaine de fichier issus d'autre projet open-source.
Je les ai ajouté dans le dossier levels/ pour que tout le monde puisse en profiter.
Encore merci à Enicar

Hors ligne

#71 02-01-2017 20:40:19

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.15
(G)UI : openbox
Inscription : 26-08-2010

Re : SokoRobot, un jeu écrit en C par mes soins

Ah ! je vais faire un git pull, pour voir tout ça wink

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#72 22-02-2017 23:16:45

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Up, voici mon dernier travail.
1487795518.png

Je vous explique les changements, qui ne saute peut-être au premier coup d'oeil.

- le logiciel créait un fichier session.ini pour stocker des informations, notamment les noms des niveaux que vous avez déjà réussi à résoudre.
Cela me permet d'afficher en haut à droite sur le menu, un petit logo "check". Ainsi on peut savoir quels niveaux ont déjà été résolu.

- La navigation a la souris est compléte dans les menus.

- J'en ai profité pour redessiner un peu les menus, je dois encore peaufiner, mais le principe et là.

- J'ai complété les valeurs dans l'onglet de description du menu, je peux remonter le nom de l'auteur et la taille du niveau.

- J'ai ajouté un verbose mode avec l'option "-v". Cela permet de rendre l'application plus ou moins causante dans un terminal. Les textes ne sont pas encore très optimisés, mais le principe est là.

Il y a encore du travail, mais au vu du peu de temps que j'ai pu me libérer, je trouve cela pas mal.
En tout cas, je suis content de l'ajout du fichier session.ini. Je trouve ça sympa de pouvoir savoir quel niveau on a déjà résolu.
Pour l'instant les niveaux sont stockés en clair dans le fichier session.ini, mais j'aimerai les stocker de manière crypter pour limiter la triche wink

Hors ligne

#73 28-02-2017 15:15:10

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

1488287576.png
J'ai dessiné un pouce levé pour le panneau de félicitations, en espérant qu'il soit compréhensible (le dessin).

Hors ligne

#74 06-04-2017 15:23:11

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : SokoRobot, un jeu écrit en C par mes soins

Petit Up pour signaler que le travail continu.
J'ai travaillé sur l'intégration d'automake qui permet de compiler et d'installer le programme plus facilement.
C'était un gros boulot, toujours dans la branche develop, mais il est maintenant possible d'installer le jeu avec ces quelques commandes :

./autogen.sh
./configure --prefix ~/ouJeVeux/
make
make install


Pour le lancer

~/ouJeVeux/sokorobot/SokoRobot


La désinstallation n'est pas encore parfaite. Les fichiers disparaissent mais pas toute l'arbo, je travaille sur le sujet.

make uninstall



Automake m'a donné du fil à retordre parce-que certains concepts m'échappait.
Je vais continué à travailler dessus, je veux être sûr que l'installation et la dés-installation soient parfaitement propres avant de pousser les modif dans la branch principale

Pour accéder à la branche develop il faut lancer ces commandes :

git clone https://github.com/kaochen/SokoRobot
git branch -f develop origin/develop
git checkout develop

Hors ligne

Pied de page des forums