![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2005
Сообщений: 78
|
Доброго всем дня кто читал книгу и сталкивался с классом ascb.play.Cards? написал пример как по книге выкачал классы с сайта во флэше указал дополнительный путь к классам ascb.play.... но выходят ошибки. Прошу кто сталкивался м примером и разобрался отпишите пожалуйста что надо исправить чтобы классы заработали, очень хочется разобраться, на сайте упоминалась проблема ранее но тема до конца не раскрыта.
Всем спасибо |
|
|||||
|
Цитата:
Ошибки-то какие?
__________________
Дело не в тебе |
|
|||||
|
Подобный класс можно написать за полчаса-час.
И полезнее и практичнее
__________________
Сам себе репортер |
|
|||||
|
Регистрация: Sep 2005
Сообщений: 78
|
Всем ответившим спасибо за пассивную помощь, удалось наконец то разобраться. А теперь для тех кто опять таки столкнется с этой проблемой:
В сборнике рецептов AS 3.0 есть пример моделирования карточной игры. Описание: package main {
import flash.display.Sprite;
import ascb.play.Cards;
import flash.utils.trace;
public class ExampCard extends Sprite {
public function ExampCard() {
var cards:Cards = new Cards();
var hands:Array = cards.deal(4, 10); // раздать карты на 4 человека по 10 карт каждому.
var i:uint;
var j:uint;
for(i=0; i < hands.length; i++) {
trace("hand " +i);
for(j = 0; j < hands[i].length; j++) {
trace(hands[i].getCardAt(j));
}
}
}
}
}
почему??!! Потому что в классе ascb.play.Cards есть ошибки.вот как выглядит класс скаченный с сайта автора: package ascb.play {
import ascb.util.NumberUtilities;
import ascb.util.ArrayUtilities;
public class Cards {
private var _cdkDeck:CardDeck;
// The Cards constructor creates a deck of cards.
public function Cards() {
_cdkDeck = new CardDeck();
}
// The deal() method needs to know the number of players in the game
// and the number of cards to deal per player. If the cardsPerPlayer
// parameter is undefined, then it deals all the cards.
public function deal(nPlayers:Number, nPerPlayer:Number = -1):Array {
_cdkDeck.reset();
_cdkDeck.shuffle();
// Create an array, players, that holds the cards dealt to each player.
var aHands:Array = new Array();
// If a cardsPerPlayer value was passed in, deal that number of cards.
// Otherwise, divide the number of cards (52) by the number of players.
var nCardsEach:Number = (nPerPlayer == -1) ? Math.floor(_cdkDeck.deck.length / nPlayers) : nPerPlayer;
// Deal out the specified number of cards to each player.
for (var i:uint = 0; i < nPlayers; i++) {
aHands.push(new CardHand(_cdkDeck));
// Deal a random card to each player. Remove that card from the
// tempCards array so that it cannot be dealt again.
for (var j:Number = 0; j < nCardsEach; j++) {
aHands[i].hand.push(_cdkDeck.deck.shift());
}
// Use Cards.orderHand() to sort a player's hand, and use setHand()
// to assign it to the card player object.
aHands[i].orderHand();
}
// Return the players array.
return aHands;
}
}
private class Card {
private var _nValue:Number;
private var _sName:String;
private var _sSuit:String;
public function get value():Number {
return _nValue;
}
public function get name():String {
return _sName;
}
public function get suit():String {
return _sSuit;
}
public function get display():String {
return _sName + " " + _sSuit;
}
public function Card(nValue:Number, sName:String, sSuit:String) {
_nValue = nValue;
_sName = sName;
_sSuit = sSuit;
}
public function toString():String {
return display;
}
}
private class CardDeck {
private var _aCards:Array;
public function get deck():Array {
return _aCards;
}
public function CardDeck() {
_aCards = new Array();
reset();
}
public function reset():Void {
for(var i:Number = 0; i < _aCards.length; i++) {
_aCards.shift();
}
// Create a local array that contains the names of the four suits.
var aSuits:Array = ["Hearts", "Diamonds", "Spades", "Clubs"];
// Specify the names of the cards for stuffing into the cards array later.
var aCardNames:Array = ["2", "3", "4", "5", "6", "7", "8", "9", "10",
"J", "Q", "K", "A"];
// Create a 52-card array. Each element is an object that contains
// properties for: the card's integer value (for sorting purposes), card name,
// suit name, and display name. The display name combines the card's name
// and suit in a single string for display to the user.
for (var i:Number = 0; i < aSuits.length; i++) {
// For each suit, add thirteen cards
for (var j:Number = 0; j < 13; j++) {
_aCards.push(new Card(j, aCardNames[j], aSuits[i]));
}
}
}
public function shuffle():Void {
var aShuffled:Array = ArrayUtilities.randomize(_aCards);
for(var i:Number = 0; i < aShuffled.length; i++) {
_aCards[i] = aShuffled[i];
}
}
public function push(oParameter:Object):Void {
_aCards.push(oParameter);
}
}
private class CardHand {
private var _cdkDeck:CardDeck;
private var _aHand:Array;
public function get hand():Array {
return _aHand;
}
public function get length():uint {
return _aHand.length;
}
// When a new card player is created by way of its constructor, pass it
// a reference to the card deck, and give it a unique player ID.
public function CardHand(cdkDeck:CardDeck) {
_aHand = new Array();
_cdkDeck = cdkDeck;
}
public function getCardAt(nIndex:uint):Card {
return _aHand[nIndex];
}
public function discard():Array {
var aCards:Array = new Array();
for(var i:Number = 0; i < arguments.length; i++) {
aCards.push(_aHand[arguments[i]]);
_cdkDeck.push(_aHand[arguments[i]]);
}
for(var i:Number = 0; i < arguments.length; i++) {
_aHand.splice(arguments[i], 1);
}
return aCards;
}
public function draw(nDraw:Number = 1):Void {
// Add the specified number of cards to the hand.
for (var i:uint = 0; i < nDraw; i++) {
_aHand.push(_cdkDeck.deck.shift());
}
orderHand();
}
public function orderHand():Void {
_aHand.sort(sorter);
}
// Used by sort() in the orderHand() method to sort the cards by suit and rank.
private function sorter(crdA:Card, crdB:Card):Number {
if (crdA.suit > crdB.suit) {
return 1;
} else if (crdA.suit < crdB.suit) {
return -1;
} else {
return (Number(crdA.value) > Number(crdB.value)) ? 1 : 0;
}
}
}
}
1) "public class" оставляем только для первого класса Cards остальные меняем как internal (Card, CardDeck, CardHand). 2) тип функции Void меняем на "void" (с маленькой буквы) 3) в функции shuffle меняем строку var aShuffled:Array = ArrayUtilities.randomize(_aCards); на строку var aShuffled:Array=ascb.util.ArrayUtilities.randomize(_aCards); 4) и последнее в принципе пример уже начинает работать только в колоде вместо ожидаемых 52-х карт 78 я за комментировал строку "_cdkDeck.reset();" в функции deal. Все работает ![]() |
|
|||||
|
Регистрация: Sep 2005
Сообщений: 78
|
И так стал выглядеть наш класс Cards:
package ascb.play{
import ascb.util.NumberUtilities;
import ascb.util.ArrayUtilities;
public class Cards {//open2
private var _cdkDeck:CardDeck;
// The Cards constructor creates a deck of cards.
public function Cards() {//open3
_cdkDeck=new CardDeck ;
}//closed3
// The deal() method needs to know the number of players in the game
// and the number of cards to deal per player. If the cardsPerPlayer
// parameter is undefined, then it deals all the cards.
public function deal(nPlayers:Number,nPerPlayer:Number=-1):Array {//open4
//_cdkDeck.reset();
_cdkDeck.shuffle();
// Create an array, players, that holds the cards dealt to each player.
var aHands:Array=new Array ;
// If a cardsPerPlayer value was passed in, deal that number of cards.
// Otherwise, divide the number of cards (52) by the number of players.
var nCardsEach:Number=nPerPlayer == -1?Math.floor(_cdkDeck.deck.length / nPlayers):nPerPlayer;
// Deal out the specified number of cards to each player.
for (var i:uint=0; i < nPlayers; i++) {//open5
aHands.push(new CardHand(_cdkDeck));
// Deal a random card to each player. Remove that card from the
// tempCards array so that it cannot be dealt again.
for (var j:Number=0; j < nCardsEach; j++) {//open6
aHands[i].hand.push(_cdkDeck.deck.shift());
}//closed6
// Use Cards.orderHand() to sort a player's hand, and use setHand()
// to assign it to the card player object.
aHands[i].orderHand();
}//closed5
// Return the players array.
return aHands;
}//closed4
}//closed2
}
internal class Card {
private var _nValue:Number;
private var _sName:String;
private var _sSuit:String;
public function get value():Number {
return _nValue;
}
public function get name():String {
return _sName;
}
public function get suit():String {
return _sSuit;
}
public function get display():String {
return _sName + " " + _sSuit;
}
public function Card(nValue:Number,sName:String,sSuit:String) {
_nValue=nValue;
_sName=sName;
_sSuit=sSuit;
}
public function toString():String {
return display;
}
}
internal class CardDeck {
private var _aCards:Array;
public function get deck():Array {
return _aCards;
}
public function CardDeck() {
_aCards=new Array ;
reset();
}
public function reset():void {
for (var i:Number=0; i < _aCards.length; i++) {
_aCards.shift();
}
// Create a local array that contains the names of the four suits.
var aSuits:Array=["Hearts","Diamonds","Spades","Clubs"];
// Specify the names of the cards for stuffing into the cards array later.
var aCardNames:Array=["2","3","4","5","6","7","8","9","10","J","Q","K","A"];
// Create a 52-card array. Each element is an object that contains
// properties for: the card's integer value (for sorting purposes), card name,
// suit name, and display name. The display name combines the card's name
// and suit in a single string for display to the user.
trace ("sfg "+aSuits.length)
for (var i:Number=0; i < aSuits.length; i++) {
// For each suit, add thirteen cards
for (var j:Number=0; j < 13; j++) {
_aCards.push(new Card(j,aCardNames[j],aSuits[i]));
}
}
}
public function shuffle():void {
var aShuffled:Array=ascb.util.ArrayUtilities.randomize(_aCards);
for (var i:Number=0; i < aShuffled.length; i++) {
_aCards[i]=aShuffled[i];
}
}
public function push(oParameter:Object):void {
_aCards.push(oParameter);
}
}
internal class CardHand {
private var _cdkDeck:CardDeck;
private var _aHand:Array;
public function get hand():Array {
return _aHand;
}
public function get length():uint {
return _aHand.length;
}
// When a new card player is created by way of its constructor, pass it
// a reference to the card deck, and give it a unique player ID.
public function CardHand(cdkDeck:CardDeck) {
_aHand=new Array ;
_cdkDeck=cdkDeck;
}
public function getCardAt(nIndex:uint):Card {
return _aHand[nIndex];
}
public function discard():Array {
var aCards:Array=new Array ;
for (var i:Number=0; i < arguments.length; i++) {
aCards.push(_aHand[arguments[i]]);
_cdkDeck.push(_aHand[arguments[i]]);
}
for (var i:Number=0; i < arguments.length; i++) {
_aHand.splice(arguments[i],1);
}
return aCards;
}
public function draw(nDraw:Number=1):void {
// Add the specified number of cards to the hand.
for (var i:uint=0; i < nDraw; i++) {
_aHand.push(_cdkDeck.deck.shift());
}
orderHand();
}
public function orderHand():void {
_aHand.sort(sorter);
}
// Used by sort() in the orderHand() method to sort the cards by suit and rank.
private function sorter(crdA:Card,crdB:Card):Number {
if (crdA.suit > crdB.suit) {
return 1;
} else if (crdA.suit < crdB.suit) {
return -1;
} else {
return Number(crdA.value) > Number(crdB.value)?1:0;
}
}
}
|
![]() |
![]() |
Часовой пояс GMT +4, время: 14:29. |
|
|
« Предыдущая тема | Следующая тема » |
|
|