2012-01-08 1 views
1

텍사스 홀덤 포커를 할 수있는 프레임 프로그램을 작성하려고합니다. CurrentPlayer는 카드받는 방법C# 구조체 변수의 값을 보유 할 수 없습니다.

public bool hasPair(Player CurrentPlayer) 
     { 
      bool flag; 
      Card[] SevenCards = new Card[7]; 

      SevenCards[0].Color = CurrentPlayer.Card1.Color; 
      SevenCards[0].Number = CurrentPlayer.Card1.Number; 
      SevenCards[1].Color = CurrentPlayer.Color2; 
      SevenCards[1].Number = CurrentPlayer.Number2; 

      SevenCards[2] = Ground.Card1; 
      SevenCards[3] = Ground.Card2; 
      SevenCards[4] = Ground.Card3; 
      SevenCards[5] = Ground.Card4; 
      SevenCards[6] = Ground.Card5; 

      flag = isThere_Pair(SevenCards); 

      return flag; 
     } 

그리고 여기에 있습니다 : : CurrentPlayer가 쌍을 가지고 있다면 내가 결정 기능 hasPair에 문제가 있어요

public void Deal_Cards(Player Player) 
    { 
     int Color1, No1, Color2, No2; 

     while (true) 
     { 


     dealhelper1: 

      Color1 = (RandomColor.Next() % 4); 
      No1 = ((RandomNo.Next() % 13)); 


      if (CardDeck[Color1, No1].isChosen == true) 
      { 
       goto dealhelper1; 
      } 

      if (CardDeck[Color1, No1].isChosen == false) 
      { 
       Player.Card1.Color = Color1; 

       Player.Card1.Number = No1+1; 
       Player.Card1.imagePath = CardDeck[Color1, No1].imagePath; 

       Player.Color1 = CardDeck[Color1, No1].Color; 
       Player.Number1 = CardDeck[Color1, No1].Number;     

       CardDeck[Color1, No1].isChosen = true; 
       break; 
      } 
     } 

     while (true) 
     { 
      dealhelper2: 

      Color2 = (RandomColor.Next() % 4); 
      No2 = ((RandomNo.Next() % 13)); 

      if (CardDeck[Color2, No2].isChosen == true) 
      { 
       goto dealhelper2; 
      } 

      if (CardDeck[Color2, No2].isChosen == false) 
      { 
       CardDeck[Color2, No2].isChosen = true; 


       Player.Card2.Color = Color2; 
       Player.Card2.Number = (No2)+1; 

       Player.Color2 = CardDeck[Color2, No2].Color; 
       Player.Number2 = CardDeck[Color2, No2].Number; 
       break; 
      } 
     } 

     display_Player_Cards(Player); 
    } 

하지만를 hasPair 기능에, CurrentPlayer의 카드 ' 숫자와 색상은 0입니다. 다른 방법으로 시도했지만 쿼리에서 묻는다면 플레이어 카드의 숫자 값을 가져올 수 없습니다. Deal_Cards 함수로 초기화되었습니다. 그래도 지상 카드는 아무런 문제가 없습니다.

흥미롭게도 display_Player_Cards(Player) 기능이 올바르게 작동하므로 값을 성공적으로 가져 와서 카드를 표시합니다.

public Player P1 = new Player(); 
    public Player AI = new Player(); 

왜 그들이 값을 보유 할 수 없습니다

내가 좋아하는 타입 Player (구조체)의 공용 변수를 사용할 수 있습니까? 이 문제를 어떻게 해결할 수 있습니까? 도움 주셔서 감사합니다.

+0

디버깅을 시도하고 'Deal_Cards' 메소드가 실행을 완료하는지 확인하십시오. 그 'while (true)'루프는 정말로 위험합니다. 실행을 끝내지 않으면 필드가 모두 0 인 이유를 발견했을 것입니다. – aevitas

답변

6

여기에서 실행중인 문제는 .NET의 값에 의해 구조체가 전달된다는 것입니다. 따라서 Deal_Cards 메서드는 Player 인스턴스의 복사본을 받고 해당 복사본에 카드를 할당합니다. Deal_Cards으로 전달 된 원래 값은 수정되지 않았습니다.

Playerclass으로 수정하거나 참조로 전달해야합니다. Playerclass으로 만드는 것을 권합니다. 변경할 수있는 구조체를 갖는 것은 고통에 대한 경로 일 뿐이며 이와 같은 버그를 추적하기 어렵습니다.

+0

Jared, Player를 클래스로 정의하여 문제를 해결했습니다. – void

0

C에서 구조체를 값으로 전달하면 효과적으로 구조체의 복사본이 호출 된 루틴에 제공됩니다. 에 관계없이 루틴이 구조체의 사본과 함께 무엇을하는지, 발신자의 구조체의 필드는 영향을받지 않습니다. 호출 된 함수가 구조체를 수정할 수있게하려면 "ref"매개 변수로 지정해야합니다.

구조체를 ref 매개 변수로 전달하면 클래스 개체 참조를 전달하는 것보다 더 엄격한 의미를가집니다. 만이 참조하여 원하는 무엇이든 할 수 없습니다 클래스 객체에 대한 참조를 부여 할 것 같았지만, 그것은 심지어 원래 있던 기능을 한 후,을 원하는 때마다이 을 원하는 무엇이든 할 수있는 다른 코드를 사용할 수 있도록 할 수 있습니다 참조가 리턴되면 주어진다. 대조적으로 구조체를 ref 매개 변수로 제공하는 루틴은 반환 할 때까지 구조체에서 원하는 모든 작업을 수행 할 수 있지만 구조체의 필드가 직접 반환되거나 간접적으로 수정되는 기능은 없습니다.

'플레이어'데이터 유형의 내용을 표시하지 않으므로 구조체인지 클래스인지 여부가 명확하지 않습니다. 단순히 두 개의 카드를 보유하고 있기 때문에 플레이어의 손은, 그러나, 구조체에 대한 논리적 인 후보가 될 것 같다. 그것을 가변적 인 클래스로 만드는 것은 나에게 정말로 칙칙한 것처럼 보일 것입니다. 하나는 플레이어의 손이 불변 구조체하게하고 playerHand 구조체를 반환하는 GenerateHand 기능으로 Deal_Cards 방법을 바꾸거나 다른 사람의 Ref 매개 변수로 playerHandDealCards A를 전달할 수 중 하나. 하나는 '불변'경로를 간다면, 하나는 클래스를 사용할 수 있지만,이 컨텍스트에서 불변의 구조체 대신에 불변의 클래스를 사용하면 거의 도움이되지 않습니다.

관련 문제