| Qui est en ligne ? |
| Il y a : 32 utilisateurs en ligne, consultez le détail |
Forum » Serveur, Réseaux et Programmation » [C++] vérification sur des tableaux char |
Forum modéré par : jblecanard |
| Même auteur |
|
Score ( voter ) : |
|
| Page : [1] |
| Auteur | Message |
|---|---|
|
|
#0 Message posté le : 12-04-2007 à 16:58:06 |
Scarabée Forum : Inscrit Association : Arrivé(e) le : 15-04-2005 Nombre de messages : 229 |
Pour les besoins d'un projet, je dois coder un mini jeu de tetris dans une console. Je dois donc placer des pieces (tableau char 3x3) dans une aire de jeu (tableau char bcp plus grand). Puis leur faire faire des mouvements etc. Tout ca ne pose que peu de problèmes. Par contre, je dois vérifier si ces mouvement sont possibles (par exemple, ne pas laisser une piece en "traverser" une autre). Pour ca, j'envisage d'effectuer un mouvement "virtuel", non affiché a l'écran, et de vérifier si "c'est possible". D'apres ce que j'ai codé, le mouvement est possible si et seulement si : => Sur un char "espace" ( ' ' ), je superpose "autre chose" (une lettre) => Sur un char "autre chose" ( une lettre ou un tiret ( '-' ) ), je superpose un espace ( ' ' ) => Sur un char "espace" ( ' ' ), je superpose un "espace" ( ' ' ) Autrement dit, le mouvement n'est pas possible si et seulement si : = > sur un char "autre chose" ( une lettre ou un tiret ( '-' ) ), je superpose autre chose qu'un espace. La ou je bloque, c'est sur la facon de vérifier ces conditions Pour diverses raison, je ne peu pas prédir quelles seront les lettre utilisées parmi la série des char "autre chose" (mais ce seront des lettres) Il éxiste surement une autre facon de faire, mais j'ai beau me creuser un peu la tete, je n'arrive pas a trouver. J'espere que mon problème vous inspireras ------------------------------------- Il vaut mieux qu'il pleuve un jour comme aujourd'hui, plutôt qu'un jour où il fait beau Le fait que le monde soit peuplé de crétins permet à chacun de nous de ne pas se faire remarquer. |
|
|
#1 Message posté le : 12-04-2007 à 21:50:18 |
Jedi Forum : Modérateur Association : Membre fondateur Arrivé(e) le : 08-01-2005 Nombre de messages : 4030 |
La voilà ta condition ! A moins que je n'ai pas saisi ton problème. Le but est de savoir si la pièce peut avancer ou pas. Donc tu pars du principe que oui et tu vérifie que c'est cohérent. J'aurais fait pareil. Si la superposition dess deux "autre chose" dépasse le seuil dont tu parle, il suffit de tester que l'avancement ne dépasse pas ce seuil. Ou alors j'ai rien compris. Toutefois, il y a une chose que je ne comprend pas. Dans un tetris, il y a les cases vides et les cases remplies par une pièce, chaque pièce remplissant un nombre de cases précis. Pourquoi ne pas représenter celà avec de simples booléens (ou équivalent) ? Un 0 pour une case vide et un 1 pour une case remplie. En additionnant : pas de retenue, c'est ok, une retenue, ça ne passe pas. C'est beaucoup plus simple ! Pouquoi utiliser des char ? Il faut à mon avis bien séparer fond et forme. Choisi une représentation en mémoire de ton tetris ( je te conseille le système de booléens ou d'entiers à 1 bit) et après choisi une représentation graphique. ça rendra ton programme plus simple, plus souple, plus facilement adaptable à une autre interface etc... ------------------------------------- C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon - |
|
|
#2 Message posté le : 13-04-2007 à 11:00:05 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 17-10-2003 Nombre de messages : 1067 |
Pourquoi ne pas faire des états avec des int et des macros (ou des enum/const pour C++ c'est plus compliant) : # etats possibles : #define EMPTY 0 #define USED 1 // definir l'ecran : // au depart toutes les positions de l'ecran sont en etat EMPTY // return false if movement is not valid // or true if movement is valid // args are : // x : horizontal position in screen // y : vertical position in screen bool isValid(int x, int y); Enfin bon voilà quelques idées en vrac :p ------------------------------------- If you don't know, ask manpage ! |
|
|
#3 Message posté le : 13-04-2007 à 12:42:54 |
Scarabée Forum : Inscrit Association : Arrivé(e) le : 15-04-2005 Nombre de messages : 229 |
Ce qui me pose probleme, ce n'est pas d'additionner, de vérifier ce seuil etc, mais surtout de savoir si ce seuil éxiste, et, si il éxiste, quel valeur lui donner. J'ai commencé la programmation il y a moins de 3 mois a raison de 2H/semaine, je ne sait donc pas si cette solution d'addition de 2 char est viable Sais tu ou je pourrais trouver une table ou une règle qui me permette de déterminer le résultat de ces addition, et donc de déterminer ce fameu seuil, si tant est qu'il éxiste (ce qui n'est pas certain du tout dans l'état actuel des choses)
Voila c'est exactement ca, le joueur propose un mouvement, l'ordinnateur vérifie qu'il est possible en l'effectuant en mémoire et en vérifiant des condition, si pour toute les case, ca "marche" alors le mouvement est valié. SI pour une case ou plus, ca ne "marche" pas, le mouvement n'est pas valide
L'utilisation de tableau char pour l'aire de jeu et les piece est imposée par l'énnoncé, par contre, rien ne m'empeche d'effectuer, comme tu le propose, une représentation binaire en mémoire (avec des 0 et des 1) de ma surface de jeu et de mes pieces, et ainsi de faire mes check sur ces tableaux la
En fait c'est surtout l'écriture de la fonction isValid qui me pose problème Question peut etre con : ce n'est pas trop "bouffe mémoire" et "boufe processeur" de tout faire "en double", comem je l'ai déjà dit, je commence la programmation, une de mes principales difficultés est de me rendre compte si une solution est "élégante" pour résoudre mes problèmes. De la meme facon, j'ai souvent plusieures idées différentes pour passer au dessus de certains problèmes mais j'ai énormément de mal me décider quand a celle qui nécéssite un temps de calcul/utilisation mémoire minimum. Dans un certain sens, j'ai envie de dire que faire un représentation binaire de ma grille en mémoire et de tout faire en double : binaire/char multiplie par 2 la taille de mon programme, tout ca pour "simplement" vérifier si les mouvements sont possibles. J'essaie de prendre de bonnes habitude des le debut, mais j'avoue que c'est pas toujours simple Merci en tout cas pour l'aide apportée --Message édité par Snow le 13-04-2007 à 12:44:20-- ------------------------------------- Il vaut mieux qu'il pleuve un jour comme aujourd'hui, plutôt qu'un jour où il fait beau Le fait que le monde soit peuplé de crétins permet à chacun de nous de ne pas se faire remarquer. |
|
|
#4 Message posté le : 13-04-2007 à 17:55:16 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 17-10-2003 Nombre de messages : 1067 |
Si tu peux éviter les type double en effet ça sera mieux niveau mémoire ------------------------------------- If you don't know, ask manpage ! |
|
|
#5 Message posté le : 14-04-2007 à 13:30:07 |
Jedi Forum : Modérateur Association : Membre fondateur Arrivé(e) le : 08-01-2005 Nombre de messages : 4030 |
Heu je crois qu'il ne s'agit pas là d'utiliser les types "double" mais que Snow a l'impression de faire le boulot deux fois en choisissant une réprésentation mémoire et une réprésentation graphique différente. L'histoire des macros proposées par Tamiel revient au même que mon histoire de booléens ou d'integer à 0 ou 1. Ce qui prouve que je n'ai pas dit quelque chose de complètement idiot ! Sinon, séparer fond et forme va effectivement demander un tout petit peu plus de calculs, mais vu la puissance réclamée par un tetris et la facilité de maintenance que ça implique, la question de ne se pose pas... ------------------------------------- C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon - |
|
|
#6 Message posté le : 15-04-2007 à 15:52:13 |
Scarabée Forum : Inscrit Association : Arrivé(e) le : 15-04-2005 Nombre de messages : 229 |
Voila j'ai su trouver un seuil. En fait, le résultat de l'addition de deux char est un entier. Cet entier correspond a la somme des valeurs unicode en base décimale de chaqun des char qu'on additionne. On peut trouver un tableau récapitulatif des valeur unicode de chaque char ici : http://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode/U0080 les valeurs sont données en hexadécimal qu'il faut transformer en base 10 En envisageant toutes les combinaisons possibles, j'ai su trouver un seuil Merci a Jblecanard et Tamiel --Message édité par Snow le 16-04-2007 à 00:43:52-- ------------------------------------- Il vaut mieux qu'il pleuve un jour comme aujourd'hui, plutôt qu'un jour où il fait beau Le fait que le monde soit peuplé de crétins permet à chacun de nous de ne pas se faire remarquer. |
|
|
#7 Message posté le : 16-04-2007 à 14:53:49 |
Hobbit Forum : Inscrit Association : Arrivé(e) le : 17-10-2003 Nombre de messages : 1067 |
Cool D'ailleurs je viens de me rappeler qu'on peut signer les char et faire un cast en int ... Si je me souviens on obtient des chiffres de 0 à 255 pour du signed char et pour du unsigned char de -127 à 127 (sur la table ASCII étendue) ... Pour jblecanard : en effet j'avais pas lu ton post sur les états 0 et 1 et finalement on en est arrivé à la même logique donc c'est qu'on doit être pas loin d'une solution propre --Message édité par tamiel le 16-04-2007 à 14:56:04-- ------------------------------------- If you don't know, ask manpage ! |
| Page : [1] |
Forum » Serveur, Réseaux et Programmation » [C++] vérification sur des tableaux char |
Forum modéré par : jblecanard |
| Même auteur |
|
Score ( voter ) : |
|
- Petit scarabée : 0 pastille, moins de 100 messages
- Scarabée : 0 pastille, plus de 100 messages
- Hobbit : 1 pastille, plus de 1000 messages
- Naboo : 2 pastilles, plus de 2000 messages
- Elfe : 3 pastilles, plus de 3000 messages
- Jedi : 4 pastilles, plus de 4000 messages
- Maître Jedi : 5 pastilles, plus de 5000 messages