2012-10-04 2 views
2

나는 Game of Life의 복사본을 구현하여 C#을 배우고 있습니다. for 루프를 사용하여 pictureBox 위에 그리드를 성공적으로 그릴 수있었습니다. fill_in이라는 이름의 부울은 사각형 채우기입니다. 나는 사각형을 클릭 할 수있게 만드는 데 도움을 요청하고 있습니다. pictureBox_MouseClick을 허용하도록 pictureBox의 propertite 속성을 설정했습니다. 측면에서 mouseClick 이벤트 좌표를 xy으로 설정했습니다. 문제는 ==을 bool 피연산자에 적용 할 수 없기 때문에 해당 이벤트의 if 문이 올바르지 않다는 것입니다.PictureBox- 그리드 및 사각형으로 채우기 (생명의 게임)

bool fill_in이 true 인 경우 검정색으로 채울 if 조건문을 어떻게 수행 할 수 있습니까? 은 if 문에 대한 변경 후

코드

namespace life 
    { 
     public partial class Form1 : Form 
     { 

      Graphics paper; 
      bool[,] fill_in = new bool[450, 450]; 

     public Form1() 
      { 
       InitializeComponent(); 
       paper = pictureBox1.CreateGraphics(); 

      } 


    //makes grid in picture box 
    private void drawGrid() 
      { 
       int numOfCells = 100; 
       int cellSize = 10; 
       Pen p = new Pen(Color.Blue); 
       paper.Clear(Color.White); 

       for (int i = 0; i < numOfCells; i++) 
       { 
        // Vertical 
        paper.DrawLine(p, i * cellSize, 0, i * cellSize, numOfCells * cellSize); 
        // Horizontal 
        paper.DrawLine(p, 0, i * cellSize, numOfCells * cellSize, i * cellSize); 
       } 
      } 


    // populate bool fill_in with true (alive) or false (dead) 
      private void clearGrid() 
      { 
       for (int x = 0; x < 450; x = x + 10) 
       { 
        for (int y = 0; y < 450; y = y + 10) 
        { 
         fill_in[x, y] = false; 
        } 
       } 
      } 

    private void button1_Click(object sender, EventArgs e) 
      { 
       drawGrid(); 
       clearGrid(); 

       for (int x = 0; x < 440; x = x + 10) 
       { 
        for (int y = 0; y < 440; y = y + 10) 
        { 
         if (fill_in[x, y] == true) 
          paper.FillRectangle(Brushes.Black, x, y, 10, 10); 
        } 
       } 
      } 

    private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
      { 

       int x = e.X; 
       int y = e.Y; 
       int i = x/10; 
       int j = y/10; 


       fill_in[i, j] = !fill_in[i, j]; 

       if (fill_in[i, j]) 
       { 

       paper.FillRectangle(Brushes.Black, x, y, 10, 10); 
       } 
       else 
       { 

       paper.FillRectangle(Brushes.White, x, y, 10, 10);  

       } 

       } 

       } 
      } 

:

enter image description here

답변

3

하신 pictureBox1_MouseClick에서 if (fill_in == true) 배열의 첨자가 누락 (fill_in는 기억 배열인가?).

하지만 상관 없습니다. 당신은 이미 그 방법을 만들었 기 때문에 fill_in[i, j]이 사실임을 알고 있기 때문에 if을 완전히 제거 할 수 있습니다.

당신이 찾고 있다면 첫 번째 클릭에를 기입하고, 당신은 조금을 이벤트 핸들러를 변경할 수 있습니다 ("채워지지"로 복원) 취소 채우기 위해 :

private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    int x = e.X; 
    int y = e.Y; 
    int i = x/10; 
    int j = y/10; 

    // Reverse the value of fill_in[i, j] - if it was false, change to true, 
    // and if true change to false 
    fill_in[i, j] = !fill_in[i, j]; 

    if (fill_in[i, j]) 
    { 
    // Fill grid square with the filled color 
    } 
    else 
    { 
    // Fill grid square with unfilled color    
    } 
} 
+0

1 이것은 거의 완벽합니다. 유일한 문제는 채우기 사각형이 격자 사각형과 일치하지 않는다는 것입니다. 위의 사진을보십시오. – CodingWonders90

+3

사각형이 마우스 클릭 위치에 그려지기 때문에 일치하지 않는 것은 당연합니다. 맞습니까? 그리드의 가장 가까운 셀에 정렬해야합니다. 따라서 int x = cellSize * (e.X/cellSize)와 같은 것을 할 수 있습니다. – Einar

+1

귀하의 질문에 대한 다른 질문 ('if' 문이 작동하지 않음)이 아니라 도면 작성 방법이 필요합니다. 지금 그리드 그리기에 대한 질문이 있으면 별도의 질문이어야합니다. 배경에 대한 링크를 제공 할 수 있습니다. 사람들이 답변을 게시하기 시작한 후에 질문의 요점을 변경하는 것은 적절하지 않습니다. 움직이는 표적을 치는 것이 꽤 어렵습니다. –

관련 문제