2009-12-13 2 views
0

나는 C#을 배우려고 노력하고있다. (너무 쉽게 풀어 줘!) 교과 과정의 일부로 삼진이라는 게임을 만들어 달라.카운터를 움직일 수 없습니다 (C#의 게임은 PictureBox를 사용).

게임 규칙은 매우 간단합니다. 하나의 카운터를 다른 화면에 두는 것만으로 화면에 하나의 카운터를 두는 것을 목표로합니다.

단순히 한 카운터를 다른 카운터로 이동하는 데 문제가 있습니다. 내 보드를 만들기 위해 루프를 사용하여 여러 그림 상자를 만들고 루프를 사용하여 이벤트 처리기를 만들었습니다. 단일 짝수 처리기를 사용하여 모든 카운터를 이동하는 방법은 무엇입니까?

{ 
    (...) 
    for (int i = 0; i < 8; i++) 
    { 
     for (int j = 0; j < 8; j++) 
     { 
      int x = j * (75); 
      int y = i * (75); 

      pictureBoxCounter[j, i] = new PictureBox(); 
      pictureBoxCounter[j, i].Location = new System.Drawing.Point(x, y); 
      pictureBoxCounter[j, i].Size = new System.Drawing.Size(75, 75); 
      pictureBoxCounter[j, i].BackColor = System.Drawing.Color.Transparent; 
      panelGame.Controls.Add(pictureBoxCounter[j, i]); 
      this.pictureBoxCounter[j, i].Click += new System.EventHandler(this.pictureBoxCounter_Click); 
     } 
    } 
} // end of some function 

private void pictureBoxCounter_Click(object sender, EventArgs e) 
{ 
    //I need some code here but nothing seems to work :(
} 

나는이 문제에 오래 머물렀다. 심지어 내 선생님이 도와달라고 부탁했습니다. 대신 그는 도움을 주었고 대부분의 코드를 깨뜨릴 수있었습니다. 그래서 그가 일으킨 문제를 고친 후에 저는 컴파일하는 프로그램으로 돌아 왔습니다!

(프로그램을 실행할 때 시작 게임 버튼을 사용하려면 플레이어 정보를 입력해야합니다.)

내가 어떤 다른 정보와 도움을 줄 수 있다면 주저하지 마십시오!

+0

게임이 작동하는 방법을 보여주는 PDF는 여기에서 찾을 수 있습니다 : http://users.cscs.wmin.ac.uk/~w1128683/csharphelp/Game_Rules.pdf – Exile

+1

이 같은 코스 권리를 가지고 다른 학생들이 있습니다 ? 당신이 알아낼 수없는 것을 지나치게 할 수 있도록 충분한 도움을 청할 수는 없습니다. – davewasthere

+0

처음에는 클릭 루틴을 사용하여 클릭 한 카운터를 식별해야합니다. 그 점을 이해할 수 있는지 확인하십시오 (팁 - 발신자 매개 변수 사용). 어쩌면 그냥 상자를 말하는 메시지를 표시하는 코드를 작성하는 것으로 시작하십시오. –

답변

2

이 프로그래밍 문제는 우려의 분리에 대해 알려 드리기위한 것입니다. 그렇지 않다면, 있어야합니다. (지금입니다!)

두 가지 문제가 있습니다. 하나는 문제가 아닙니다. (실제로 두 개 이상 있지만 두 개는 있습니다.) 한 가지 문제는이 게임에서 카운터를 나타내는 개체 집합을 어떻게 만듭니 며 그 개체가 따르는 규칙은 무엇입니까? 다른 문제는 다음과 같습니다. 화면에서 카운터를 어떻게 나타낼 수 있습니까?

첫 번째 문제에 대한 해결책은 PictureBox의 묶음을 만드는 것이지만, 토끼 구멍을 내리고 나면 다시 빠져 나갈 수 있습니다. 먼저 첫 번째 문제를 해결 한 다음 두 번째 문제를 해결해야합니다. 이 곳

public class Board 
{ 
    public const int Height = 8; 
    public const int Width = 8; 
    private Counters[Height][] Counters { get; set; } 

    public Counter GetCounter(int row, int col) 
    { 
     return Counters[row][col]; 
    } 
    public void Initialize() { } 
    public void ExecuteMove(Counter c) { } 
} 

public class Counter 
{ 
    public int Row { get; set; } 
    public int Column { get; set; } 
} 

그래서하는 Counter 객체가 알고 : 첫 번째 문제를 해결하는 객체 모델 (I이 게임의 규칙을 모르기 때문에, 매우 거친) 여기

