private void btnOK_Click(object sender, EventArgs e) { player = players[dealer.GetCurrentPlayer()]; if (isChangeAbility) { str = textBox.Text; if (int.TryParse(str, out num)) { num = Int32.Parse(str); if (num <= (int)Card.Pattern.Joker) { dealer.ChangePattern((Card.Pattern)(num - 1)); isChangeAbility = false; lblQuestion.Text = "놓을 카드 번호를 입력해주세요."; board.GetFieldCard().SpecialAbility(dealer); dealer.ResetPlayCount(); GoToNextTurn(); } else { MessageBox.Show("잘못된 입력입니다."); } } else { MessageBox.Show("숫자만 입력해주세요."); } } else { str = textBox.Text; if (int.TryParse(str, out num)) { if (num <= player.GetCardAmount()) { if (dealer.CanPlayCard(player.GetCard(num))) { //카드 개수가 0개인지 확인 if (!GameIsEnd(players)) { //처음 필드에 올려지는 카드는 능력을 발휘하지 않음 if (isInitialPrint) { isInitialPrint = false; } //플레이어의 카드를 보드의 필드카드로 보냄 Card card = player.PlayCard(num); SetCardToField(card, board, dealer); //문양을 바꾸는 능력은 사용자의 입력을 미리 받아둬야함 if (IsChangeAbilityCard(card)) { lblQuestion.Text = "어떤 문양으로 변경? 1:♠ 2:♣ 3:◆ 4:♥"; isChangeAbility = true; } else { dealer.ResetPlayCount(); //카드의 스페셜 능력 발동, 딜러를 건내줌 card.SpecialAbility(dealer); } textBox.Clear(); if (GameIsEnd(players)) { GameEnd(players); } if (dealer.GetPlayCount() == 0) { GoToNextTurn(); } else { DrawBoard(); } } } else { MessageBox.Show("낼 수 없는 카드입니다."); //낼 수 없는 카드인데도 턴이 넘겨지는 버그 } } else { MessageBox.Show("잘못된 입력입니다."); } } else { MessageBox.Show("숫자만 입력해주세요."); } } }
static void Main(string[] args) { //플레이하는 인원 수와 인원 수 당 제시할 카드 수 지정 int playersNumber = 2; int playingCardCount = 7; bool isPlayCountEnd = false; //클래스들 선언 Dealer dealer = new Dealer(); Board board = new Board(); List <Player> players = new List <Player>(); //지정된 플레이어 수만큼 생성 후 리스트에 추가 for (int i = 0; i < playersNumber; i++) { Player player = new Player(i); players.Add(player); } //먼저 시작할 플레이어 결정 dealer.SetCurrentPlayer(0); //보드에서 카드 셔플 board.SetCard(); //플레이어들에게 지정한 만큼의 카드 배분 for (int i = 0; i < playersNumber; i++) { for (int j = 0; j < playingCardCount; j++) { SendCardToPlayer(board, players[i]); } } //필드에 하나 카드를 올려놓음. 이 카드를 시작으로 게임을 진행 Card firstCard = board.GetBoardCard(); SetCardToField(firstCard, board, dealer); String str = ""; int num = 0; //게임은 한 명이 파산하거나 카드 갯수가 0개가 될 때까지 계속된다. while (!GameIsEnd(players)) { //시작하면 플레이어 한 명이 한 턴을 시작한다. Player player = players[dealer.GetCurrentPlayer()]; //반복가능 횟수만큼 플레이 가능(특수카드 능력에 대비) for (int i = 0; i < dealer.GetPlayCount(); i++) { isPlayCountEnd = false; //화면을 보여줌 PrintBoard(board, dealer, players, player); //반복가능 횟수 한 번을 썼으면(카드를 내던가 받던가 다 했으면) while (!isPlayCountEnd) { //가진 카드 중 몇 번째 카드를 선택할 건지 선택지를 주고 플레이어가 선택 System.Console.WriteLine("몇 번째 카드를 선택? (카드 받기 : 0)"); str = System.Console.ReadLine(); try { num = Int32.Parse(str); } catch (FormatException e) { System.Console.WriteLine(e.Message); continue; } if (num > player.GetCardAmount()) { System.Console.WriteLine("잘못된 입력입니다."); continue; } //새 카드를 뽑는 경우 if (num == 0) { //플레이어가 카드를 새로 받음 if (dealer.GetDamage() > 0) { for (int j = 1; j <= dealer.GetDamage(); j++) { SendCardToPlayer(board, player); } dealer.ResetDamage(); } else { SendCardToPlayer(board, player); } //카드 수가 초과할 경우를 대비해 확인 if (GameIsEnd(players)) { break; } } //카드를 내는 경우 else { //카드가 낼 수 있는지 딜러가 현재 문양과 숫자를 보고 판단 //맞으면 그대로 제출하도록, 아니면 사용 가능한 카드를 제출하거나 새카드를 뽑을 때까지 재질문 if (!dealer.CanPlayCard(player.GetCard(num))) { System.Console.WriteLine("낼 수 없는 카드입니다."); continue; } //카드 개수가 0개인지 확인 if (GameIsEnd(players)) { break; } //플레이어의 카드를 보드의 필드카드로 보냄 Card card = player.PlayCard(num); SetCardToField(card, board, dealer); //문양을 바꾸는 능력은 사용자의 입력을 미리 받아둬야함 if (IsChangeAbilityCard(card)) { while (true) { System.Console.WriteLine("어떤 문양으로 변경? 1:♠ 2:♣ 3:◆ 4:♥"); str = System.Console.ReadLine(); try { num = Int32.Parse(str); } catch (FormatException e) { System.Console.WriteLine(e.Message); continue; } dealer.ChangePattern((Card.Pattern)(num - 1)); break; } } //카드의 스페셜 능력 발동, 딜러를 건내줌 card.SpecialAbility(dealer); } isPlayCountEnd = true; } } //게임이 계속 되면 다음 턴으로 넘김 dealer.SetNextTurn(); } Player winner = GetWinner(players); System.Console.WriteLine($"Winner is Player{winner.no}"); }