上接游戏人生Silverlight(1) - 七彩俄罗斯方块[Silverlight 2.0(c#)]

简介:
/// <summary> 
InBlock.gif                 /// 变形 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  void Rotate() 
InBlock.gif                { 
InBlock.gif                         if (GameStatus != GameStatus.Play)  return
InBlock.gif 
InBlock.gif                         if (!IsBoundary(_currentPiece.GetRotate(), 0, 0)) 
InBlock.gif                        { 
InBlock.gif                                RemovePiece(); 
InBlock.gif                                _currentPiece.Rotate(); 
InBlock.gif                                AddPiece(0, 0); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 清除俄罗斯方块容器 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  void Clear() 
InBlock.gif                { 
InBlock.gif                         for ( int x = 0; x < _columns; x++) 
InBlock.gif                        { 
InBlock.gif                                 for ( int y = 0; y < _rows; y++) 
InBlock.gif                                { 
InBlock.gif                                        Container[y, x].Color =  null
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 边界判断(是否超过边界) 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="matrix">当前操作的形状的4×4矩阵</param> 
InBlock.gif                 /// <param name="offsetX">矩阵 X 方向的偏移量</param> 
InBlock.gif                 /// <param name="offsetY">矩阵 Y 方向的偏移量</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 private  bool IsBoundary( int[,] matrix,  int offsetX,  int offsetY) 
InBlock.gif                { 
InBlock.gif                        RemovePiece(); 
InBlock.gif 
InBlock.gif                         for ( int i = 0; i < 4; i++) 
InBlock.gif                        { 
InBlock.gif                                 for ( int j = 0; j < 4; j++) 
InBlock.gif                                { 
InBlock.gif                                         if (matrix[i, j] == 1) 
InBlock.gif                                        { 
InBlock.gif                                                 if (j + _positionX + offsetX > _columns - 1  // 超过列的右边界 
InBlock.gif                                                        || i + _positionY + offsetY > _rows - 1  // 超过行的下边界 
InBlock.gif                                                        || j + _positionX + offsetX < 0  // 超过列的左边界 
InBlock.gif                                                        || Container[i + _positionY + offsetY, j + _positionX + offsetX].Color !=  null// matrix 所需偏移的地方已经有 Block 占着了 
InBlock.gif                                                { 
InBlock.gif                                                        AddPiece(0, 0); 
InBlock.gif                                                         return  true
InBlock.gif                                                }                                                
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        AddPiece(0, 0); 
InBlock.gif                         return  false
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 设置“下一个形状的容器”的 UI 
InBlock.gif                 /// </summary> 
InBlock.gif                 private  void SetNextContainerUI() 
InBlock.gif                { 
InBlock.gif                         // 清空 
InBlock.gif                         foreach (Block block  in NextContainer) 
InBlock.gif                        { 
InBlock.gif                                block.Color =  null
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 根据 _nextPiece 的矩阵设置相对应的 Block 对象的呈现 
InBlock.gif                         for ( int x = 0; x < 4; x++) 
InBlock.gif                        { 
InBlock.gif                                 for ( int y = 0; y < 4; y++) 
InBlock.gif                                { 
InBlock.gif                                         if (_nextPiece.Matrix[x, y] == 1) 
InBlock.gif                                        { 
InBlock.gif                                                NextContainer[x, y].Color = _nextPiece.Color; 
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 移除 _currentPiece 在界面上的呈现 
InBlock.gif                 /// </summary> 
InBlock.gif                 private  void RemovePiece() 
InBlock.gif                { 
InBlock.gif                         for ( int i = 0; i < 4; i++) 
InBlock.gif                        { 
InBlock.gif                                 for ( int j = 0; j < 4; j++) 
InBlock.gif                                { 
InBlock.gif                                         if (_currentPiece.Matrix[i, j] == 1) 
InBlock.gif                                        { 
InBlock.gif                                                Container[i + _positionY, j + _positionX].Color =  null
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 增加 _currentPiece 在界面上的呈现 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="offsetX">X 方向上的偏移量</param> 
InBlock.gif                 /// <param name="offsetY">Y 方向上的偏移量</param> 
InBlock.gif                 private  void AddPiece( int offsetX,  int offsetY) 
InBlock.gif                { 
InBlock.gif                         for ( int i = 0; i < 4; i++) 
InBlock.gif                        { 
InBlock.gif                                 for ( int j = 0; j < 4; j++) 
InBlock.gif                                { 
InBlock.gif                                         if (_currentPiece.Matrix[i, j] == 1) 
InBlock.gif                                        { 
InBlock.gif                                                Container[i + _positionY + offsetY, j + _positionX + offsetX].Color = _currentPiece.Color; 
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        _positionX += offsetX; 
InBlock.gif                        _positionY += offsetY; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 根据游戏规则,如果某行出现连续的直线则将其删除,该线以上的部分依次向下移动 
InBlock.gif                 /// </summary> 
InBlock.gif                 private  void RemoveRow() 
InBlock.gif                { 
InBlock.gif                         // 删除的行数 
InBlock.gif                         int removeRowCount = 0; 
InBlock.gif 
InBlock.gif                         // 行的遍历(Y 方向) 
InBlock.gif                         for ( int y = 0; y < _rows; y++) 
InBlock.gif                        { 
InBlock.gif                                 // 该行是否是一条连续的直线 
InBlock.gif                                 bool isLine =  true
InBlock.gif 
InBlock.gif                                 // 列的遍历(X 方向) 
InBlock.gif                                 for ( int x = 0; x < _columns; x++) 
InBlock.gif                                { 
InBlock.gif                                         if (Container[y, x].Color ==  null
InBlock.gif                                        { 
InBlock.gif                                                 // 出现断行,则继续遍历下一行 
InBlock.gif                                                isLine =  false
InBlock.gif                                                 break
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif 
InBlock.gif                                 // 该行是一条连续的直线则将其删除,并将该行以上的部分依次向下移动 
InBlock.gif                                 if (isLine) 
InBlock.gif                                { 
InBlock.gif                                        removeRowCount++; 
InBlock.gif 
InBlock.gif                                         // 删除该行 
InBlock.gif                                         for ( int x = 0; x < _columns; x++) 
InBlock.gif                                        { 
InBlock.gif                                                Container[y, x].Color =  null
InBlock.gif                                        } 
InBlock.gif 
InBlock.gif                                         // 将被删除行的以上行依次向下移动 
InBlock.gif                                         for ( int i = y; i > 0; i--) 
InBlock.gif                                        { 
InBlock.gif                                                 for ( int x = 0; x < _columns; x++) 
InBlock.gif                                                { 
InBlock.gif                                                        Container[i, x].Color = Container[i - 1, x].Color; 
InBlock.gif                                                } 
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 加分,计算方法: 2 的 removeRowCount 次幂 乘以 10 
InBlock.gif                         if (removeRowCount > 0) 
InBlock.gif                                Score += 10 * ( int)Math.Pow(2, removeRowCount);                                 
InBlock.gif 
InBlock.gif                         // 更新总的已消行数 
InBlock.gif                        RemoveRowCount += removeRowCount; 
InBlock.gif 
InBlock.gif                         // 根据已消行数计算级别,依据丁学的建议,计算方法: 已消行数/5 的平方根 取整 
InBlock.gif                        Level = ( int)Math.Sqrt(RemoveRowCount / 5); 
InBlock.gif 
InBlock.gif                         // 根据级别计算速率,计算方法: 初始速率 减 (每多一个级别所需增加的速率 乘以 当前级别) 
InBlock.gif                        _timer.Interval = TimeSpan.FromMilliseconds(_initSpeed - _levelSpeed * Level > _levelSpeed ? _initSpeed - _levelSpeed * Level : _levelSpeed); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  int _score = 0; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 得分 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  int Score 
InBlock.gif                { 
InBlock.gif                        get {  return _score; } 
InBlock.gif                        set 
InBlock.gif                        { 
InBlock.gif                                _score = value; 
InBlock.gif                                 if (PropertyChanged !=  null
InBlock.gif                                { 
InBlock.gif                                        PropertyChanged( thisnew PropertyChangedEventArgs( "Score")); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  int _removeRowCount = 0; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 总共被消除的行数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  int RemoveRowCount 
InBlock.gif                { 
InBlock.gif                        get {  return _removeRowCount; } 
InBlock.gif                        set 
InBlock.gif                        { 
InBlock.gif                                _removeRowCount = value; 
InBlock.gif                                 if (PropertyChanged !=  null
InBlock.gif                                { 
InBlock.gif                                        PropertyChanged( thisnew PropertyChangedEventArgs( "RemoveRowCount")); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  int _level = 0; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 级别(游戏难度) 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  int Level 
InBlock.gif                { 
InBlock.gif                        get {  return _level; } 
InBlock.gif                        set 
InBlock.gif                        { 
InBlock.gif                                _level = value; 
InBlock.gif                                 if (PropertyChanged !=  null
InBlock.gif                                { 
InBlock.gif                                        PropertyChanged( thisnew PropertyChangedEventArgs( "Level")); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  event PropertyChangedEventHandler PropertyChanged; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 游戏结束的事件委托 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  event EventHandler GameOver; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 游戏结束后所调用的方法,并触发游戏结束事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 private  void OnGameOver(EventArgs e) 
InBlock.gif                { 
InBlock.gif                        GameStatus = GameStatus.Over; 
InBlock.gif                        _timer.Interval = TimeSpan.FromMilliseconds(_initSpeed); 
InBlock.gif                        _timer.Stop(); 
InBlock.gif 
InBlock.gif                        EventHandler handler = GameOver; 
InBlock.gif                         if (handler !=  null
InBlock.gif                                handler( this, e); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 


     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/345632 ,如需转载请自行联系原作者


相关文章

热门文章

最新文章