2010-12-06 2 views
-1

메신저는 3 피스, 왕과 여왕 한쪽과 다른 쪽을 단지 왕이있는 간단한 체스 게임을 쓰고, 왕과 여왕은 적은 움직임으로 왕을 혼자야한다.이 프로젝트에서 , 먼저 우리는 사용자로부터 혼자만의 장소를 얻어야하고, 다른 작업을 수행함에 따라, 왕이 머물러야하는 장소를 사용자로부터 어떻게 얻을 수 있는지 알고 싶습니다. 64 개의 그림 상자로 양식을 구현했습니다. 수업을 작성할 것입니다. 위치에 대한,체스 게임에서 왕의 장소를 얻는

너무 감사 편집 : 내가 미스터 존 소총 응답에서이 코드를 작성

: 가 어떤 실수를 않습니다 그것을 할 나던 때문에 내가 클릭 할 때 아무거나,

PictureBox[,] pic = new PictureBox[8, 8]; 

public PictureBox SetKingImage(int x,int y) 
    { 


     pic[x,y].Image=Image.FromFile("pic/siyahsah2.JPG"); 
     return pic[x, y]; 
    } 

public void GetClickedPicturebox() 
    { 
     int x, y; 

     for(x=0;x<8;x++) 
     { 
      for(y=0;y<8;y++) 
      { 
       pic[x, y] = new PictureBox(); 

       pic[x, y].Click += (object sender, System.EventArgs e) =>SetKingImage(x, y); 


      } 
      } 
     } 
+2

사용자가 보드의 위치를 ​​선택할 수 있도록 UI 대안에 대한 제안을 요청하고 있습니까 (예 : 일반적인 체스 문자 - 숫자 규칙에서 행 - 열 입력, 그리드 클릭, 키 이미지를 그리드로 끌어다 놓기 ...) 또는 반대편 조각의 위치와 함께 왕으로부터의 이동의 유효성을 확인하는 것에 관한 것인가? – mjv

+0

예, 사용자가 위치를 피치하게 할 수있는 UI 대안을 묻습니다. 관련 그림 상자를 클릭하는 것이 좋은 방법이라고 생각합니다. – Arash

답변

3

가장 간단한 방법은 관련 그림 상자를 클릭하도록 사용자에게 요청하는 것입니다. 당신은 PictureBox를 세 가지 방법 중 하나를 클릭 한 결정할 수 :

  • 각각의 PictureBox에 대해 동일한 이벤트 핸들러를 사용하여 구독하지만,
  • 가 동일한 이벤트 핸들러를 사용하여 구독 좌표를 얻을 수있는 PictureBox 내에서 태그를 사용 각 PictureBox를 들면, 그러나 단지의 PictureBox에 대한 참조 (sender) 그것이 어느 찾을를 사용하여 좌표를 얻을 적절
  • 같이, 위치를 캡슐화하는 람다 식을 사용하여 동의 :

    for (int x = 0; x < 8; x++) { 
        for (int y = 0; y < 8; y++) { 
         pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y); 
        } 
    } 
    
  • 후자의 접근 방식

하나의 문제는 람다 식을 통해 이벤트에서 탈퇴하는 것은 상대적으로 고통스러운 것입니다 - 당신은 아마도 첫 번째 버튼을 클릭하면 모든 이벤트 핸들러를 취소하고 싶습니다.

대안은 장소에 이벤트 핸들러를두고 대신 PictureBoxes를 많이 덤비는의 오른쪽 시간 여기에 :)

+0

제 질문을 편집 했습니까? 감사합니다. – Arash

+1

@arash : 두 줄 방법의 첫 번째 줄에서 돌아 오는 동안 컴파일도하지 않아도됩니다. getclickedpicturebox 호출 여부도 분명하지 않습니다. 또한 .NET 명명 규칙을 따르면 코드를 더 명확하게 읽을 수 있습니다. –

+0

@ 존 Skeet : 나는 반환 장소를 바꿨다, 나는 당신의 코멘트의 part2를 이해하지 못했고, 그것도 분명 ..., 그것에 대해 더 많이 배울 수 있습니까? 감사합니다 – Arash

3

아이디어 아니에요 때 그들을 무시하는 것입니다.

ChessBoardControl이라는 UserControl을 만듭니다. ChessBoardControl은 주어진 그림 인 ChessBoard 개체를 처리합니다.

ChessBoardControl에서 OnMouseDown 이벤트를 무시한 다음 마우스 좌표에서 클릭 한 사각형을 쉽게 계산할 수 있습니다. 새 코드에서

+2

나는이 디자인이 훨씬 더 나은 디자인이라는 것에 전적으로 동의하며 당신의 끈기를 존중합니다. 바라건대,이 시간 중 하나, 당신과 다른 사람들도 아라시를 납득시키는 데 성공할 것입니다. –

1

는 두 for 루프 내가J 반복하지만, 루프에서 당신은 항상 그림에 이벤트 핸들러 [X, Y]를 할당되어 있습니다.

그래서 [0,0] 그림에만 처리기를 할당하고 있습니다. X 및은 변경하지 않을 Y ...

편집 :
는 솔직히 내가 당신의 코드를 이해 모르겠어요. GetClickedPicturebox에서 무엇을하고 싶습니까? 언제 전화 할거 니?

클릭 한 PictureBox를 가져 오기 위해이 함수를 호출하려는 경우 양식에있는 것 대신 새 PictureBox 인스턴스에 이벤트 처리기를 연결하기 때문에 잘못된 것입니다.

이 메서드는 초기화 메서드로 사용 된 경우 새 PictureBox 인스턴스를 만들기 만해도 양식에 표시되지 않으므로 잘못된 것입니다. 양식에 PictureBox가있는 경우 인스턴스가 다르며 이벤트 처리기를 올바른 인스턴스에 연결하지 않은 것입니다.

+0

나는 내 질문을 편집했는데, 지금 어떻게되어 가고 있습니까? – Arash