static void Main(string[] args) { //딜러 Dealer dealer = new Dealer(); //보드 Board board = new Board(); //스코럴 Scorer scorer = new Scorer(); //플레이어 //List는 동적배열 List <Player> players = new List <Player>(); players.Add(new Player(0)); players.Add(new Player(1)); // 둘 중 한 명이 올인 날 때까지.. while (CanGoRound(players)) { // 라운드 진행 // 딜러가 카드를 섞는다. dealer.Shuffle(); // 판돈 내기 for (int i = 0; i < players.Count; i++) { players[i].Money -= 100; board.Money += 100; } // 카드 나눠주기(각 플레이어에게 2장씩 준다) for (int i = 0; i < players.Count; i++) { players[i].cards.Clear(); for (int j = 0; j < 2; j++) { Card card = dealer.GetCard(); players[i].TakeCard(card); } } // 승자를 찾는다. Player winner = scorer.GetWinner(players[0], players[1]); // 무승부면 루프의 처음으로 다시 돌아가서 실행. if (winner == null) { continue; } // 판돈을 승자에게 준다. winner.Money += board.Money; // 보드는 금액을 0으로 초기화. board.Money = 0; // 플레리어가 가진 카드와 소지금, 승자를 출력한다. PrintRoundResult(players, winner); } // end of while() } //end of main()
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); } }
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); } }
public const int BettingMoney = 100; // 배팅금 static void Main(string[] args) { #region 섯다 족보 IEnumerable <Genealogy> Gen = new Genealogy[] { new Genealogy { Name = "삼팔광땡", Score = 100 }, new Genealogy { Name = "광땡", Score = 90 }, new Genealogy { Name = "멍텅구리 구사", Score = 80 }, new Genealogy { Name = "일땡", Score = 61 }, new Genealogy { Name = "이땡", Score = 62 }, new Genealogy { Name = "삼땡", Score = 63 }, new Genealogy { Name = "사땡", Score = 64 }, new Genealogy { Name = "오땡", Score = 65 }, new Genealogy { Name = "육땡", Score = 66 }, new Genealogy { Name = "칠땡", Score = 67 }, new Genealogy { Name = "팔땡", Score = 68 }, new Genealogy { Name = "구땡", Score = 69 }, new Genealogy { Name = "장땡", Score = 70 }, new Genealogy { Name = "구사", Score = 50 }, new Genealogy { Name = "알리", Score = 15 }, new Genealogy { Name = "독사", Score = 14 }, new Genealogy { Name = "구삥", Score = 13 }, new Genealogy { Name = "장삥", Score = 12 }, new Genealogy { Name = "장사", Score = 11 }, new Genealogy { Name = "세륙", Score = 10 }, // 십끗 => 4, 6 만 new Genealogy { Name = "갑오", Score = 9 }, // 구끗 new Genealogy { Name = "팔끗", Score = 8 }, new Genealogy { Name = "칠끗", Score = 7 }, new Genealogy { Name = "육끗", Score = 6 }, new Genealogy { Name = "오끗", Score = 5 }, new Genealogy { Name = "사끗", Score = 4 }, new Genealogy { Name = "삼끗", Score = 3 }, new Genealogy { Name = "이끗", Score = 2 }, new Genealogy { Name = "일끗", Score = 1 }, new Genealogy { Name = "망통", Score = 0 }, new Genealogy { Name = "암행어사", Score = 1 }, new Genealogy { Name = "땡잡이", Score = 0 } // 3, 7 만 }; #endregion var spgt = from g in Gen where g.Score == 100 select g; // 삼팔광땡 var gt = from g in Gen where g.Score == 90 select g; // 광땡 var mtgr = from g in Gen where g.Score == 80 select g; // 멍텅구리 구사 foreach (Genealogy gen in spgt) { Console.WriteLine(gen.Name); } foreach (Genealogy gen in gt) { Console.WriteLine(gen.Name); } Console.WriteLine("┌────────────────┐"); Console.WriteLine("│\t 룰을 선택하세요. │"); Console.WriteLine("│\t 1. Basic\t │"); Console.WriteLine("│\t 2. Simple\t │"); Console.WriteLine("└────────────────┘"); Console.Write(" ☞ "); int input = int.Parse(Console.ReadLine()); RuleType ruleType = (RuleType)input; Console.WriteLine(); #region Memo1 // unit test => 테스트 코드들을 모아두는?? //Player p = new Player(); //p.GoToShcool(); // 배팅하기. 아래 코드보다 이게 나음 //p.Money -= 100; // 됨 //p.Cards = new List<Card>(); // 카드 생성? 이 안됨 //p.Cards.Add(new Card()); // 카드 추가는 됨 #endregion #region 레이어 2명 List <Player> players = new List <Player>(); for (int i = 0; i < 2; i++) { if (ruleType == RuleType.Basic) { players.Add(new BasicPlayer()); } else { players.Add(new SimplePlayer()); } } // 각각의 타입에 따른 객체를 오버라이딩하여 생성 #endregion #region Memo - var //// C#에서의 var은 타입을 유추할 수 있을 때 사용함. //int i = 1; //var i2 = 1; //string s = "aa"; //var s2 = "bb"; //Dictionary<int, List<List<string>>> list = new Dictionary<int, List<List<string>>>(); //var list2 = new Dictionary<int, List<List<string>>>(); #endregion #region 레이어들의 종잣돈 지급 int ChanceNumber = 1; foreach (var player in players) { player.Money = SeedMoney; // 플레이어들에게 500원씩 지급 player.OneChance = ChanceNumber; } #endregion int round = 1; // 초기 라운드 int rematchNumber = 1; // 배팅금 배율 #region 게임 시작 while (true) { #region 올인시 게임 종료 if (IsAnyoneAllIn(players)) //한명이 올인하면 게임 종료 { Console.WriteLine("┌────────────────┐"); Console.WriteLine("│\t ~ 이제 그만 ~\t │"); Console.WriteLine("└────────────────┘"); Console.WriteLine(); break; } #endregion Console.WriteLine(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Console.WriteLine($"\t [Round {round++}]"); // 딜러는 매 라운드마다 하나씩 만들어짐 Dealer dealer = new Dealer(); #region 학교 출석 (배팅) foreach (var player in players) { player.Money -= (BettingMoney * rematchNumber); if (player.Money < 0) { Console.WriteLine("┌────────────────┐"); Console.WriteLine("│ ♨ 배팅금액 부족 경기불가 ♨ │"); Console.WriteLine("└────────────────┘"); return; } else { dealer.PutMoney(BettingMoney * rematchNumber); } } #endregion #region 카드배분 foreach (var player in players) { player.Cards.Clear(); for (int i = 0; i < 2; i++) { player.Cards.Add(dealer.DrawCard()); } Console.WriteLine(player.GetCardText()); } #endregion #region 경기 (일반적 / 재경기) JudgeRematch(Rematch(players)); // 멍텅구리 구사, 구사, 무승부 if (Rematch(players) == 80 || Rematch(players) == 50 || Rematch(players) == 40) { int money = dealer.GetMoney() / 2; for (int i = 0; i < 2; i++) { players[i].Money += money; } rematchNumber = rematchNumber * 2; // 재경기 시 배팅금 배율 2배 continue; } else //일반적 상황 { // 승자 찾기 Player winner = FindWinner(players); // 승자에게 상금 주가 winner.Money += dealer.GetMoney(); rematchNumber = 1; // 배팅금 배율 초기화 // 각 플레이어들의 돈 출력 for (int i = 0; i < 2; i++) { Console.Write($" Player {i + 1}'s Money : "); Console.WriteLine("₩ " + players[i].Money); } Console.WriteLine(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Console.WriteLine(); } #endregion PayBackOrGoToThePolice(players); // 기사회생, 경찰서 } #endregion }
static void Main(string[] args) { Console.WriteLine("룰 타입을 선택하세요. (1:Basic, 2:Develop)"); int input = int.Parse(Console.ReadLine()); RuleType ruleType = (RuleType)input; Printline(); List <Player> players = new List <Player>(); if (ruleType == RuleType.Basic) { players.Add(new RealPlayer()); players.Add(new ComputerPlayer()); } else { for (int i = 0; i < 2; i++) { players.Add(new RealPlayer()); } } foreach (var player in players) { player.Money = SeedMoney; } int round = 1; while (true) { Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); // 한명이 오링이면 게임 종료 if (IsAnyoneOring(players)) { break; } Console.WriteLine($"[Round {round}]을 진행합니다."); Printline(); round++; Dealer dealer = new Dealer(); // 학교 출석 foreach (var player in players) { player.Money -= BettingMoney; dealer.PutMoney(BettingMoney); } // 카드 돌리기 foreach (var player in players) { player.Cards.Clear(); dealer.Cards.Clear(); for (int i = 0; i < 2; i++) { player.Cards.Add(dealer.DrawCard()); } Console.WriteLine(player.GetCardText()); } Printline(); Console.WriteLine("게임을 계속하시겠습니까? (1. 콜 2. 다이)"); Console.WriteLine("[콜] 하면 50원 추가 배팅 후 딜러 패 공개,"); Console.WriteLine("[다이]하면 모든 패 공개 후 패배로 처리."); int sel = int.Parse(Console.ReadLine()); bool surren = Surren(sel); //딜러 패 뽑기 dealer.Cards.Add(dealer.DrawCard()); //딜러가 뽑은 패 각자 덱으로 삽입 foreach (var player in players) { player.Cards.Add(dealer.DealerCard()); } Printline(); //딜러가 뽑은 패 공개 Console.WriteLine(dealer.GetCardTextDealer()); Printline(); Console.WriteLine(players[0].GetCardText()); PrintMyGokbo(players); Printline(); if (!surren) { foreach (var player in players) { player.Money -= CallBettingMoney; dealer.PutMoney(CallBettingMoney); } Console.WriteLine("게임을 계속하시겠습니까? (1. 콜 2. 다이)"); Console.WriteLine("[콜]하면 모든 패 공개,"); Console.WriteLine("[다이]하면 패배로 처리."); int finalsel = int.Parse(Console.ReadLine()); surren = Surren(finalsel); Printline(); //무승부 찾기 if (Regame(players)) { continue; } } // 승자 찾기 Player winner = FindWinner(players, surren); // 승자에게 상금 주기 winner.Money += dealer.GetMoney(); // 각 플레이어의 돈 출력 Printline(); foreach (var player in players) { Console.Write(player.Money + "\t"); } Console.WriteLine(); Console.WriteLine("다음 라운드 진행을 위해 아무 숫자를 입력해 주세요."); int nextRound = int.Parse(Console.ReadLine()); Printline(); } }