은 거친 스케치입니다 (및 Column). Board 개체는 Counter 개체를 모두 알고 있으며 행과 열이 지정된 Counter을 찾는 방법을 알고 카운터가 클릭 될 때 이동을 실행하는 방법을 알고 있습니다. (나는 게임의 규칙에 대해 아무것도 모른다. 그러나 그들은 ExecuteMove 방법으로 살 예정이다.

public void PrintBoard(Board b) 
{ 
    for (int col = 0; col < board.Width; col ++) 
    { 
     for (int row = 0, row < board.Height; row++) 
     { 
     Counter c = board.GetCounter[row][col]; 
     Console.Write(c == null ? " " : "*"); 
     } 
     Console.WriteLine(); 
    } 
} 

및 입력 방법 이동 :

이제 하찮게 콘솔 보드를 인쇄하는 방법을 쓸 수

public Counter InputMove(Board b) 
{ 
    string s; 
    Console.Write("Row: "); 
    s = Console.ReadLine(); 
    int row = Convert.ToInt32(s); 
    if (s == "") return null; 
    Console.Write("Column: "); 
    s = Console.ReadLine(); 
    if (s == "") return null; 
    int column = Convert.ToInt32(s); 
    return b.GetCounter(row, column); 
} 

을 ... 그리고 지금 당신은 당신은 모든 것을 가지고 ExecuteMove 메소드를 코딩하고 테스트해야합니다. 그 일을하십시오. 기다릴게.

완료 했습니까? 좋은. 내가 다루지 않은 문제가 두 가지 있습니다. 예를 들어, Counter을 움직이면 보드의 어레이와 카운터 자체를 모두 업데이트해야한다는 것을 발견했을 것입니다. 그리고 당신은 카운터가 파괴되었을 때 일어나는 일을 추적 할 수있는 방법을 생각해 내야한다는 것을 발견했을 것입니다. 마우스 클릭과 UI 요소로도 엉망이되지 않아서 기쁘지 않습니까?

이제 2 부. 위원회와 대화하는 방법을 알고있는 UI를 만들어 보겠습니다. 양식에서 보드의 카운터를 반복하고 각각에 대해 및 Column 속성을 기반으로 위치를 만들어 Counters이라는 Dictionary<PictureBox, Counter>에 추가합니다. 예를 들어 PictureBoxes이라고하는 Dictionary<Counter, PictureBox>도 필요합니다. 이지도를 사용하면 PictureBox이 부여 된 Counter을 찾을 수 있으며 반대의 경우도 마찬가지입니다.

PictureBox이 이벤트 핸들러를 첨부 :

private void PictureBox_Click(object sender, EventArgs e) 
{ 
    PictureBox p = (PictureBox) sender; 
    Counter c = Counters[p]; 
    Board.ExecuteMove(c); 
} 

가 (이, 그런데, 원래의 질문에 대한 답변입니다.)

글쎄, 그건 잘하고 좋은 모든 : 당신이 클릭 할 수 있습니다 PictureBox에서 Counter을 찾아 이동하십시오. 하지만 UI에서 게임의 시각적 상태를 어떻게 업데이트합니까? 게임의 실제 규칙이 무엇인지에 달려 있습니다. 카운터에 클릭하면이 사라지게 경우

는 예를 들어, 당신은 Counter 클래스에 Visible 속성을 추가하고 Board 클래스의 ExecuteMove 갱신을해야 할 수도 있습니다. Counter이 보이지 않게되면 그 행의 다른 Counter이 왼쪽 또는 오른쪽으로 이동하면 ExecuteMove 메서드는 및 Column을 업데이트하고 그 위치에 있던 이제 보이지 않는 Counter을 사용합니다.

하지만 게임 논리를 모두 테스트했을 때 이미이 모든 작업을 마쳤습니다. 맞습니까? UI에서 구현해야하는 것은 콘솔에 출력하기 위해 사용자가 작성한 것과 동일한 메소드입니다. 이 중 하나만 보드의 Counter 전체를 반복하고 상태에 따라 PictureBox을 업데이트합니다.

내가 주로 여기에 설명하고있는 많은 미묘한 점들이 있는데, 그 이유는 대부분 내가 a) 당신의 문제를 완전히 이해하지 못하고 b) 나는 당신을 위해 숙제를하려고하지 않기 때문입니다.

+0

와우 감사합니다! 네, nobugz가 내가 한 것에 답한 후 게임 규칙과 프로젝트를 오프라인으로 가져 왔습니다. (규칙은 지금 온라인으로 다시 돌아 간다) 내가 내일 만기가되는 것에 따라 나는 내일 저녁 동안 모양에 되돌아 갈 것이다, 나는 첫번째로 만날 필요가있다! 다시 한 번 감사드립니다 Robert Rossney! – Exile

1

Click 이벤트 핸들러에서 클릭 한 그림 상자를 다시 찾아야합니다. 이를 위해 sender 인수를 사용할 수 있습니다. 하찮게 :

private void pictureBoxCounter_Click(object sender, EventArgs e) 
    { 
     PictureBox box = sender as PictureBox; 
     box.BackColor = System.Drawing.Color.Coral; 
    } 

하지만 당신은 당신이 게임 보드 박스의 위치를 ​​알고 필요로 할뿐만 아니라, 게임 로직을 구현해야합니다. 이를 위해 PictureBox.Tag 속성을 사용할 수 있습니다. 그것은 예를 들어 포인트를 저장할 수 :

... 
        pictureBoxCounter[j, i].BackColor = System.Drawing.Color.Transparent; 
        pictureBoxCounter[j, i].Tag = new Point(j, i); 
        panelGame.Controls.Add(pictureBoxCounter[j, i]); 
... 

    private void pictureBoxCounter_Click(object sender, EventArgs e) 
    { 
     PictureBox box = sender as PictureBox; 
     box.BackColor = System.Drawing.Color.Coral; 
     Point pos = (Point)box.Tag; 
     int row = pos.X; 
     int col = pos.Y; 
     //etc... 
    } 

하지만 당신은 아마 행 및 열 수보다 더 많은 정보를 저장하는 헬퍼 클래스를 사용하고 싶습니다.

+0

고맙습니다. 많은 nobugz 당신은 내 하루를 만들었습니다! – Exile

관련 문제