Example #1
0
        static void Main(string[] args)
        {
            Console.WriteLine("게임의 룰을 선택하세요. (1:기본룰, 2:확장룰)");
            string   inputText = Console.ReadLine();
            int      input     = int.Parse(inputText);
            RuleType ruleType  = (RuleType)input;

            // 각 선수들이 시드 머니를 가진다.
            if (ruleType == RuleType.Basic)
            {
                Console.WriteLine("기본룰 모드로 경기를 시작합니다.");
                List <BasicPlayer> players = new List <BasicPlayer>();
                for (int i = 0; i < PlayerCount; i++)
                {
                    players.Add(new BasicPlayer(SeedMoney));
                }

                int round = 1;
                // 선수 중 파산(오링)하는 사람이 있을 때 까지 라운드를 진행한다.
                while (true)
                {
                    if (BasicRule.CanRunRound(players) == false)
                    {
                        break;
                    }

                    Console.WriteLine($"[Round {round++}]");

                    // 라운드를 진행한다
                    BasicRule.RunRound(players);

                    // 선수들이 가진 돈을 출력한다.
                    BasicRule.PrintMoney(players);

                    Console.WriteLine();
                }
            }
            else if (ruleType == RuleType.Advanced)
            {
                Console.WriteLine("확장룰 모드로 경기를 시작합니다.");
                List <Player> players = new List <Player>();
                players.Add(new Human(SeedMoney));
                for (int i = 0; i < PlayerCount - 1; i++)
                {
                    players.Add(new Computer(SeedMoney));
                }

                int round    = 1;
                int winnerNo = 0;

                winnerNo = AdvancedRule.DecideOrder(players);
                Console.WriteLine($" 선 플레이어는 P[{winnerNo}] 입니다.");
                // 선수 중 파산(오링)하는 사람이 있을 때 까지 라운드를 진행한다.
                while (true)
                {
                    if (AdvancedRule.CanRunRound(players) == false)
                    {
                        Console.WriteLine($"P[{AdvancedRule.FindTajja(players)}]는 타짜!");
                        Console.WriteLine($"P[{AdvancedRule.FindBankrupt(players)}]는 파산자!");
                        break;
                    }

                    Console.WriteLine($"[Round {round++}]");

                    // 라운드를 진행한다
                    winnerNo = AdvancedRule.RunRound(players, winnerNo);

                    // 선수들이 가진 돈을 출력한다.
                    AdvancedRule.PrintMoney(players);

                    Console.WriteLine();
                }
            }
        }
