CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Test dans une variable aléatoire en C

Rorann
Rorann
Niveau 8
29 avril 2013 à 19:31:29

Salut à tous !

Voilà, je suis encore débutant en programmation, et je tente de développer un démineur. Pour l'instant, le programme est essentiellement composé de fonctions assez simples (afficher le plateau, gérer les clics droits et gauches...). Je suis actuellement en train de générer les mines aléatoirement. Le problème étant, certaines mines sont positionnées au même endroit. En effet, les coordonnées de la mine sont définis aléatoirement en x et en y avant d'être centrées au centre de la case à partir de ces coordonnées. Les cases faisant 50 pixels de côté et le plateau 501 pixels sur 500 (10 x 10 cases donc), la probabilité d'avoir plusieurs mines sur une même case est assez élevée (je voudrais entre 10 et 20 mines).

J'ai essayé plusieurs choses pour remédier à ce problème, utilisation de conditions, différents types de boucles, mais rien n'y fait, je me retrouve soit avec une boucle infinie, ou le même problème qu'avant...

J'utilise une seule bibliothèque graphique simplifiant certaines fonctions graphiques (je ne m'en sers ici que pour la variable aléatoire et tracer un cercle plein)

DEMIN mines(DEMIN dm) //fonction de placement de mines
{
POINT mine;
int nombre_mines;

for(nombre_mines=1; nombre_mines<15; nombre_mines++)
{
mine.x = alea_int(499); mine.y = alea_int(499); //définition aléatoire des coordonnées en x et en y sur un intervalle de 1 à 499
mine.x = (mine.x/50)*50+25; mine.y = (mine.y/50)*50+25; //centrage des mines au centre de la case
draw_fill_circle(mine, 13, color5); //dessin de la mine à partir du centre de la case
dm.tab[mine.x/50][mine.y/50] = 1; //placement de la mine dans un quadrillage virtuel défini plus haut (10 x 10 cases)
}
}

Voilà, c'est la "première" version du programme qui fonctionne, qui place les mines aléatoirement mais qui peut en placer plusieurs sur la même case.

Merci d'avance pour votre aide ! :)

oswim10
oswim10
Niveau 10
29 avril 2013 à 19:37:35

Pourqoui tu ne fais tout simplement pas choisir un nombre entre 1 et 50 (tes 50 cases), cela serait plus simple, non?

oswim10
oswim10
Niveau 10
29 avril 2013 à 19:39:03

+ avec une matrice servant à savoir si une case a déjà une bombe

chris_27
chris_27
Niveau 10
29 avril 2013 à 19:51:43

S'il y a très peu de mines, on peut effectivement relancer un tirage aléatoire si on s'aperçoit qu'on est en train de placer une mine là où il y en a déjà une (une boucle while bien sentie fait alors l'affaire).

Une autre façon de faire (pour une grille 50x50), plus sûre si on veut mettre beaucoup de mines (genre 800):

Pour i allant de 1 à 800
  - tirer un nombre N au hasard entre entre 0 et 2500-i
  - parcourir la grille ligne par ligne jusqu'à trouver la N-ième case vide
  - mettre une mine à cette case

C'est plus long car il faut trouver la N-ième case vide, mais on est sûr de mettre une mine par tirage aléatoire (alors que dans la version précédente, si on n'a pas de chance, on peut tirer plusieurs fois de suite des coordonnées où il y a déjà une mine).

Rorann
Rorann
Niveau 8
29 avril 2013 à 22:07:15

Bon, j'ai déjà commencé par définir les valeurs aléatoires à l'intérieur de la matrice (c'est plus simple en effet), j'arrive à définir la case comme false ou true, mais je n'ai toujours pas réussi à intégrer un test, car je ne sais pas où et comment le mettre. J'en suis à là pour l'instant (pas énormément d'évolution donc) :

DEMIN mines(DEMIN dm)
{
POINT mine;
int nombre_mines;

for(nombre_mines=1; nombre_mines<16; nombre_mines++)
{
mine.x = alea_int(10); mine.y = alea_int(10);
dm.tab[mine.x][mine.y] == 1;
mine.x = mine.x * 50; mine.y = mine.y * 50;
mine.x = mine.x + 25; mine.y = mine.y + 25;
draw_fill_circle(mine, 13, color5);
}
}

godrik
godrik
Niveau 30
29 avril 2013 à 22:12:27

Notons que caelacanthe a eu un probleme similaire dans son generateur de motif:

https://www.jeuxvideo.com/forums/1-47-53408-1-0-1-0-projet-sf-le-generateur-de-motifs.htm

chris_27
chris_27
Niveau 10
29 avril 2013 à 23:16:26

Oui, c'est à peu de choses près le même problème. Ce qui me fait penser que je n'ai toujours pas exploré les quelques pistes d'améliorations que j'avais en tête à l'époque. :(

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment