Générer une grille pour un jeu de type "Candy Crush"

Signaler
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013
-
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013
-
Bonjour a tous !!!

Je suis un ultra débutant en c++ et voilà que j'ai un projet à faire sur le célèbre jeu Candy Crush. L'idée est de programmer ce jeu sans utiliser de graphismes. Du coup, j'ai commencé à plancher dessus sauf que j'aurais besoin de votre aide pour une étape assez cruciale pour moi. J'ai bien initialisé mon tableau aléatoirement, fais un changement de variable pour que les entiers deviennent des caractères, réaliser un menu (avec switch etc...). Le problème est que lorsque j'affiche mon tableau aléatoire (de 4 colonnes par 4 grilles) j'ai par exemple 3 lettres qui s'alignent consécutivement et donc je dois créer une fonction qui la supprime avant qu'elle ne s'affiche pour n'afficher qu'un tableau aléatoire mais ou les lettres ne s'alignent pas plus de 2 fois consécutivement. Pour cela, j'ai tenté en vain de faire une fonction de type check (avec une condition if(tab[i][j]==tab[i][j+1] && tab[i][j]=tab[i][j+2]; tab[i][j+2]=1-tab[i][j+1] et ensuite printf tab[i][j+2]) mais sa ne marche pas enfin sa m'affiche une valeur en plus (peut etre qu'il faut que je fasse une fonction change pour qu'elle change la valeur précédente pour la nouvelle, mais à vous de me le confirmer. De plus, j'ai entendu parler de faire un masque (c'est a dire un tableau masqué rempli de 0 qui va généré aléatoirement des nombres jusqu'a qu'il ne trouve aucun enchainenement de 3 cases consécutives...)/. Que me conseillez vous, est ce que ma premiere fonction semble t elle exploitable ou pas du tout.......

(bcp de texte = débutant ^^)


Merci

10 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
5 janvier 2021
114
Bonjour.

Pour traduire/reformuler:
- Tu dois créer un jeu de type "Candy Crush" (en gros un "Bejeweled").
  • 3 éléments, ou plus, identiques à l'horizontale ou à la verticale disparaissent
  • Le "trou" est comblé en faisant tomber les items du haut vers le bas.
  • Les trous restant au dessus de ton application, sont remplacés par des éléments aléatoires.
  • Je suppose qu'on ne gère pas les bonus exotiques (style bonbons spéciaux, explosion, gélatine, etc...)


Ton problème:
- Tu essaies de générer une grille pour commencer la partie. Cette grille doit éviter d'avoir 3, ou plus, éléments identiques, côte à côte.

Ais-je bien compris ta problématique ?
(Je veux être sur que l'on se comprenne bien, afin que je puisse t'aider au mieux).

<mini hors sujet>
Ton texte est particulièremen indigeste... Pas parce que tu écris beaucoup, mais parce que tu ne le présente pas bien. Il faut éviter de faire des phrases trop longues et découper tes idées en paragraphes. La fautes d'orthographes "sa" au lieu de "ça" pique pas mal aux yeux aussi. Il manque aussi de la ponctuation (les virgules permettent de "respirer")
</mini hors sujet>
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
5 janvier 2021
114
Je te déconseille l'utilisation du "random de toute la grille + check" en mode "je recommence jusqu'à ce que..". C'est très inefficace. Mieux vaut le faire intelligemment.

Ce que je te propose, est la méthode suivante:
On va déposer un type d'éléments sur une case, en vérifiant que les voisins ne soit pas "interdits". Je m'explique en détails:
- Une fonction à qui on donne un type d'élément, et qui va récupérer les 2 cases à gauche de la case en cours. Si il y a 0 ou 1 case disponible, on renvoit vrai. Si il y a deux cases disponibles, on vérifie si celle-ci sont différentes. Si c'est le cas, on renvoit vrai. Sinon, on renvoi si l'une des cases est différentes du type d'élément donné.
- On créer aussi une fonction pour vérifier le haut (même raisonnement).
- On suppose que tu crées tes éléments du haut vers le bas et de la gauche vers la droite.
- Arrivé sur ta grille, tu génères un élément au hasard, et tu vérifies avec tes 2 fonctions, si tu as le droit de poser cet élément. Si ce n'est pas le cas, tu prends un autre élément au hasard. Tu recommences jusqu'à poser un élément.
- Tu passes ensuite au prochain éléments, et tu recommences jusqu'à remplir ta grille.

Ce n'est pas la meilleur méthode, mais c'est la plus simple à réaliser et à comprendre.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
5 janvier 2021
114
Si tu as le droit à tout, c'est une très bonne nouvelle, on va pouvoir le faire proprement.

Je te conseille de créer:
- Une classe Game qui permettra de gérer la début d'une partie, les menus, etc...
- Une classe Grid pour ta grille.
- Une classe Item, qui contiendra la liste des élément possibles.

Ta classe Grid aura plusieurs fonctions:
- checkLeft
- checkUp
- checkRight
- checkDown
- generate: generation d'une nouvelle grille
- switchItems: qui permet d'intervertir deux éléments
- check: Qui utilise les 4 autres fonctions de check, et qui sera utilisé quand on intervertira des éléments pour savoir si on doit les détruire.
- destroyItems: qui permet de détruire des éléments.
- fallItems: qui permet de faire tomber les éléments en suspension (suite à un destroy).

Ta classe item aura:
- Une fonction pour "donner" un élément aléatoire non déjà distribué.

Peux-tu me copier-coller ton code, afin que je regarde ce que tu as déjà fait ?

<hs>
sa => ça
Je vois tellement souvent cette erreur, pourtant aisément évitable, que je te joins ce lien:
http://www.francaisfacile.com/exercices/exercice-francais-2/exercice-francais-26659.php
</hs>
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013

Oui c'est exactement cela ! (Excuse moi des fautes mais j'avoue ne pas m'avoir relu ...).
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013

donc si j'ai bien compris :

- je vais créé une fonction du type :

if ( (T[i][j] == T[i][j+1]) && (T[i][j] == T[i][j+2]) ) {
return false;

?
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
5 janvier 2021
114
Je parle bien d'une fonction, et pas juste d'un "if". En gros, quelque chose du style

bool checkLeft(/* a définir*/)
{
// A adapter
if ( (T[i][j] == T[i][j+1]) && (T[i][j] == T[i][j+2]) )
return false;
}

et pas juste d'un "if".


Pour que je comprenne bien comment t'aider, comment utilises-tu le C++ ?
J'etends par là, est-ce qu'on te demande de faire du C dans du C++, du C++ avec des fonctions ou du C++ avec des classes ?
(ou alors as-tu le choix ?).
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013

J'ai le choix du moment que sa marche sous Visual C++, c'est bon.

Donc je dois faire une fonction checkleft et une checkup ?.
Puis je te l envoyer par mp ?

Ps : je tacherais de reviser mon francais une fois ce projet fini ^^
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
5 janvier 2021
114
Oui, tu peux me l'envoyer sans souci.
Messages postés
10
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
26 novembre 2013

Merci à toi, je viens de l'envoyer