117 lines
3.6 KiB
C#
117 lines
3.6 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using System.Collections.Generic;
|
|
using Solitaire.Entities;
|
|
using System.Linq;
|
|
|
|
namespace Solitaire.Logic {
|
|
public class GameLogic {
|
|
public List<int> deck;
|
|
public List<IGameEntity> Entities;
|
|
private Texture2D _SpriteSheet;
|
|
|
|
public List<CardPosition> DeckHidden = new List<CardPosition>();
|
|
public List<CardPosition> DeckRevealed = new List<CardPosition>();
|
|
|
|
private void Shuffle<T>(List<T> list) {
|
|
System.Random random = new System.Random();
|
|
int n = list.Count;
|
|
while (n > 1) {
|
|
int k = random.Next(n);
|
|
n--;
|
|
T temp = list[k];
|
|
list[k] = list[n];
|
|
list[n] = temp;
|
|
}
|
|
}
|
|
|
|
private List<int> GenerateDeck() {
|
|
List<int> newDeck = new List<int>();
|
|
|
|
int i = 0;
|
|
while (i < 52)
|
|
{
|
|
newDeck.Add(i++);
|
|
}
|
|
|
|
Shuffle(newDeck);
|
|
return newDeck;
|
|
}
|
|
|
|
private Card DrawCard() {
|
|
Card card = new Card(
|
|
deck[0], true, new Vector2(0,0), _SpriteSheet
|
|
);
|
|
|
|
deck.RemoveAt(0);
|
|
|
|
return card;
|
|
}
|
|
|
|
private void PlayCards() {
|
|
Card card;
|
|
CardPosition lastCard;
|
|
for (int i = 0; i < 7; i++) {
|
|
card = null;
|
|
lastCard = new CardPosition(new Vector2(14 + (i * 40),60));
|
|
Entities.Add(lastCard);
|
|
for (int n = 0; n <= i; n ++) {
|
|
card = DrawCard();
|
|
card.parent = lastCard;
|
|
lastCard.child = card;
|
|
Entities.Add((Card)card);
|
|
lastCard = card;
|
|
}
|
|
card.UnHide();
|
|
}
|
|
CardPosition topPile;
|
|
for (int i = 0; i < 4; i++) {
|
|
topPile = new CardPosition(new Vector2(134 + (i * 40),8));
|
|
topPile.TopPile = true;
|
|
Entities.Add(topPile);
|
|
}
|
|
|
|
CardPosition deckHidden = new EmptyDeck(new Vector2(14, 8));
|
|
deckHidden.Deck = true;
|
|
deckHidden.DrawOrder = 100;
|
|
DeckHidden.Add(deckHidden);
|
|
Entities.Add(deckHidden);
|
|
CardPosition deckRevealed = new CardPosition(new Vector2(54, 8));
|
|
deckRevealed.Deck = true;
|
|
DeckRevealed.Add(deckRevealed);
|
|
|
|
while (deck.Count() > 0) {
|
|
card = DrawCard();
|
|
card.parent = DeckHidden.Last();
|
|
card.Offset = 0;
|
|
card.Deck = true;
|
|
DeckHidden.Last().child = card;
|
|
DeckHidden.Add(card);
|
|
Entities.Add(card);
|
|
}
|
|
}
|
|
|
|
public void FlipDeck() {
|
|
CardPosition card;
|
|
while (DeckRevealed.Count() > 1) {
|
|
card = DeckRevealed.Last();
|
|
card.child = null;
|
|
((Card)card).parent = DeckHidden.Last();
|
|
DeckHidden.Last().child = card;
|
|
DeckRevealed.Remove(card);
|
|
DeckHidden.Add(card);
|
|
((Card)card).Hide();
|
|
((Card)card).SetPosition(new Vector2(0,0));
|
|
card.DrawOrder = ((Card)card).parent.DrawOrder + 1;
|
|
}
|
|
}
|
|
|
|
public GameLogic(List<IGameEntity> entities, Texture2D _spriteSheet) {
|
|
deck = GenerateDeck();
|
|
Entities = entities;
|
|
|
|
_SpriteSheet = _spriteSheet;
|
|
PlayCards();
|
|
}
|
|
}
|
|
} |