2009-06-17 6 views
0

GUI로 간단한 추측 - 숫자 게임을 만들고 있습니다. 사용자가 텍스트 상자에 숫자를 입력하고 "확인"을 누르기를 기다리는 루프를 기다려야합니다. 루프 내부의 이벤트를 어떻게 대기합니까?C# WinForms : 무한 루프 내에서 버튼 누르기를 기다리는 중

참고 : 메시지 상자를 원하지 않습니다. 이것은 메인 윈도우에서 이루어 지므로 입력을 기다릴 필요가 있습니다.

편집 : 자신을 더 잘 설명해야합니다. 나는 GUI 안에 루프가 있다는 것을 알고있다. 내가 원하는 건 또 다른 루프를 메서드 안에 넣는 것이다. 어쩌면 이것을 할 수있는 더 좋은 방법이있을 것입니다. 버튼의 이벤트 핸들러 내부에 코드를 작성할 수 있습니다. 이제 생각해 보겠습니다. 글로벌 변수가 필요합니다. Whataver, 나는 그것에 대해 생각할 것이다. 그러나 나는 나의 질문이 지금 더 분명하기를 바란다.

EDIT 2 : 죄송합니다. 내 질문에 명확하지 않았으며 편집이 많은 도움을주지 못했습니다. 우선, 코드가 너무 커서 여기에 게시 할 수 없습니다. 아마도 GUI의 스크린 샷을 게시해야 할 것이므로 많이 사용하지 않을 것입니다. 기본적으로 두 개의 필드, "최대 개수"및 "허용 된 추측 수"가 있습니다. 사용자는이 두 가지를 입력하고 "재생"을 클릭합니다. 텍스트 상자와 "추측"버튼이있는 새 패널을 사용할 수 있습니다. 사용자는 추측을 입력하고 프로그램이 올바른지 확인합니다.

두 번째 무한 루프의 목적은 전역 변수를 피하는 것입니다. 사용자가 "재생"을 클릭 할 때마다 게임은 올바른 추측으로 새로운 난수를 생성해야합니다. 모든 것이 메서드 내부에서 처리되면 아무런 문제가 없습니다. 그러나 "추측"버튼의 이벤트 핸들러가 여러 번 호출되면 숫자는 Form의 인스턴스 변수로 저장되어야합니다. 물론, 그다지 큰 문제는 아니지만, 그 숫자는 폼이 아닌 현재 게임을 지시하는 메소드의 속성이어야한다고 생각합니다.

또한 메서드 외부의 추측 수를 추적해야합니다. 다시 말하지만, 큰 문제는 아닙니다. 할 수만 있으면 전역을 피하고 싶습니다.

다시 한 번 내 질문에 지나치게 분명하지 않은 점에 대해 사과드립니다. 나는 일종의 피곤하고, 나는 너무 많이 쓰는 것 같은 기분이 들지 않았다. 아직도 명확하지 않으면 걱정하지 마십시오. 나는 뭔가 생각할 것이다.

+1

아마도 무한 루프의 목적이 무엇인지 설명하고 아마도 코드를 게시해야합니다. 그러면 우리가 당신이 초보자라고 가정하는 것을 멈출 수 있습니다. – ichiban

+1

항상 모든 것을 추적하는 Game 클래스를 만들 수 있습니다. –

답변

3

제이슨 다운의 제안은 현명합니다. 새로운 GuessingGame 클래스를 만들고 프로젝트에 추가하십시오. "전역 변수"에 대해 걱정하고 있다는 것을 알고 있습니다 (모든 사람들이 절대적으로해야만하지 않는 한 은 결코으로 사용하지 않습니다).하지만 잠시 동안 설계 사양에 대해 생각해보십시오.

그러나 "추측"단추의 이벤트 처리기를 여러 번 호출하면 번호가 양식의 인스턴스 변수로 저장되어야합니다. 물론, 그다지 큰 문제는 아니지만, 그 숫자는 폼이 아닌 현재 게임을 지시하는 메소드의 속성이어야한다고 생각합니다.

