public object onDahai(int actor, Pai pai, bool tsumogiri) { foreach (var component in components) { component.onDahai(actor, pai, tsumogiri); } if (actor == id) { tehai.Remove(pai); return(Protocol.none()); } else { List <SelectionType> alternatives = new List <SelectionType>(); if ((actor + 1) % 4 == id && Algorithm.canChi(tehai, pai)) { alternatives.Add(SelectionType.Chi); } if (Algorithm.canPon(tehai, pai)) { Console.WriteLine(string.Join(", ", tehai.Select(p => p.ToString()).ToArray())); alternatives.Add(SelectionType.Pon); } if (Algorithm.canKan(tehai, pai)) { alternatives.Add(SelectionType.Kan); } if (Algorithm.canRon(tehai, pai)) { alternatives.Add(SelectionType.Ron); } if (!alternatives.Any()) { return(Protocol.none()); } else { alternatives.Add(SelectionType.Pass); return(window.Select2(alternatives).match <object>( (pai1, pai2) => Protocol.chi(id, actor, pai, new List <Pai> { pai1, pai2 }) , (pai1, pai2) => Protocol.pon(id, actor, pai, new List <Pai> { pai1, pai2 }) , () => Protocol.kan(id, actor, pai, tehai.FindAll(p => p.RemoveRed() == pai.RemoveRed())) , () => Protocol.hora(id, actor, pai) , () => Protocol.none() )); } } }