public override void ViewHas(Player viewer, Owner newOwner, Card card) { var originalOwner = _viewCards[viewer, card]; if (newOwner < originalOwner) { if (!(_cardOwners[card] <= newOwner)) { throw new InvalidOperationException($"View: {viewer} Card: {card} Owner:{_cardOwners[card]} Mistake:{newOwner}"); } var newOwnerCount = _viewCount[viewer, newOwner] + 1; _viewCards[viewer, card] = newOwner; _viewCount[viewer, newOwner] = newOwnerCount; if (newOwner.MaxCount() == newOwnerCount) { foreach (var c in Card.AllCards) { var co = _viewCards[viewer, c]; if (co > newOwner) { var nco = co - newOwner; if (nco != co) { ViewHas(viewer, nco, c); } } } } } }
public VGame(byte betSeven, byte betGame, bool bet100, Player playerAlone, params Card[] deck) : this(betSeven, betGame, bet100, playerAlone) { var t1 = deck[15]; var t2 = deck[16]; for (var c = 0; c < 5; c++) { var card = deck[c]; ViewHas(Player.P1, Owner.P1, card); } for (var c = 5; c < 10; c++) { var card = deck[c]; ViewHas(Player.P2, Owner.P2, card); } for (var c = 10; c < 15; c++) { var card = deck[c]; ViewHas(Player.P3, Owner.P3, card); } for (var c = 17; c < 22; c++) { var card = deck[c]; ViewHas(Player.P1, Owner.P1, card); } for (var c = 22; c < 27; c++) { var card = deck[c]; ViewHas(Player.P2, Owner.P2, card); } for (var c = 27; c < 32; c++) { var card = deck[c]; ViewHas(Player.P3, Owner.P3, card); } // bet winner has the knowledge of Talon // TODO choose the cards instead or receiving them fixed ViewHas(playerAlone, Owner.T, t1); ViewHas(playerAlone, Owner.T, t2); }
public VGame(byte betSeven, byte betGame, bool bet100, Player playerAlone) : base(betSeven, betGame, bet100, playerAlone) { _viewCards = new Owner[3, Card.Count]; _viewCount = new int[3, Owner.Count]; for (var i = 0; i < 3; i++) { foreach (var card in Card.AllCards) { var value = card.Value; if (value == Value.V0 || value == Value.VA) { _viewCards[i, card] = Owner.P123; } else { _viewCards[i, card] = Owner.All; } } } }
public Game(byte betSeven, byte betGame, bool bet100, Player playerAlone) { _cardOwners = new Player[Card.Count]; _sequence = new Card[30]; _cardUsed = new bool[Card.Count]; _remainingColorCount = new byte[Player.Count, Color.Count]; _score = new byte[Owner.Count]; for (var c = 0; c < Card.Count; c++) { _cardOwners[c] = Player.None; } _betSeven = betSeven; _betGame = betGame; _bet100 = bet100; PlayerOnTurn = Player.P1; // always forhont PlayerAlone = playerAlone; _betSeven = betSeven; _betGame = betGame; Turn = 0; }
public void DumpView(Player viewer, StringWriter sw) { sw.Write($"V{viewer} -> "); var owners = Owner.All.EnumMembers().ToList(); var byOwner = owners.ToDictionary<Owner, Owner.OwnerName, List<Card>>(owner => owner, owner => Card.AllCards .Where(card => owner == _viewCards[viewer, card] && !_cardUsed[card]) .ToList() ); var pc = 0; foreach (var owner in owners) { var list = byOwner[owner]; if (list.Count > 0) { if (pc != 0) { sw.Write(" "); } pc++; sw.Write($"{owner}:"); for (var index = 0; index < list.Count; index++) { var card = list[index]; if (index != 0) { sw.Write($",{card}"); } else { sw.Write($"{card}"); } } } } sw.WriteLine(); }
// ReSharper restore InconsistentNaming public bool Equals(Player other) { return _player == other._player; }
public VGame(Player playerAlone) : this(2, 2, false, playerAlone) { }
public VGame(Player playerAlone, params Card[] deck) : this(2, 2, false, playerAlone, deck) { }
public void ViewReceive(Player viewer, Owner owner, params Card[] cards) { ViewReceive(viewer, owner, (IEnumerable<Card>) cards); }
public override void ViewDoesntHave(Player viewer, Owner owner, Card card) { var newOwner = _viewCards[viewer, card] - owner; ViewHas(viewer, newOwner, card); }
public Owner this[Player viewer, Card card] = > _viewCards[viewer, card];
public void ViewReceive(Player viewer, Owner owner, IEnumerable<Card> cards) { foreach (var card in cards) { if (!(_viewCards[viewer, card] >= owner)) { throw new InvalidOperationException("card already received by " + _viewCards[viewer, card]); } ViewHas(viewer, owner, card); } }
public virtual void ViewHas(Player viewer, Owner newOwner, Card card) { }
public virtual void ViewDoesntHave(Player viewer, Owner owner, Card card) { }
public Game(byte betSeven, byte betGame, bool bet100, Player playerAlone, params Card[] deck) : this(betSeven, betGame, bet100, playerAlone) { if (deck.Length != 32) { throw new ArgumentException("Card count"); } var t1 = deck[15]; var t2 = deck[16]; if (t1.HasPoints() || t2.HasPoints()) { throw new ArgumentException("Points in talon"); } var seven = new Card(Color.T, Value.V7); if (betSeven > 0 && (t1 == seven || t2 == seven)) { throw new ArgumentException("Betted seven in talon"); } for (var c = 0; c < 5; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate "+ card); } _cardOwners[card] = Player.P1; _remainingColorCount[Player.P1, card.Color]++; } for (var c = 5; c < 10; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate " + card); } _cardOwners[card] = Player.P2; _remainingColorCount[Player.P2, card.Color]++; } for (var c = 10; c < 15; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate " + card); } _cardOwners[card] = Player.P3; _remainingColorCount[Player.P3, card.Color]++; } for (var c = 17; c < 22; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate " + card); } _cardOwners[card] = Player.P1; _remainingColorCount[Player.P1, card.Color]++; } for (var c = 22; c < 27; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate " + card); } _cardOwners[card] = Player.P2; _remainingColorCount[Player.P2, card.Color]++; } for (var c = 27; c < 32; c++) { var card = deck[c]; if (_cardOwners[card] != Player.None) { throw new ArgumentException("Duplicate " + card); } _cardOwners[card] = Player.P3; _remainingColorCount[Player.P3, card.Color]++; } _cardOwners[t1] = Player.T; _cardOwners[t2] = Player.T; _remainingColorCount[Player.T, t1.Color]++; _remainingColorCount[Player.T, t2.Color]++; }
private Player PrevPlayer(Player playerOnTurn) { switch ((Player.PlayerName) playerOnTurn) { case Player.PlayerName.P1: return Player.P3; case Player.PlayerName.P2: return Player.P1; case Player.PlayerName.P3: return Player.P2; default: throw new InvalidOperationException(); } }