Example #2
0
        public static int RunRound(List <Player> players, int winnerNo)
        {
            // 각 선수가 이전 라운드에서 받은 카드를 클리어한다.
            foreach (Player player in players)
            {
                player.PrepareRound();
            }

            // 이전 라운드의 승자는 이번 라운드의 베팅 배수를 결정한다.
            // 단, 1라운드일 경우 선을 결정하여 베팅 배수를 결정한다.
            string inputText = "";
            int    input     = 0;
            Random random    = new Random();

            if (winnerNo == 0) // 사용자가 이기면
            {
                Console.WriteLine($"P[{winnerNo}] 는 이번 라운드의 배수를 선택하세요. (1: 1배, 2: 2배, 3: 4배, 4: 8배)");
                inputText = Console.ReadLine();
                input     = int.Parse(inputText);
                MultipleType multipleType = (MultipleType)input;
                Console.WriteLine($"P[{winnerNo}]는 {(int)multipleType}배를 선택하여 이번 판의 판돈이 {(int)multipleType}배 증가하였습니다.");
            }
            else
            {   // 컴퓨터가 승자일 때, 컴퓨터는 결과에 상관없이 판돈의 두 배를 올린다.
                // Console.WriteLine($"P[{winnerNo}] 는 2배만을 선택");
                input = random.Next(1, 4);
                MultipleType multipleType = (MultipleType)input;
                Console.WriteLine($"P[{winnerNo}]는 {(int)multipleType}배를 선택하여 이번 판의 판돈이 {(int)multipleType}배 증가하였습니다.");
                // input = 2;
            }

            // 선수들이 학교를 간다
            int totalBetMoney = 0;

            foreach (Player player in players)
            {
                player.Money  -= BetMoney * input;
                totalBetMoney += BetMoney * input;
            }

            // 딜러가 각 선수들에게 2장씩 카드를 돌린다
            Dealer dealer = new Dealer();

            foreach (Player player in players)
            {
                for (int i = 0; i < 2; i++)
                {
                    player.AddCard(dealer.Draw());
                }
            }


            if (winnerNo == 0)
            {
                Player p = players[winnerNo];
                p.CalculateScore();
                Console.WriteLine($"P{winnerNo} ({p[0]}, {p[1]}) => {p.Score}");


                // 사용자의 카드의 점수가 5점 이하일 경우, 300원을 추가로 내고 새로운 카드를 뽑는다.
                if (p.Score <= 5)
                {
                    Console.WriteLine("300원을 추가로 지불하고 첫번째 카드를 바꾸시겠습니까? (y/n)");

                    if (Console.ReadLine().Equals("y"))
                    {
                        p.ChangeCard(dealer.Draw());
                        p.CalculateScore();
                        p.Money -= 300;
                        Console.WriteLine($"P{winnerNo}의 바꾼 카드: ({p[0]}, {p[1]}) => {p.Score}");
                        PrintMoney(p);
                    }
                    else
                    {
                        Console.WriteLine("카드를 변경하지 않고 게임을 진행합니다.");
                    }
                }
                Console.WriteLine("콜 유형를 선택하세요. (1: 콜(기본), 2: 베팅(+100원 * 배수), 3: 다이(포기, 1/2만 돌려받음))");
                inputText = Console.ReadLine();
                input     = int.Parse(inputText);
                callType  = (CallType)input; // 숫자로 입력받은 콜 타입을 콜타입 타입으로 형변환한다.
                Console.WriteLine($"{callType}을 선택하셨습니다.");
            }
            else
            {   // 컴퓨터가 이기면 콜타입을 결정한다.
                callType = DecideCallType(players, winnerNo);
                Console.WriteLine($"P[{winnerNo}]가 {callType}을 선택하였습니다.");
            }


            if (callType == CallType.Die)
            {
                Player p = players[winnerNo];
                p.Money       += BetMoney * input / 2;
                totalBetMoney -= BetMoney * input / 2;
            }
            //if ( callType == CallType.Die)
            //{
            //    foreach (Player player in players)
            //    {
            //        if(player.Index == winnerNo)
            //        {
            //            player.Money += BetMoney * input / 2;
            //            totalBetMoney -= BetMoney * input / 2;
            //        }
            //    }

            //    foreach (Player player in players)
            //    {
            //        if (player.Index != winnerNo)
            //        {
            //            player.Money += totalBetMoney / 2;
            //        }
            //    }


            //}
            else if (callType == CallType.Betting)
            {
                foreach (Player player in players)
                {
                    player.Money  -= BetMoney * input;
                    totalBetMoney += BetMoney * input;
                }
            }

            // 각 선수들의 족보를 계산하고 출력한다.
            for (int i = 0; i < players.Count; i++)
            {
                Player p = players[i];

                p.CalculateScore();
                Console.WriteLine($"P{i} ({p[0]}, {p[1]}) => {p.Score}");
            }

            // 승자와 패자를 가린다.
            // 승자에게 모든 베팅 금액을 준다.
            if (FindWinner(players).Count >= 2) // 승자가 두명이면
            {
                int winner0 = FindWinner(players)[0];
                int winner1 = FindWinner(players)[1];

                players[winner0].Money += totalBetMoney / 2; // 전체 베팅머니를 반씩 나눠가진다.
                players[winner1].Money += totalBetMoney / 2;

                winnerNo = AdvancedRule.DecideOrder(players);
                return(winnerNo);
            }
            else
            {
                winnerNo = FindWinner(players)[0];
                players[winnerNo].Money += totalBetMoney;
                return(winnerNo);
            }
        }
