Recipe 4.9.
Simulating Dice
Problem
You want to mimic rolling dice.
Solution
Use the NumberUtilities.random( ) method
to generate random numbers in the desired range.
Discussion
You can use the random( ) method from
Recipe
4.7 to generate random integer values to simulate rolling a die
or dice in your Flash movies. Mimicking the rolling of dice is an
important feature in many games you might create using
ActionScript, and the random( ) method makes your job
easy.
|
NumberUtilities.random(1, 12) does not
correctly simulate a pair of six-sided dice because the results
must be between 2 and 12, not 1 and 12. Does
NumberUtilities.random(2, 12) give the correct result? No,
it does not. NumberUtilities.random(2, 12) results in a
smooth distribution of numbers from 2 to 12, whereas in games
played with two dice, 7 is much more common than 2 or 12.
Therefore, you must simulate each die separately and then add the
result together. Furthermore, in many games, such as backgammon,
game play depends on the individual value of each die, not simply
the total of both dice, so you'll want to keep them separate.
|
|
It is not uncommon to want to generate a random
number and then store it for later use. If you want to reuse an
existing random number, be sure to save the result rather than
generating a new random number. Note the difference in these two
scenarios. In the first scenario, dice always is the sum
of die1 plus die2:
var die1:uint = NumberUtilities.random(1, 6);
var die2:uint = NumberUtilities.random(1, 6);
var dice:uint = die1 + die2;
In the following scenario, there is no relation
between the value of dice and the earlier random values
stored in die1 and die2. In other words, even if
die1 and die2 add up to 7, dice stores a
completely different value between 2 and 12:
var die1:uint = NumberUtilities.random(1, 6);
var die2:uint = NumberUtilities.random(1, 6);
var dice:uint = NumberUtilities.random(1, 6) + NumberUtilities.random(1, 6);
You can call NumberUtilities.random( )
with any range to simulate a multisided die. Here it has a range
from 1 to 15 and generates a random number as though the user is
rolling a 15-sided die, as might be found in a role-playing
game:
var die1:uint = NumberUtilities.random(1, 15);
The following code uses the
NumberUtilities.random( ) method in conjunction with
programmatic drawing to create a visual representation of a single
die:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
import ascb.util.NumberUtilities;
public class NumbersAndMath extends Sprite {
var _die:Sprite;
var _value:uint;
public function NumbersAndMath( ) {
_die = new Sprite( );
addChild(_die);
_die.addEventListener(MouseEvent.CLICK, rollDie);
rollDie(null);
}
private function rollDie(event:MouseEvent):void {
_value = NumberUtilities.random(1, 6);
_die.graphics.clear( );
_die.graphics.lineStyle( );
_die.graphics.beginFill(0xFFFFFF);
_die.graphics.drawRect(0, 0, 50, 50);
_die.graphics.endFill( );
_die.graphics.beginFill(0x000000);
if(_value == 1 || _value == 3 || _value == 5) {
_die.graphics.drawCircle(25, 25, 4);
}
if(_value == 2 || _value == 3 || _value == 4 ||
_value == 5 || _value == 6)
{
_die.graphics.drawCircle(11, 11, 4);
_die.graphics.drawCircle(39, 39, 4);
}
if(_value == 4 || _value == 5 || _value == 6) {
_die.graphics.drawCircle(11, 39, 4);
_die.graphics.drawCircle(39, 11, 4);
}
if(_value == 6) {
_die.graphics.drawCircle(11, 25, 4);
_die.graphics.drawCircle(39, 25, 4);
}
}
}
}
Running the preceding code results in a single,
clickable die drawn on the stage. Each time the user clicks the
die, the value changes.
See Also
Recipe
4.7
|