Pig the dice game: Difference between revisions

Content added Content deleted
(Added Perl Implementation)
No edit summary
Line 13: Line 13:
;Cf:
;Cf:
* [[Pig the dice game/Player]]
* [[Pig the dice game/Player]]

=={{header|ActionScript}}==
<lang ActionScript>
package {
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.utils.ByteArray;
public class PigTheDiceGame extends Sprite {
/**
* The name of the first player.
*
* @private
*/
private var _name1:String = "Player 1";
/**
* The name of the second player.
*
* @private
*/
private var _name2:String = "Player 2";
/**
* True if the next turn is of the second player, flase if it is of the first player.
*
* @private
*/
private var _isPlayer2:Boolean = false;
/**
* The score of the first player.
*
* @private
*/
private var __p1Score:uint;
/**
* The score of the second player.
*
* @private
*/
private var __p2Score:uint;
/**
* The number of points in the current turn.
*
* @private
*/
private var __turnPts:uint;
/**
* The text field displaying the score of the first player.
*
* @private
*/
private var _p1ScoreText:TextField;
/**
* The text field displaying the score of the second player.
*
* @private
*/
private var _p2ScoreText:TextField;
/**
* The button which must be clicked for a player to roll the dice.
*
* @private
*/
private var _rollButton:Sprite;
/**
* The button which must be clicked for a player to hold.
*
* @private
*/
private var _holdButton:Sprite;
/**
* The text field displaying the name of the current player.
*/
private var _currentPlayerText:TextField;
/**
* The text field displaying the number of points in the current turn.
*
* @private
*/
private var _ptsThisTurnText:TextField;
/**
* The dice.
*
* @private
*/
private var _dice:Shape;
/**
* The number of points required to win the game.
*
* @private
*/
private var _maxScore:uint = 100;
/**
* The text field displaying additional information about the game.
*/
private var _statusText:TextField;
/**
* Creates a new PigTheDiceGame instance.
*/
public function PigTheDiceGame() {
if ( stage ) _init();
else addEventListener(Event.ADDED_TO_STAGE, _init);
}
/**
* Function which constructs the dice game when the object is added to the stage.
*/
private function _init(e:Event = null):void {
// Border and background
graphics.beginFill(0xFFFFDD);
graphics.lineStyle(2, 0xFFCC00);
graphics.drawRect(0, 0, 450, 280)
x = 20;
y = 20;
// Text fields and labels
var currentPlayerText:TextField = _createTextField(_name1 + "'s turn", 20, 0, 10, 0xDD0000, TextFieldAutoSize.CENTER, width);
var p1ScoreLabel:TextField = _createTextField(_name1 + "'s score:", 15, 20, currentPlayerText.y + currentPlayerText.height + 20, 0x000000, TextFieldAutoSize.LEFT, 120);
var p1ScoreText:TextField = _createTextField("0", 17, 135, p1ScoreLabel.y, 0xFF0000, TextFieldAutoSize.RIGHT, 50);
var p2ScoreLabel:TextField = _createTextField(_name2 + "'s score:", 15, 20, p1ScoreText.y + p1ScoreText.height + 5, 0x000000, TextFieldAutoSize.LEFT, 120);
var p2ScoreText:TextField = _createTextField("0", 17, 135, p2ScoreLabel.y, 0xFF0000, TextFieldAutoSize.RIGHT, 50);
var ptsThisTurnLabel:TextField = _createTextField("Points in this turn:", 15, 20, p2ScoreText.y + p2ScoreText.height + 15, 0x000000, TextFieldAutoSize.LEFT, 120);
var ptsThisTurnText:TextField = _createTextField("0", 17, 135, ptsThisTurnLabel.y, 0xFF0000, TextFieldAutoSize.RIGHT, 50);
// Dice
var dice:Shape = new Shape();
dice.x = 201;
dice.y = ptsThisTurnText.y + ptsThisTurnText.height + 30;
dice.visible = false;
var statusText:TextField = _createTextField("Start Play!", 15, 0, dice.y + 70, 0x0000A0, TextFieldAutoSize.CENTER, 450);
// "Roll" button
var rollButton:Sprite = new Sprite();
var rollButtonText:TextField = _createTextField("Roll dice", 17, 0, 0, 0x000000, TextFieldAutoSize.CENTER, 100);
rollButton.mouseChildren = false;
rollButton.buttonMode = true;
rollButton.graphics.lineStyle(1, 0x444444);
rollButton.graphics.beginFill(0xDDDDDD);
rollButton.graphics.drawRect(0, 0, 100, rollButtonText.height);
rollButton.x = 330;
rollButton.y = 80;
rollButton.addChild(rollButtonText);
// "Hold" button
var holdButton:Sprite = new Sprite();
var holdButtonText:TextField = _createTextField("Hold", 17, 0, 0, 0x000000, TextFieldAutoSize.CENTER, 100);
holdButton.mouseChildren = false;
holdButton.buttonMode = true;
holdButton.graphics.copyFrom(rollButton.graphics);
holdButton.x = 330;
holdButton.y = rollButton.y + rollButton.height + 10;
holdButton.addChild(holdButtonText);
rollButton.addEventListener(MouseEvent.CLICK, _rollButtonClick);
holdButton.addEventListener(MouseEvent.CLICK, _holdButtonClick);
_currentPlayerText = currentPlayerText;
_p1ScoreText = p1ScoreText;
_p2ScoreText = p2ScoreText;
_ptsThisTurnText = ptsThisTurnText;
_rollButton = rollButton;
_holdButton = holdButton;
_dice = dice;
_statusText = statusText;
addChild(currentPlayerText);
addChild(p1ScoreLabel);
addChild(p1ScoreText);
addChild(p2ScoreLabel);
addChild(p2ScoreText);
addChild(ptsThisTurnLabel);
addChild(ptsThisTurnLabel);
addChild(ptsThisTurnText);
addChild(statusText);
addChild(_dice);
addChild(rollButton);
addChild(holdButton);
}
/**
* Creates a new text field.
*
* @param text The text to be displayed in the text field.
* @param size The font size of the text.
* @param x The x-coordinate of the text field.
* @param y The y-coordinate of the text field.
* @param colour The text colour.
* @param autoSize The text alignment mode.
* @param width The width of the text field.
* @return A TextField object.
* @private
*/
private function _createTextField(text:String, size:Number, x:Number, y:Number, colour:uint, autoSize:String, width:Number):TextField {
var t:TextField = new TextField();
t.defaultTextFormat = new TextFormat(null, size, colour);
t.autoSize = autoSize;
t.x = x;
t.y = y;
t.width = width;
t.text = text;
t.height = t.textHeight + 5;
return t;
}
/**
* Rolls the dice.
*
* @return The result of the roll (1-6)
*/
private function _rollDice():uint {
// Since Math.random() returns a number between 0 and 1, multiplying it by 6 and then rounding down
// gives a number between 0 and 5, so add 1 to it.
var roll:uint = uint(Math.random() * 6) + 1;
_dice.visible = true;
var diceGraphics:Graphics = _dice.graphics;
// Draw the dice.
diceGraphics.clear();
diceGraphics.lineStyle(2, 0x555555);
diceGraphics.beginFill(0xFFFFFF);
diceGraphics.drawRect(0, 0, 48, 48);
diceGraphics.beginFill(0x000000);
diceGraphics.lineStyle(0);
switch ( roll ) {
case 1:
diceGraphics.drawCircle(24, 24, 3);
break;
case 2:
diceGraphics.drawCircle(16, 16, 3);
diceGraphics.drawCircle(32, 32, 3);
break;
case 3:
diceGraphics.drawCircle(12, 12, 3);
diceGraphics.drawCircle(24, 24, 3);
diceGraphics.drawCircle(36, 36, 3);
break;
case 4:
diceGraphics.drawCircle(16, 16, 3);
diceGraphics.drawCircle(16, 32, 3);
diceGraphics.drawCircle(32, 16, 3);
diceGraphics.drawCircle(32, 32, 3);
break;
case 5:
diceGraphics.drawCircle(12, 12, 3);
diceGraphics.drawCircle(24, 24, 3);
diceGraphics.drawCircle(36, 36, 3);
diceGraphics.drawCircle(36, 12, 3);
diceGraphics.drawCircle(12, 36, 3);
break;
case 6:
diceGraphics.drawCircle(16, 12, 3);
diceGraphics.drawCircle(16, 24, 3);
diceGraphics.drawCircle(16, 36, 3);
diceGraphics.drawCircle(32, 12, 3);
diceGraphics.drawCircle(32, 24, 3);
diceGraphics.drawCircle(32, 36, 3);
break;
}
return roll;
}
/**
* The score of the first player.
*
* @private
*/
private function get _p1Score():uint {
return __p1Score;
}
/**
* @private
*/
private function set _p1Score(value:uint):void {
__p1Score = value;
_p1ScoreText.text = String(value);
if ( value >= 100 ) {
_currentPlayerText.text = "Game over!";
_statusText.text = _name1 + " wins!";
removeChild(_rollButton);
removeChild(_holdButton);
}
}
/**
* The score of the second player.
*
* @private
*/
private function get _p2Score():uint {
return __p2Score;
}
/**
* @private
*/
private function set _p2Score(value:uint):void {
__p2Score = value;
_p2ScoreText.text = String(value);
if ( value >= 100 ) {
_currentPlayerText.text = "Game over!";
_statusText.text = _name2 + " wins!";
removeChild(_rollButton);
removeChild(_holdButton);
}
}
/**
* The number of points in the current turn.
*
* @private
*/
private function get _turnPts():uint {
return __turnPts;
}
/**
* @private
*/
private function set _turnPts(value:uint):void {
__turnPts = value;
_ptsThisTurnText.text = String(value);
if ( _isPlayer2 && __p2Score + value >= _maxScore ) {
_ptsThisTurnText.text = "0";
_p2Score += value;
}
else if ( ! _isPlayer2 && __p1Score + value >= _maxScore ) {
_ptsThisTurnText.text = "0";
_p1Score += value;
}
}
/**
* Function called when the "Roll dice" button is clicked.
*
* @private
*/
private function _rollButtonClick(e:MouseEvent):void {
var roll:uint = _rollDice();
if ( roll == 1 ) {
if ( _isPlayer2 ) {
_currentPlayerText.text = _name1 + "'s turn";
_statusText.text = _name2 + " rolls 1 and loses " + __turnPts + " points. " + _name1 + "'s turn now.";
}
else {
_currentPlayerText.text = _name2 + "'s turn";
_statusText.text = _name1 + " rolls 1 and loses " + __turnPts + " points. " + _name2 + "'s turn now.";
}
_isPlayer2 = ! _isPlayer2;
_turnPts = 0;
}
else {
_turnPts += roll;
_statusText.text = "";
}
}
/**
* Function called when the "Hold" button is clicked.
*
* @private
*/
private function _holdButtonClick(e:MouseEvent):void {
if ( _isPlayer2 ) {
_currentPlayerText.text = _name1 + "'s turn";
_statusText.text = _name2 + " holds and wins " + __turnPts + " points. " + _name1 + "'s turn now.";
_p2Score += __turnPts;
}
else {
_currentPlayerText.text = _name2 + "'s turn";
_statusText.text = _name1 + " holds and wins " + __turnPts + " points. " + _name2 + "'s turn now.";
_p1Score += __turnPts;
}
_dice.visible = false;
_turnPts = 0;
_isPlayer2 = ! _isPlayer2;
}
}
}
</lang>


=={{header|Ada}}==
=={{header|Ada}}==