C\#러시아 블록 실현(소스 코드)

개술
러시아 블록(Tetris)은 러시아인 알 렉 세이 파 키 트 노 프 가 발명 한 레저 게임 으로 파 키 트 노 프 는 퍼 즐 을 좋아해 퍼 즐 게임 에서 영감 을 얻어 러시아 블록 을 디자인 했다.손 이 간단 하고 노소 가 모두 적합 하기 때문에 누구나 다 알 고 세 계 를 풍미 했다.본 고 는 C\#를 통 해 러시아 블록 을 어떻게 실현 하 는 지 요약 하고 학습 공유 만 할 수 있 으 며 부족 한 점 이 있 으 면 지적 해 주 십시오.
지식 에 관련되다
BackgroundWorker 는 단독 스 레 드 에서 작업 을 수행 합 니 다.
Action.NetFramework 자체 의뢰 방법
TableLayoutPanel  판 넬 을 표시 합 니 다.줄 과 열 로 구 성 된 격자 에서 그 내용 을 동적 으로 배치 할 수 있 습 니 다.본 고 는 주로 러시아 사각형 의 용기 로 사 용 됩 니 다.
블록 플 로 차 트
아래 그림 에서 보 듯 이 러시아 사각형 의 디자인 절차 도 를 묘사 했다.

러시아 블록 효과 도
다음 그림 에서 보 듯 이 주로 상태,득점,시작 버튼,정지 버튼,키보드 좌우 화살표 이동 등 기능 을 포함한다.

핵심 코드
1.사각형 의 모양 정의
총 7 가지 모양

/// <summary>
 ///         
 /// </summary>
 public enum TetrisStyle
 {
  S = 0,
  Z = 1,
  L = 2,
  J = 3,
  I = 4,
  O = 5,
  T = 6
 }
2.이동 방향 정의
아래 와 같이 기본 값 으로 아래로 이동 하 며 좌우 로 이동 할 수 있 습 니 다.

/// <summary>
 ///          
 /// </summary>
 public enum TetrisDirection
 {
  UP = 0,// ,       
  DOWN = 1,// ,      
  LEFT = 2,// ,      
  RIGHT = 3, //      
  DEFAULT=4 //    
 }
3.러시아 블록 요소
다음 과 같이 모든 모양 은 네 개의 사각형 으로 구성 되 고 서로 다른 모양 에 따라 서로 다른 위 치 를 설정 합 니 다.

 /// <summary>
  ///        
  /// </summary>
  public class TetrisElement
  {
   /// <summary>
   ///     
   /// </summary>
   /// <param name="style"></param>
   public TetrisElement(TetrisStyle style) {
    this.style = style;
   }
 
   /// <summary>
   ///     
   /// </summary>
   /// <param name="style">  </param>
   /// <param name="content">  </param>
   /// <param name="location">  </param>
   public TetrisElement(TetrisStyle style, Point[] content, Point location)
   {
    this.style = style;
    this.content = content;
    this.location = location;
   }
 
   /// <summary>
   ///       
   /// </summary>
   public TetrisStyle style { get; set; }
 
   /// <summary>
   ///   
   /// </summary>
   public Point[] content { get; set; }
 
   /// <summary>
   ///     
   /// </summary>
   public Point location { get; set; }
 
   /// <summary>
   ///     
   /// </summary>
   /// <param name="x"></param>
   /// <param name="y"></param>
   public void move(int x, int y)
   {
    this.location = new Point(x, y);
   }
 
   public Point[] getContent(TetrisStyle style)
   {
    //        ,  :    ,    
    Point[] content = new Point[4];
    switch (style)
    {
     case TetrisStyle.I:
      //I  
      content[0] = new Point(0, 0);
      content[1] = new Point(0, 1);
      content[2] = new Point(0, 2);
      content[3] = new Point(0, 3);
      break;
     case TetrisStyle.J:
      //J  
      content[0] = new Point(1, 0);
      content[1] = new Point(1, 1);
      content[2] = new Point(1, 2);
      content[3] = new Point(0, 2);
      break;
     case TetrisStyle.L:
      //L  
      content[0] = new Point(0, 0);
      content[1] = new Point(0, 1);
      content[2] = new Point(0, 2);
      content[3] = new Point(1, 2);
      break;
     case TetrisStyle.O:
      //O  
      content[0] = new Point(0, 0);
     content[1] = new Point(1, 0);
      content[2] = new Point(0, 1);
     content[3] = new Point(1, 1);
     break;
    case TetrisStyle.S:
     //S  
     content[0] = new Point(2, 0);
     content[1] = new Point(1, 0);
      content[2] = new Point(1, 1);
     content[3] = new Point(0, 1);
      break;
    case TetrisStyle.T:
     //T  
     content[0] = new Point(0, 0);
      content[1] = new Point(1, 0);
      content[2] = new Point(2, 0);
     content[3] = new Point(1, 1);
     break;
    case TetrisStyle.Z:
     //Z  
      content[0] = new Point(0, 0);
     content[1] = new Point(1, 0);
      content[2] = new Point(1, 1);
      content[3] = new Point(2, 1);
      break;
     default:
      //  I
      content[0] = new Point(0, 0);
      content[1] = new Point(0, 1);
      content[2] = new Point(0, 2);
      content[3] = new Point(0, 3);
      break;
    }
    return content;
   }
  }
4.용기 류
다음 과 같이 용기 류 는 주로 사각형 요 소 를 이동 하고 페이지 의 값 을 업데이트 합 니 다.

