C\#연속 보기 기능 구현(추천)

9846 단어 C#연거푸 보다
본 고 는 C\#를 이용 하여 연 결 된 작은 예 를 실현 하여 학습 공유 에 사용 하도록 한다.
생각:
레이아웃 초기 화(가로 10 줄 10 열,총 100 개의 셀,각 칸 마다 단추,배경 그림 은 과일 그림,무 작위 생 성).
대응 하 는 바둑판(2 차원 배열 로[0 은 공백 을 표시 하고 0 은 인터페이스 대상 을 표시 하지 않 음])을 초기 화하 고 페이지 와 대응 하 며 동기 화 작업 을 합 니 다.
클릭 한 그림 을 없 앨 수 있 는 지 판단 합 니 다(2 차원 배열 로 전환 합 니 다[수평 방향,수직 방향,한 코너,두 코너 의 절차 로 판단 합 니 다].
삭제 할 수 있다 면 그림 을 숨 기 고 점 수 를 증가 합 니 다.
시간 제한,카운트다운 방식 채택.
관련 지식 포인트:
스 레 드:Thread,배경 운행 시간 제어[카운트다운 방식].
인터페이스 반 짝 임:인터페이스 에 있 는 컨트롤 이 비교적 많 고 배경 그림 이 있 을 때 인터페이스 에 반 짝 임[해결 방식:1,더 블 버퍼 방식 2.컨트롤 생 성 스타일 을 설정 하고 통일 적 으로 새로 고침]이 나타 납 니 다.
TableLayoutPanel:하나의 패 널 을 표시 합 니 다.줄 과 열 로 구 성 된 격자 에서 그 내용 을 동적 으로 배치 할 수 있 습 니 다[요소 추가,행렬 설정,스타일 설정].
자원 파일:Resources 는 그림 과 다른 자원 을 저장 하 는 데 사 용 됩 니 다.
Button:FlatAppearance 는 선택 한 상태 와 마우스 상 태 를 표시 하 는 테두리 모양 과 색상 을 가 져 옵 니 다.
효과 그림 아래(1)[시작,초기 화 후 카운트다운 기능,정지 기능]:

효과 도(2)【시간 종료】

핵심 코드 는 다음 과 같 습 니 다.

/// <summary>
  ///       
  /// </summary>
  public class LinkHelper
  {
    /// <summary>
    ///    ,  
    /// </summary>
    public int[,] LinkBoard { get; set; }
    /// <summary>
    ///       
    /// </summary>
    public event EventHandler SucClick;
    /// <summary>
    ///       
    /// </summary>
    public event EventHandler FailClick;
    private int col = 10;
    public int Col
    {
      get
      {
        return col;
      }
      set
      {
        col = value;
      }
    }
    private int row = 10;
    public int Row
    {
      get
      {
        return row;
      }
      set
      {
        row = value;
      }
    }
    /// <summary>
    ///     
    /// </summary>
    public void LinkLine(Point first, Point second)
    {
      EventArgs e = new EventArgs();
      if (checkLink(first, second))
      {
        //    
        this.LinkBoard[first.X, first.Y] = 0;
        this.LinkBoard[second.X, second.Y] = 0;
        if (this.SucClick != null)
        {
          SucClick(this, e);
        }
      }
      else {
        //    
        if (this.FailClick != null)
        {
          FailClick(this, e);
        }
      }
    }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="p"></param>
    /// <returns></returns>
    public bool IsChecked(Point p)
    {
      bool flag = false;
      if (p.X != -1 && p.Y != -1)
      {
        flag = true;
      }
      return flag;
    }
    #region     
    /// <summary>
    ///         
    /// </summary>
    /// <param name="a">       </param>
    /// <param name="b">       </param>
    /// <returns></returns>
    private bool checkLink(Point a, Point b)
    {
      if (!Point.Equals(a, b))
      {
        if (this.LinkBoard[a.X, a.Y] == this.LinkBoard[b.X, b.Y])
        {
          if (a.X == b.X && horizon(a, b))
          {
            return true;
          }
          if (a.Y == b.Y && vertical(a, b))
          {
            return true;
          }
          if (oneCorner(a, b))
          {
            return true;
          }
          else
          {
            return twoCorner(a, b);
          }
        }
        else {
          //            ,    false
          return false;
        }
      }
      else {
        //              ,    false;
        return false;
      }
    }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private bool horizon(Point a, Point b)
    {
      int col_start = a.Y < b.Y ? a.Y : b.Y;    //  a,b    y 
      int col_end = a.Y < b.Y ? b.Y : a.Y;     //  a,b     
      //  a,b      ,         false;
      for (int i = col_start + 1; i < col_end; i++)
      {
        if (this.LinkBoard[a.X, i] != 0)
        {
          return false;
        }
      }
      return true;
    }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private bool vertical(Point a, Point b)
    {
      int row_start = a.X < b.X ? a.X : b.X;
      int row_end = a.X < b.X ? b.X : a.X;
      for (int i = row_start + 1; i < row_end; i++)
      {
        if (this.LinkBoard[i, a.Y] != 0)
        {
          return false;
        }
      }
      return true;
    }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private bool oneCorner(Point a, Point b)
    {
      Point c = new Point(b.X, a.Y);
      Point d = new Point(a.X, b.Y);
      //  C              
      if (this.LinkBoard[c.X, c.Y] == 0)
      {
        bool path1 = horizon(b, c) && vertical(a, c);
        return path1;
      }
      //  D      
      if (this.LinkBoard[d.X, d.Y] == 0)
      {
        bool path2 = horizon(a, d) && vertical(b, d);
        return path2;
      }
      else
      {
        return false;
      }
    }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private bool twoCorner(Point a, Point b)
    {
      List<Line> ll = scan(a, b);
      if (ll.Count == 0)
      {
        return false;
      }
      for (int i = 0; i < ll.Count; i++)
      {
        Line tmpLine = ll[i];
        if (tmpLine.direct == 1)
        {
          if (vertical(a, tmpLine.a) && vertical(b, tmpLine.b))
          {
            return true;
          }
        }
        else if (tmpLine.direct == 0)
        {
          if (horizon(a, tmpLine.a) && horizon(b, tmpLine.b))
          {
            return true;
          }
        }
      }
      return false;
    }
    /// <summary>
    ///   A B          
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    private List<Line> scan(Point a, Point b)
    {
      List<Line> linkList = new List<Line>();
      //  a ,b            
      for (int i = a.Y; i >= 0; i--)
      {
        if (this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i)))
        {
          linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));
        }
      }
      //  a ,b            
      for (int i = a.Y; i < Col; i++)
      {
        if (this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i)))
        {
          linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));
        }
      }
      //  a ,b            
      for (int j = a.X; j >= 0; j--)
      {
        if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y)))
        {
          linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1));
        }
      }
      //  a ,b            
      for (int j = a.X; j < Row; j++)
      {
        if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y)))
        {
          linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1));
        }
      }
      return linkList;
    }
    #endregion
  }
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 C\#연속 보기 기능 을 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기