Example #3
0
        public static int RunRound(List <Player> players, int winnerNo)
        {
            // 각 선수가 이전 라운드에서 받은 카드를 클리어한다.
            foreach (Player player in players)
            {
                player.PrepareRound();
            }

            // 이전 라운드의 승자는 이번 라운드의 베팅 배수를 결정한다.
            // 단, 1라운드일 경우 선을 결정하여 베팅 배수를 결정한다.
            string inputText = "";
            int    input     = 0;

            if (winnerNo == 0)
            {
                Console.WriteLine($"P[{winnerNo}] 는 이번 라운드의 배수를 선택하세요. (1: 1배, 2: 2배, 4: 4배, 8: 8배)");
                inputText = Console.ReadLine();
                input     = int.Parse(inputText);
            }
            else
            {
                Console.WriteLine($"P[{winnerNo}] 는 2배만을 선택");
                input = 2;
            }

            // 선수들이 학교를 간다
            int totalBetMoney = 0;

            foreach (Player player in players)
            {
                player.Money  -= BetMoney * input;
                totalBetMoney += BetMoney * input;
            }

            // 딜러가 각 선수들에게 2장씩 카드를 돌린다
            Dealer dealer = new Dealer();

            foreach (Player player in players)
            {
                for (int i = 0; i < 2; i++)
                {
                    player.AddCard(dealer.Draw());
                }
            }


            if (winnerNo == 0)
            {
                Player p = players[winnerNo];
                p.CalculateScore();
                Console.WriteLine($"P{winnerNo} ({p[0]}, {p[1]}) => {p.Score}");
                Console.WriteLine("콜 유형를 선택하세요. (1: 콜(기본), 2: 베팅(+100원 * 배수), 3: 다이(포기, 1/2만 돌려받음))");
                inputText = Console.ReadLine();
                input     = int.Parse(inputText);
                callType  = (CallType)input;
            }
            else
            {
                callType = DecideCallType(players, winnerNo);
                Console.WriteLine($"P[{winnerNo}]는 {callType}을 선택");
            }


            if (callType == CallType.Die)
            {
                Player p = players[winnerNo];
                p.Money       += BetMoney * input / 2;
                totalBetMoney -= BetMoney * input / 2;
            }
            //if ( callType == CallType.Die)
            //{
            //    foreach (Player player in players)
            //    {
            //        if(player.Index == winnerNo)
            //        {
            //            player.Money += BetMoney * input / 2;
            //            totalBetMoney -= BetMoney * input / 2;
            //        }
            //    }

            //    foreach (Player player in players)
            //    {
            //        if (player.Index != winnerNo)
            //        {
            //            player.Money += totalBetMoney / 2;
            //        }
            //    }


            //}
            else if (callType == CallType.Betting)
            {
                foreach (Player player in players)
                {
                    player.Money  -= BetMoney * input;
                    totalBetMoney += BetMoney * input;
                }
            }

            // 각 선수들의 족보를 계산하고 출력한다.
            for (int i = 0; i < players.Count; i++)
            {
                Player p = players[i];

                p.CalculateScore();
                Console.WriteLine($"P{i} ({p[0]}, {p[1]}) => {p.Score}");
            }

            // 승자와 패자를 가린다.
            // 승자에게 모든 베팅 금액을 준다.
            if (FindWinner(players).Count >= 2)
            {
                players[FindWinner(players)[0]].Money += totalBetMoney / 2;
                players[FindWinner(players)[1]].Money += totalBetMoney / 2;

                winnerNo = AdvancedRule.DecideOrder(players);
                return(winnerNo);
            }
            else
            {
                winnerNo = FindWinner(players)[0];
                players[winnerNo].Money += totalBetMoney;
                return(winnerNo);
            }
        }