SHARE
TWEET

Untitled

a guest Apr 18th, 2019 92 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. unit DemoStack;
  2.  
  3. interface
  4.  
  5. uses
  6.    System.SysUtils, Generics.Collections,
  7.    DemoCard;
  8.  
  9. type
  10.    { тип стопки карт }
  11.    TCardStack = TStack<TCardModel>;
  12.  
  13.    TStackModel = class(TObject)
  14.    private
  15.       { скрытое поле, содержащее все карты, лежащие  в данной стопке }
  16.       FCards: TCardStack;
  17.    public
  18.       property Cards: TCardStack read FCards;
  19.  
  20.       { методы для работы с самой стопкой }
  21.       procedure AddCard(Card: TCardModel);
  22.       procedure AddCardsToTop(Cards: TCardStack);
  23.       function GetCardIndex(Card: TCardModel): Integer;
  24.       function GetCardsUnderAmount(Card: TCardModel): Integer;
  25.       function FetchTopCards(N: Integer): TCardStack;
  26.       function GetTopCard: TCardModel;
  27.       procedure Reverse;
  28.       procedure CloseAllCards;
  29.       function IsTopCard(Card: TCardModel): Boolean;
  30.       procedure DeleteAllCards;
  31.       procedure CloseTopCard;
  32.  
  33.       constructor Create;
  34.    end;
  35.  
  36. var
  37.    { массив со моделями всем стопок }
  38.    StackModels: array [0 .. 12] of TStackModel;
  39.  
  40. implementation
  41.  
  42. { TDemoStack }
  43.  
  44. { конструктор }
  45. constructor TStackModel.Create;
  46. begin
  47.    { вызов конструктора родительского класса - реализиуем наследование }
  48.    inherited Create;
  49.  
  50.    with Self do
  51.    begin
  52.       FCards := TCardStack.Create;
  53.    end;
  54. end;
  55.  
  56. { добавление карты в стопку }
  57. procedure TStackModel.AddCard(Card: TCardModel);
  58. begin
  59.    Self.Cards.Push(Card);
  60. end;
  61.  
  62. { добавление нескольких карт в стопку }
  63. procedure TStackModel.AddCardsToTop(Cards: TCardStack);
  64. var
  65.    i: Integer;
  66.    TempCard: TCardModel;
  67. begin
  68.    { благодаря тому, что карты перекладываются из стопки, в которой они
  69.      находятся в обратном порядке, в конечную стопку они попадают в правильном
  70.      порядке }
  71.    for i := 1 to Cards.Count do
  72.    begin
  73.       TempCard := Cards.Pop;
  74.       Self.Cards.Push(TempCard);
  75.    end;
  76. end;
  77.  
  78. { переворачивание всех карт в стопке рубашкой вверх }
  79. procedure TStackModel.CloseAllCards;
  80. var
  81.    StackEnumerator: TEnumerator<TCardModel>;
  82. begin
  83.    { чтобы "закрыть" карту нужно присвоить ей IsOpened := False }
  84.    StackEnumerator := Self.Cards.GetEnumerator;
  85.    while StackEnumerator.MoveNext do
  86.       StackEnumerator.Current.IsOpened := False;
  87. end;
  88.  
  89. { переворачиваем рубашкой вверх верхнюю карту стопки }
  90. procedure TStackModel.CloseTopCard;
  91. begin
  92.    Self.Cards.Peek.IsOpened := False;
  93. end;
  94.  
  95. { удаление всех карт из стопки }
  96. procedure TStackModel.DeleteAllCards;
  97. var
  98.    StackEnumerator: TEnumerator<TCardModel>;
  99. begin
  100.    { убираем все карты из стека }
  101.    StackEnumerator := Self.Cards.GetEnumerator;
  102.    while StackEnumerator.MoveNext do
  103.       Self.Cards.Pop;
  104. end;
  105.  
  106. { достать N карт с вершины стопки }
  107. function TStackModel.FetchTopCards(N: Integer): TCardStack;
  108. var
  109.    OutStack: TCardStack;
  110.    Temp: TCardModel;
  111.    i: Integer;
  112. begin
  113.    OutStack := TCardStack.Create;
  114.  
  115.    { кладем во новую стопку - карты в ней находся в обратном порядке -
  116.      так их удобнее класть в новую стопку на столе }
  117.    for i := 1 to N do
  118.    begin
  119.       Temp := Self.Cards.Pop;
  120.       OutStack.Push(Temp);
  121.    end;
  122.  
  123.    Result := OutStack;
  124. end;
  125.  
  126. { получение порядкового номера карты, начиная с вершины стопки }
  127. function TStackModel.GetCardIndex(Card: TCardModel): Integer;
  128. var
  129.    StackEnumerator: TEnumerator<TCardModel>;
  130.    Index: Integer;
  131. begin
  132.    Index := Self.Cards.Count;
  133.    { воспользуемся TEnumerator чтобы пройти по стеку и посчитать индекс карты }
  134.    StackEnumerator := Self.Cards.GetEnumerator;
  135.    while not TCardModel.AreEqualsCards(StackEnumerator.Current, Card) do
  136.    begin
  137.       StackEnumerator.MoveNext;
  138.       Dec(Index);
  139.    end;
  140.  
  141.    Result := Index + 1;
  142. end;
  143.  
  144. { получение количества карт, лежащих под данной }
  145. function TStackModel.GetCardsUnderAmount(Card: TCardModel): Integer;
  146. var
  147.    StackEnumerator: TEnumerator<TCardModel>;
  148.    Index: Integer;
  149. begin
  150.    Index := 0;
  151.    { воспользуемся TEnumerator чтобы пройти по стеку и посчитать сколько кард под данной }
  152.    StackEnumerator := Self.Cards.GetEnumerator;
  153.    while not TCardModel.AreEqualsCards(StackEnumerator.Current, Card) do
  154.    begin
  155.       StackEnumerator.MoveNext;
  156.       Inc(Index);
  157.    end;
  158.  
  159.    Result := Index - 1;
  160. end;
  161.  
  162. { получение верхней карты стопки }
  163. function TStackModel.GetTopCard: TCardModel;
  164. var
  165.    StackEnumerator: TEnumerator<TCardModel>;
  166.    NewCard: TCardModel;
  167. begin
  168.    Result := Self.Cards.Peek;
  169. //   Result := TCardModel.Create(NewCard.Suit, NewCard.Value, NewCard.IsOpened);
  170. end;
  171.  
  172. { является ли карта верхней картой стопки }
  173. function TStackModel.IsTopCard(Card: TCardModel): Boolean;
  174. var
  175.    TopCard: TCardModel;
  176. begin
  177.    TopCard := Self.Cards.Peek;
  178.    { используем class function чтобы узнать, является ли карта верхней в стопке }
  179.    IsTopCard := TCardModel.AreEqualsCards(TopCard, Card);
  180. end;
  181.  
  182. { перевернуть все карты стопки в обратном порядке }
  183. procedure TStackModel.Reverse;
  184. var
  185.    StackEnumerator: TEnumerator<TCardModel>;
  186.    ReversedCardStack: TCardStack;
  187.    TempCard: TCardModel;
  188. begin
  189.    ReversedCardStack := TCardStack.Create;
  190.  
  191.    { достаем по одной карте и кладем в другую стопку
  192.      в итоге получается перевернутая стопка }
  193.    while Self.FCards.Count <> 0 do
  194.    begin
  195.       TempCard := Self.FCards.Peek;
  196.       ReversedCardStack.Push(TempCard);
  197.       Self.FCards.Pop;
  198.    end;
  199.  
  200.    Self.FCards := ReversedCardStack;
  201. end;
  202.  
  203. end.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top