대신 GuessingGame 클래스의 인스턴스를 양식에 저장하십시오. 이것은 전역 변수가 아닙니다! 자신이 말했듯이, 게임의 요점은 추측을 추적하고 "재생"을 클릭 할 때마다 추측 할 수있는 새로운 숫자를 생성하는 것입니다. 게임의 인스턴스를 양식에 저장 한 다음 다른 양식 (예 : 도움말 또는 정보 상자)을 열면 게임의 인스턴스를 사용할 수 없습니다 (따라서 전역이 아님).

public class GuessingGame 
{ 
    private static Random _RNG = new Random(); 
    private bool _GameRunning; 
    private bool _GameWon; 
    private int _Number; 
    private int _GuessesRemaining; 

    public int GuessesRemaining 
    { 
     get { return _GuessesRemaining; } 
    } 

    public bool GameEnded 
    { 
     get { return !_GameRunning; } 
    } 

    public bool GameWon 
    { 
     get { return _GameWon; } 
    } 

    public GuessingGame() 
    { 
     _GameRunning = false; 
     _GameWon = false; 
    } 

    public void StartNewGame(int numberOfGuesses, int max) 
    { 
     if (max <= 0) 
      throw new ArgumentOutOfRangeException("max", "Must be > 0"); 

     if (max == int.MaxValue) 
      _Number = _RNG.Next(); 
     else 
      _Number = _RNG.Next(0, max + 1); 

     _GuessesRemaining = numberOfGuesses; 
     _GameRunning = true; 
    } 

    public bool MakeGuess(int guess) 
    { 
     if (_GameRunning) 
     { 
      _GuessesRemaining--; 
      if (_GuessesRemaining <= 0) 
      { 
       _GameRunning = false; 
       _GameWon = false; 
       return false; 
      } 

      if (guess == _Number) 
      { 
       _GameWon = true; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      throw new Exception("The game is not running. Call StartNewGame() before making a guess."); 
     } 
    } 
} 

이 방법은, 게임에 관련된 모든 데이터가 클래스 내에서 캡슐화 :

GuessingGame 목적은 같을 것입니다.

GuessingGame game = new GuessingGame(); 

private void btnPlay_Click(object sender, EventArgs e) 
{ 
    int numberOfGuesses = Convert.ToInt32(txtNumberOfGuesses.Text); 
    int max = Convert.ToInt32(txtMax.Text); 
    game.StartNewGame(numberOfGuesses, max); 
} 

private void btnGuess_Click(object sender, EventArgs e) 
{ 
    int guess = Convert.ToInt32(txtGuess.Text); 
    bool correct = game.MakeGuess(guess); 

    if (correct) 
     lblWin.Visible = true; 

    if (game.GameEnded) 
    { 
     // disable guess button, show loss label 
    } 
} 
5

폼이 닫힐 때까지 C#이 자동으로 이벤트를 기다리는 루프를 반복합니다. 버튼 클릭 이벤트에 응답하면됩니다.

1

실제로 Windows 프로그래밍을 배우기 위해 책을 찾아야합니다.

매우 기본 사항 :

1) 깊은 어딘가에 창 코드에 이미 무한 루프가있다. 모든 Windows 프로그램은 반복적으로 입력을 검색하고 반복합니다.

2) 입력이 발견되면이 루프가 이벤트를 시작합니다.

3) 귀하가 사명을 선택해야하는 임무는 해당 이벤트를 처리 할 이벤트 핸들러를 작성하는 것입니다.

1

당신이 가장 가능성이 잘못 이미 지적 된 바와 같이하고있다, 그러나 당신은이

응용 프로그램을 사용할 수 있습니다.DoEvents();

당신이

이 올바른 방법으로 할 수있는 실제 루프에있을 때 이벤트를 처리 할 수 ​​- 루프 를 사용하지 않는 - 입력을위한 편집 상자를 사용을, 다음 버튼을 가 - 버튼을 구현 onclick 이벤트

1

예, 나는 음성 이벤트를 기다리고있는 경우,이 함수가 실행되고 언제 이벤트가 일어날 수있는 무엇, 나는 그없이 반복적으로 처리해야합니다 이벤트를 접선하는 형태의 코드 숨김에서 쉽게 함수 호출