using MiniGames.Shared.Enums; using MiniGames.Shared.Models; using System.Collections.Generic; using System.Linq; namespace MiniGames.Client.ViewModel { public class Uno : IUno { public StapelModel AblageKartenStapel { get; set; } = new(); public StapelModel ZiehKartenStapel { get; set; } = new(); public List Spieler { get; set; } = new(); public int NaechsterSpielerId { get; set; } public bool Uhrzeigersinn { get; set; } = true; public bool IstAblageStapelFarbeGleichZuLegendeKarte(string neueKarteFarbe) { bool ergebnis; _ = AblageKartenStapel.KartenModels.LastOrDefault().Farbe.Equals(neueKarteFarbe) ? ergebnis = true : ergebnis = false; return ergebnis; } public bool IstAblageStapelZahlGleichZuLegendeKarte(string handStapelKarteBezeichnung) { bool ergebnis; _ = AblageKartenStapel.KartenModels.LastOrDefault().Name.Equals(handStapelKarteBezeichnung) ? ergebnis = true : ergebnis = false; return ergebnis; } public void ZiehEineKarte(int id) { int _id = id; int index = Spieler.FindIndex(x => x.SpielerModel.Id == _id); Spieler[index].KartenModels.Add(ZiehKartenStapel.KartenModels.FirstOrDefault()); ZiehKartenStapel.KartenModels.RemoveAt(0); } public void KarteAufStapelLegen(int id, KartenModel zuLegendeKarte) { NaechsterSpielerWahl(id, Uhrzeigersinn); int _naechstenId = NaechsterSpielerId; StapelModel _stapelModel = new(); _stapelModel.KartenModels = new(); const string _plusZweiKarte = "PlusZweiKarte"; const string _retoureKarte = "RetoureKarte"; const string _aussetzenKarte = "AussetzenKarte"; if (AblageKartenStapel.KartenModels is null) { AblageKartenStapel.KartenModels = new(); } switch (zuLegendeKarte.Name) { case _plusZweiKarte: for (int i = 0; i < 2; i++) { ZiehEineKarte(_naechstenId); } break; case _retoureKarte: _naechstenId = RetoureKarte(id); break; case _aussetzenKarte: AussetzenKarteSpielerWahl(id, Uhrzeigersinn); break; default: break; } } private int RetoureKarte(int id) { Uhrzeigersinn = !Uhrzeigersinn; NaechsterSpielerWahl(id, Uhrzeigersinn); return NaechsterSpielerId; } public void SpielerErstellen(string spielerName) { string _spielerName = spielerName; Spieler.Add( new HandKartenModel { SpielerModel = new() { Id = Spieler.Count() + 1, SpielerName = _spielerName, }, KartenModels = new() }); } public void NaechsterSpielerWahl(int aktuellerSpielerId, bool uhrZeigerSinn) { var aktuellerSpielerIndex = Spieler.FindIndex(x => x.SpielerModel.Id == aktuellerSpielerId); if (uhrZeigerSinn) { if (aktuellerSpielerIndex == Spieler.Count() - 1) { NaechsterSpielerId = 1; } else { NaechsterSpielerId = Spieler[aktuellerSpielerIndex + 1].SpielerModel.Id; } } else { if (aktuellerSpielerIndex != 0) { NaechsterSpielerId = Spieler[aktuellerSpielerIndex - 1].SpielerModel.Id; } else { NaechsterSpielerId = Spieler.LastOrDefault().SpielerModel.Id; } } } private void AussetzenKarteSpielerWahl(int aktuellerSpielerId, bool uhrZeigerSinn) { if (uhrZeigerSinn) { if (aktuellerSpielerId == Spieler.LastOrDefault().SpielerModel.Id) { NaechsterSpielerId = 2; } else if (aktuellerSpielerId == Spieler.LastOrDefault().SpielerModel.Id - 1) { NaechsterSpielerId = 1; } else { NaechsterSpielerId = aktuellerSpielerId + 2; } } else { if (aktuellerSpielerId > 2) { NaechsterSpielerId = aktuellerSpielerId - 2; } else if (aktuellerSpielerId == 2) { NaechsterSpielerId = Spieler.LastOrDefault().SpielerModel.Id; } else { NaechsterSpielerId = Spieler.LastOrDefault().SpielerModel.Id - 1; } } } #region Stapel Erstellen public static StapelModel ErstelleStandardKarten() { StapelModel stapelModel = new(); stapelModel.KartenModels = new(); for (int f = 1; f <= 4; f++) { EinzelneKarteErstellen(stapelModel, f, 0, false); for (int k = 1; k <= 9; k++) { for (int a = 0; a < 2; a++) { EinzelneKarteErstellen(stapelModel, f, k, false); } } } return stapelModel; } private static void EinzelneKarteErstellen(StapelModel stapelModel, int farbenIndex, int kartenbezeichungIndex, bool spezial) { var kartenbezeichnung = (Kartenbezeichnung)kartenbezeichungIndex; var kartenfarbe = (Farbe)farbenIndex; stapelModel.KartenModels.Add( new KartenModel { Name = kartenbezeichnung.ToString(), Farbe = kartenfarbe.ToString(), Spezial = spezial } ); } public static StapelModel ErstelleFarbigeSpezialKarten() { StapelModel stapelModel = new(); stapelModel.KartenModels = new(); for (int k = 10; k <= 12; k++) { for (int f = 1; f <= 4; f++) { for (int i = 0; i < 2; i++) { EinzelneKarteErstellen(stapelModel, f, k, true); } } } return stapelModel; } public void InitialeKartenVerteilung() { for (int i = 0; i < 7; i++) { foreach (var spieler in Spieler) { spieler.KartenModels.Add(ZiehKartenStapel.KartenModels.FirstOrDefault()); ZiehKartenStapel.KartenModels.RemoveAt(0); } } } public static StapelModel ErstelleJokerKarten() { StapelModel stapelModel = new(); stapelModel.KartenModels = new(); for (int k = 13; k <= 14; k++) { for (int a = 0; a < 4; a++) { var kartenbezeichnung = (Kartenbezeichnung)k; stapelModel.KartenModels.Add( new KartenModel { Name = kartenbezeichnung.ToString(), Farbe = Farbe.Keine.ToString(), Spezial = true } ); } } return stapelModel; } public void ZiehKartenStapelZusammenstellen() { var standardKarten = Uno.ErstelleStandardKarten(); var spezialKarten = Uno.ErstelleFarbigeSpezialKarten(); var jokerKarten = Uno.ErstelleJokerKarten(); ZiehKartenStapel.KartenModels = new(); ZiehKartenStapel.KartenModels.AddRange(standardKarten.KartenModels); ZiehKartenStapel.KartenModels.AddRange(spezialKarten.KartenModels); ZiehKartenStapel.KartenModels.AddRange(jokerKarten.KartenModels); } #endregion } }