이 프로그래밍 문제는 우려의 분리에 대해 알려 드리기위한 것입니다. 그렇지 않다면, 있어야합니다. (지금입니다!)
두 가지 문제가 있습니다. 하나는 문제가 아닙니다. (실제로 두 개 이상 있지만 두 개는 있습니다.) 한 가지 문제는이 게임에서 카운터를 나타내는 개체 집합을 어떻게 만듭니 며 그 개체가 따르는 규칙은 무엇입니까? 다른 문제는 다음과 같습니다. 화면에서 카운터를 어떻게 나타낼 수 있습니까?
첫 번째 문제에 대한 해결책은 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) 나는 당신을 위해 숙제를하려고하지 않기 때문입니다.
게임이 작동하는 방법을 보여주는 PDF는 여기에서 찾을 수 있습니다 : http://users.cscs.wmin.ac.uk/~w1128683/csharphelp/Game_Rules.pdf – Exile
이 같은 코스 권리를 가지고 다른 학생들이 있습니다 ? 당신이 알아낼 수없는 것을 지나치게 할 수 있도록 충분한 도움을 청할 수는 없습니다. – davewasthere
처음에는 클릭 루틴을 사용하여 클릭 한 카운터를 식별해야합니다. 그 점을 이해할 수 있는지 확인하십시오 (팁 - 발신자 매개 변수 사용). 어쩌면 그냥 상자를 말하는 메시지를 표시하는 코드를 작성하는 것으로 시작하십시오. –