Bonjour à tous !
Voila je me suis lancé dans la création d'un générateur de donjons aléatoire.
Je n'ai jamais fait de script dans ce genre avant et j'ai besoin d'un petit coup de main .
Le donjon se compose de salles, que voici :
Les mur sont représentés par des traits noir.
Voila mon idée pour générer mon donjons :
On génère chaque case les unes après les autres en commençant par en haut à gauche.
A chaque génération de case on regarde les cases adjacentes du haut et de gauche (car celle du bas et de droite ne sont pas encore générées, logique).
Si l'une ou plusieurs de ces cases adjacentes comportes des "entrées" (des portes vers la case générée) on les prends en compte et on trouve une case qui respecte ces entrées.
et on fait ce système en boucle jusqu'à la fin de la carte.
Seulement voila je sèche un peu.
J'aimerais pouvoir faire :
$sql = 'SELECT id FROM pieces WHERE haut = 1 bas = 1';
Ce qui me retournerais toutes les ID des pièces ou le haut et le bas sont fermés et la gauche et la droite ouvertes ou fermés.
Ensuite je n'aurais plus qu'à piocher dedans pour prendre aléatoirement une piece qui répond à ces critères...
Mais le problème est là : je n'utilise pas de SQL pour ce script, les informations de mes pièces sont stockés dans des variables associatives... (voir infos_cases.php).
Ci contre mes deux pages commentés :
index.php
Voila je me suis lancé dans la création d'un générateur de donjons aléatoire.
Je n'ai jamais fait de script dans ce genre avant et j'ai besoin d'un petit coup de main .
Le donjon se compose de salles, que voici :
Les mur sont représentés par des traits noir.
Voila mon idée pour générer mon donjons :
On génère chaque case les unes après les autres en commençant par en haut à gauche.
A chaque génération de case on regarde les cases adjacentes du haut et de gauche (car celle du bas et de droite ne sont pas encore générées, logique).
Si l'une ou plusieurs de ces cases adjacentes comportes des "entrées" (des portes vers la case générée) on les prends en compte et on trouve une case qui respecte ces entrées.
et on fait ce système en boucle jusqu'à la fin de la carte.
Seulement voila je sèche un peu.
J'aimerais pouvoir faire :
$sql = 'SELECT id FROM pieces WHERE haut = 1 bas = 1';
Ce qui me retournerais toutes les ID des pièces ou le haut et le bas sont fermés et la gauche et la droite ouvertes ou fermés.
Ensuite je n'aurais plus qu'à piocher dedans pour prendre aléatoirement une piece qui répond à ces critères...
Mais le problème est là : je n'utilise pas de SQL pour ce script, les informations de mes pièces sont stockés dans des variables associatives... (voir infos_cases.php).
Ci contre mes deux pages commentés :
index.php
Code PHP :
<?
$image = 'images/';
// Infos (mur ou pas mur) sur chaque case
include('infos_cases.php');
?>
<form action="" method="post">
Largeur :<br>
<input name="x_max" type="text" value="<?=$_POST['x_max']?>" ><br>
Longueur :<br>
<input name="y_max" type="text" value="<?=$_POST['y_max']?>" ><br>
(Option Case :)<br>
<input name="case" type="text" value="<?=$_POST['case']?>" >
<input type="submit" value="Génerer">
</form>
<br>
<hr>
<br>
<?
if(isset($_POST['x_max']) AND is_numeric($_POST['x_max']) AND isset($_POST['y_max']) AND is_numeric($_POST['y_max']) AND $_POST['x_max'] <= 30 AND $_POST['y_max'] <= 30){
// On calcul la largeur en pixel du div qui va contenir les div "case"
$largeur_px = $_POST['x_max']*90;
$carte .= '<div id="limite_largeur" style="width:'.$largeur_px.'px;">';
// $num_c représente le numero de la case
$num_c = 0;
for ($nb_y = 0; $nb_y < $_POST['y_max']; $nb_y++)
{
for ($nb_x = 0; $nb_x < $_POST['x_max']; $nb_x++)
{
$num_c++;
// On rajoute +1 pour ne pas avoir pour origine x=0/y=0 mais x=1/y=1 (confort)
// Les variables si dessous sont faites pour pouvoir retrouver facilement l'id d'une case à partir de son X et Y et inversement
$cases[$nb_x + 1][$nb_y + 1] = $num_c;
$cases[$num_c]['x'] = $nb_x + 1;
$cases[$num_c]['y'] = $nb_y + 1;
// Récupération de l'ID cases du dessus et de gauche
$case_dessus = $cases[$cases[$num_c]['x']][$cases[$num_c]['y']-1];
$case_gauche = $cases[$cases[$num_c]['x']-1][$cases[$num_c]['y']];
// Si il n'y a pas de case en haut ou à gauche on considère ça comme un mur
if($cases[$case_dessus]['piece'] == ''){$cases[$case_dessus]['piece'] = 0;}
if($cases[$case_gauche]['piece'] == ''){$cases[$case_gauche]['piece'] = 0;}
// ICI : toutes les rêgles de passage (mur/ouverture)
//$cases[$num_c]['image'] = $piece[$cases[$num_c]['piece']]['image'];
$carte .= '<div style="background-image:url('.$cases[$num_c]['image'].'); background-color:#FFFFFF; color:#000000; height:90px; width:90px; float:left; display:inline; text-align:center;">';
if($_POST['case'] == $num_c){
$carte .= '<b>'.$num_c.'</b>';
//$carte .= '<br>( x:'.$cases[$num_c]['x'].' y:'.$cases[$num_c]['y'].' )';
$carte .= '<br>ID Case du dessus : '.$case_dessus;
$carte .= '<br>ID Case de gauche : '.$case_gauche;
} else {
$carte .= $num_c;
}
$carte .= '</div>';
}
$carte .= '<div style="clear: both;"></div>';
}
$carte .= '</div>';
echo $carte;
}
?>
infos_cases.php
Code PHP :
<?
// 1 = Fermé 0 = Ouvert (1=mur/0=pas de mur)
$piece[0]['haut'] = '1';
$piece[0]['bas'] = '1';
$piece[0]['droite'] = '1';
$piece[0]['gauche'] = '1';
$piece[0]['image'] = $image.'00.png';
$piece[1]['haut'] = '1';
$piece[1]['bas'] = '0';
$piece[1]['droite'] = '0';
$piece[1]['gauche'] = '1';
$piece[1]['image'] = $image.'01.png';
$piece[2]['haut'] = '1';
$piece[2]['bas'] = '0';
$piece[2]['droite'] = '1';
$piece[2]['gauche'] = '0';
$piece[2]['image'] = $image.'02.png';
$piece[3]['haut'] = '0';
$piece[3]['bas'] = '1';
$piece[3]['droite'] = '1';
$piece[3]['gauche'] = '0';
$piece[3]['image'] = $image.'03.png';
[...]
Vous avez compris le principe ;)