First bit of PHP in a while

[email protected] (Leam Hall)
Newsgroups php.general
Message-ID <CACv9p5rL9vjDCJtpKd=bc-_xbaPmKrYJF3phXwc2rjyHhiHRUQ@mail.gmail.com>
and I could use your thoughts on improving the code.The end state is a
web form that generates a D&D type character, and takes into account
class minimums, etc. This is my first effort.


####
<?php

//  USS Chargen


// Data structures
$prefs = array(
  "Cleric"    => array("Wisdom"),
  "Paladin"   => array("Charisma", "Wisdom", "Strength"),
  "Thief"     => array("Dexterity"),
  );

$mins = array(
  "Paladin"   => array("Charisma" => 17, "Wisdom" => 12, "Strength" => 12),
  "Cleric"    => array("Wisdom" => 9),
);

$character    = array(
  "Stats" => array("Strength" => 0, "Intelligence" => 0, "Wisdom" => 0,
    "Dexterity" => 0, "Constitution" => 0, "Charisma" => 0),
  "Rolls" =>  gen_stats(),
);


// Functions

function gen_stats(){
  // Generate a set of six 3d6 rolls.
  $stats  = array();
  $x      = 0;
  for( $x = 0; $x < 6; $x++) {
    $roll = random_int(1,6) + random_int(1,6) + random_int(1,6);
    array_push($stats, $roll);
  }
  sort($stats);
  return $stats;
}

function print_character($character){
  // The end product.
  foreach ( $character['Stats'] as $s => $s_value ){
    echo $s . ":  " . $s_value . "\n";;
  }
  echo "\n";
}

function arrange_for_class($character, $prefs, $class){
  // Character classes have preferred stats. The prefs array lists them in
  //  order of preference, and the array_pop takes the last (highest)
  //  value and assigns it.
  foreach ( $prefs[$class] as $p ){
    $character['Stats'][$p] = array_pop($character['Rolls']);
  }
  return $character;
}

function minimums_for_class($character, $mins, $class){
  // Certain character classes have minimum stats.
  // Since this character is of the class, they must have at least
  //  the minimum.
  foreach ( $mins[$class] as $m => $m_value ){
    $character['Stats'][$m] = max( $character['Stats'][$m], $m_value);
  }
  return $character;
}

function finish_stat_assignment($character){
  // Randomly assign the rest of the stats.
  shuffle($character['Rolls']);
  foreach ( $character['Stats'] as $s => $s_value ){
    if ( $s_value == 0 ){
      $character['Stats'][$s] = array_pop($character['Rolls']);
    }
  }
  return $character;
}


// Main

$class         = "Paladin";
$character  = arrange_for_class($character, $prefs, $class);
$character  = minimums_for_class($character, $mins, $class);
$character  = finish_stat_assignment($character);
print_character($character);

?>

####

Leam

Site Reliability Engineer        (reuel.net/resume)
Scribe: The Domici War        (domiciwar.net)
General Ne'er-do-well           (github.com/LeamHall)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.