Пример #1
0
        /// <summary>
        /// ターンのプレイヤーからカードを受け取り時の処理
        /// </summary>
        /// <param name="playerId"></param>
        /// <param name="cards"></param>
        /// <returns></returns>
        private ResultOfPlaying ReceivedPlayingCards(int playerId, List <Card> cards)
        {
            ResultOfPlaying result = ResultOfPlaying.Accepted;

            do
            {
                if (playerId != Turn)
                {
                    // logger( LogLevel.Error, "Not player turn. Player(" + playerId + ")");
                    result = ResultOfPlaying.NotAccepted;
                    // フェーズを進めずリターン
                    return(result);
                }

                var playerHand = players[playerId].hand;

                var field = fieldStack.FirstOrDefault();
                if (DaifugoFunction.ArePlayedCardsValid(cards, playerHand, field))
                {
                    // フィールドスタックにカードを追加して
                    fieldStack.Push(cards);
                    // パスフラグをリセット
                    players.ForEach(p => p.hasPassed = false);
                    result = ResultOfPlaying.Accepted;
                }
                else
                {
                    players[playerId].hasPassed = true;

                    if (players.All(p => p.hasPassed || p.hand.Count == 0))
                    {
                        // 全員パスなら、場を流してパスフラグをリセット
                        while (fieldStack.Count > 0)
                        {
                            flowedCards.AddRange(fieldStack.Pop());
                        }
                        players.ForEach(p => p.hasPassed = false);
                    }
                    result = ResultOfPlaying.NotAccepted;
                }
            } while (false);

            phase = Phase.AfterPlaying;

            return(result);
        }
Пример #2
0
        /// <summary>
        /// カード受理結果を通知
        /// </summary>
        /// <param name="connectionId"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public Task SendResultOfPlayingAsync(string connectionId, ResultOfPlaying result)
        {
            var task = new Task(() =>
            {
                if (string.IsNullOrEmpty(connectionId))
                {
                    return;
                }
                SingleProcessMessageTransceiver client;
                if (_connectedClientTable.TryGetValue(connectionId, out client))
                {
                    client.ReceivedResultOfPlaying?.Invoke(this, new ReceivedResultOfPlayingArgs(result));
                }
            });

            task.RunSynchronously();
            return(task);
        }
Пример #3
0
        public void SendResultOfPlayingAsync_SendResult_ClientReceivedResult(IServerMessageTransceiver server, IClientMessageTransceiver client)
        {
            string connectionId = null;

            server.ReceivedJoinRequest += (_, args) =>
            {
                connectionId = args.ConnectionId;
            };

            ResultOfPlaying result = ResultOfPlaying.NotAccepted;

            client.ReceivedResultOfPlaying += (_, args) =>
            {
                result = args.Result;
            };

            client.SendJoinRequestAsync().Wait();

            server.SendResultOfPlayingAsync(connectionId, ResultOfPlaying.Accepted).Wait();

            Assert.Equal(ResultOfPlaying.Accepted, result);
        }
Пример #4
0
 public ReceivedResultOfPlayingArgs(ResultOfPlaying result)
 {
     Result = result;
 }