Files
Solitaire/Logic/GameLogic.cs
NikolajDanger d9e27910cf
2021-11-02 00:05:00 +01:00

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();
}
}
}