/// <summary>
 ///        
 /// </summary>
 public class TetrisContainer
 {
  private int[,] tetris = new int[10, 20];//      ,      ,    0

  public Action<Point,Point[],TetrisDirection> onPartialChanged;//      

  public Action<int[,]> onFullChanged;//       ,         

  public Action onCompleted; //    

  public int scorce = 0;

  /// <summary>
  ///       
  /// </summary>
  /// <param name="element"></param>
  /// <param name="direction"></param>
  /// <returns></returns>
  public TetrisElement change(TetrisElement element, TetrisDirection direction)
  {
   TetrisElement tmp=null;
   //       
   switch (direction) {
    case TetrisDirection.DEFAULT:
     //        
     if (checkDefault(element))
     {
      //        
      element.move(element.location.X, element.location.Y + 1);
      tmp = element;
     }
     else {
      //         ,     
      updateTetris(element);
      tmp = null;
     }

     break;
    case TetrisDirection.DOWN:
     break;
    case TetrisDirection.UP:
     break;
    case TetrisDirection.LEFT:
     if (checkLeft(element)){
      //          
      //        
      element.move(element.location.X-1, element.location.Y);
      tmp = element;
     }
     break;
    case TetrisDirection.RIGHT:
     if (checkRight(element))
     {
      //          
      //        
      element.move(element.location.X+1, element.location.Y);
      tmp = element;
     }
     break;
   }

   //    
   if (onPartialChanged != null)
   {
    Point location = element.location;
    Point[] content = new Point[4];
    element.content.CopyTo(content, 0);

    for (int i = 0; i < content.Length; i++)
    {
     content[i].X = location.X + content[i].X;
     content[i].Y = location.Y + content[i].Y;
    }
    onPartialChanged(location,content,direction);
   }

   //        
   if (onCompleted != null) {
    if (checkComplete()) {
     onCompleted();
    }
   }

   //    
   if (onFullChanged != null)
   {
    //        1  ,      
    int[] rows = checkAllTetris();
    if (rows.Length>0)
    {
     updateAllTetris(rows);//   
     onFullChanged(tetris);
    }
   }

   return tmp;
  }

  /// <summary>
  ///   tetris
  /// </summary>
  /// <param name="element"></param>
  private void updateTetris(TetrisElement element)
  {
   Point location = element.location;
   Point[] content = element.content;
   int minX = element.getMinX(element.style);
   int maxX = element.getMaxX(element.style);
   int minY = element.getMinY(element.style);
   int maxY = element.getMaxY(element.style);
   foreach (Point p in content)
   {
    if (location.Y + p.Y < 20 && location.Y + p.Y >= 0 && location.X + p.X >= 0 && location.X + p.X < 10)
    {
     this.tetris[location.X + p.X, location.Y + p.Y] = 1;
    }
   }
  }

  /// <summary>
  ///      
  /// </summary>
  private int[] checkAllTetris()
  {
   List<int> lst = new List<int>();
   //20 
   for (int y = 0; y < 20; y++)
   {
    int col = 0;
    //10 
    for (int x = 0; x < 10; x++)
    {
     if (tetris[x, y] == 0)
     {
      break;
     }
     else
     {
      col += 1;
     }
    }
    if (col == 10)
    {
     col = 0;
     lst.Add(y);
    }
   }
   return lst.ToArray();
  }

  /// <summary>
  ///   
  /// </summary>
  private void updateAllTetris(int[] rows) {
   foreach (int row in rows) {
    //     
    for (int x = 0; x < 10; x++) {
     tetris[x, row] = 0;
    }
    //row          
    for (int y = row-1; y >=0; y--) {
     for (int x = 0; x < 10; x++) {
      if (tetris[x, y] == 1) {
       tetris[x, y + 1] = 1;
       tetris[x, y] = 0;
      }
     }
    }
   }
  }

  /// <summary>
  ///         
  /// </summary>
  /// <returns></returns>
  private bool checkComplete() {
   bool isComplete = false;
   for (int i = 0; i < 10; i++) {
    if (tetris[i, 0] == 1) {
     isComplete = true;
     break;
    }
   }
   return isComplete;
  }

  /// <summary>
  ///     
  /// </summary>
  /// <param name="s"></param>
  public void updateScore(int s) {
   this.scorce = this.scorce + s;
  }

  /// <summary>
  ///     
  /// </summary>
  public void Reset() {
   this.tetris = new int[10, 20];
   this.scorce = 0;
  }
 }
5.블록 요소 와 시작 위 치 를 무 작위 로 생 성

/// <summary>
  ///     ,  Tetris    
  /// </summary>
  /// <returns></returns>
  public static TetrisElement generate()
  {
   Random r = new Random(0);
   //      
   int tstyle = getRandom();
   tstyle = tstyle % 7;
   TetrisStyle style = TetrisStyle.I;
   style = (TetrisStyle)Enum.Parse(typeof(TetrisStyle), tstyle.ToString());
   //        
   int x = getRandom();
   x = x % 10;
   int y = 0;
   //          
   TetrisElement element = new TetrisElement(style);
   //        ,  :    ,    
   Point[] content = element.getContent(style);
   //           ,    
   int minX = element.getMinX(style);
   int minY = element.getMinY(style);
   int maxX = element.getMaxX(style);
   int maxY = element.getMaxY(style);
   //      
   x = (x <= minX) ? minX : x;
   x = (x >= maxX) ? maxX : x;
   y = minY;
   Point location = new Point(x, y);
   element.location = location;
   element.content = content;
   return element;
  }
비고
원본 다운로드 링크
이상 은 C\#러시아 블록(소스 코드 첨부)을 실현 하 는 상세 한 내용 입 니 다.C\#러시아 블록 실현 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기