好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

基于C#实现俄罗斯方块游戏

最近在看C#,写了一个很水的方块游戏练手。

代码:

?

namespace game

{

  class Square

  {

  public Square()

  {

  state = 0;

  positionY = 0;

  positionX = 0;

  }

  public Square( int InitShapeCnt, int InitState)

  {

  state = InitState;

  positionY = 0;

  positionX = 0;

  InitShape(InitShapeCnt);

 

 

  }

  public void InitShape( int ShapeCnt)

  {

  if (ShapeCnt > 6 || ShapeCnt < 0)

  return ;

  else

  {

  switch (ShapeCnt)

  {

   case (0):

   Shape = LeftLShape;

   break ;

   case (1):

   Shape = RightLShape;

   break ;

   case (2):

   Shape = RightZShape;

   break ;

   case (3):

   Shape = LeftZShape;

   break ;

   case (4):

   Shape = lShape;

   break ;

   case (5):

   Shape = TuShape;

   break ;

   case (6):

   Shape = TianShape;

   break ;

   default :

   break ;

  }

  }

  }

 

  //方向 外形 颜色

  public int [, ,,] Shape = new int [4, 4, 4, 2];

  private int state; //方向

  public int State

  {

  get

  {

  return (state);

  }

  set

  {

  state = value;

  }

  }

 

 

  public void DrawSquare( ref Graphics dc)

  {

 

  for ( int Cnt1 = 0; Cnt1<4; Cnt1++)

  {

  for ( int Cnt2=0;Cnt2<4;Cnt2++)

  {

   //Shape[State][Cnt1][Cnt2][1] = 0;

   if (Shape[state, Cnt1, Cnt2, 0] == 1)

   {

   SolidBrush Brush;

   switch (Shape[state, Cnt1, Cnt2, 1])

   {

   case (1):

   Brush = new SolidBrush(Color.Red);

   break ;

   case (2):

   Brush = new SolidBrush(Color.Blue);

   break ;

   case (3):

   Brush = new SolidBrush(Color.Yellow);

   break ;

   case (4):

   Brush = new SolidBrush(Color.Green);

   break ;

   case (5):

   Brush = new SolidBrush(Color.Tan);

   break ;

   case (6):

   Brush = new SolidBrush(Color.Honeydew);

   break ;

   case (7):

   Brush = new SolidBrush(Color.ForestGreen);

   break ;

   default :

   Brush = new SolidBrush(Color.Red);

   break ;

  

   }

   dc.FillRectangle(Brush, new Rectangle((positionX*16+16*Cnt2), (positionY*16+16*Cnt1), 16, 16));

   }

  }

  }

  }

  private int positionX;

  public int PositionX

  {

  get

  {

  return (positionX);

  }

  set

  {

  positionX = value;

  }

  }

 

  private int positionY;

  public int PositionY

  {

  get

  {

  return (positionY);

  }

  set

  {

  positionY = value;

  }

  }

 

 

  public void Switch(GameCtrl game)

  {

  if (CoverEdge(game))

  state = (state + 1) % 4;

 

  }

  public void AddX(GameCtrl game)

  {

  //判断右侧

  if (RightEdge(game))

  positionX++;

  }

  public bool AddY(GameCtrl game)

  {

  if ( this .Land(game) == false )

  {

  positionY++;

  return ( true );

  }

  else

  return ( false );

 

 

  }

  public void SubX(GameCtrl game)

  {

  //判断右侧

  if (LeftEdge(game))

  positionX--;

  }

  public void SubY()

  {

 

  }

 

  private bool Land(GameCtrl game)

  {

  for ( int i = 3; i >= 0; i--)

  {

  int rowNum = 21 - this .PositionY - i;

  for ( int j = 0; j < 4; j++)

  {

   int colNum = this .PositionX + j + 3;

 

   if ( this .Shape[ this .State, i, j, 0] == 1)

   {

   if (game.GameBox[rowNum][colNum, 0] == 1)

   {

   game.AddBox( this ); 

   return ( true );

   }

   }

 

  }

  }

 

  return ( false );

 

  }

 

  private bool RightEdge(GameCtrl game)

  {

  //判断右侧

  for ( int i = 3; i >= 0; i--)

  {

  int rowNum = this .PositionX + i + 4;

  for ( int j = 0; j < 4; j++)

  {

   int colNum = 22- this .PositionY-j;

 

   if ( this .Shape[ this .State, j, i, 0] == 1)

   {

   if (game.GameBox[colNum][rowNum, 0] == 1)

   {

   return ( false );

   }

   }

  }

 

  }

  return ( true );

 

 

  }

 

  private bool LeftEdge(GameCtrl game)

  {

  //判断左侧

  for ( int i = 0; i < 4; i++)

  {

  int rowNum = this .PositionX + i +2;

  for ( int j = 0; j < 4; j++)

  {

 

   int colNum = 22 - this .PositionY - j;

 

   if ( this .Shape[ this .State, j, i, 0] == 1)

   {

   if (game.GameBox[colNum][rowNum, 0] == 1)

   {

   return ( false );

   }

   }

  }

 

  }

  return ( true );

 

 

  }

 

  private bool CoverEdge(GameCtrl game)

  {

  //判断变行是否有覆盖

  int preState = ( this .State + 1) % 4;

  for ( int i = 0; i < 4; i++)

  {

  int rowNum = this .PositionX + i + 3;

  for ( int j = 0; j < 4; j++)

  {

 

   int colNum = 22 - this .PositionY - j;

 

   if ( this .Shape[preState, j, i, 0] == 1)

   {

   if (game.GameBox[colNum][rowNum, 0] == 1)

   {

   return ( false );

   }

   }

  }

 

  }

  return ( true );

  //return (false);

 

 

  }

  private int [, , ,] LeftLShape = {

   {{{1,1},{0,0},{0,0},{0,0}},

   {{1,1},{0,0},{0,0},{0,0}},

   {{1,1},{1,1},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,1},{1,1},{1,1},{0,0}},

   {{1,1},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{1,1},{1,1},{0,0}},

   {{0,0},{0,0},{1,1},{0,0}},

   {{0,0},{0,0},{1,1},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{1,1},{0,0}},

   {{1,1},{1,1},{1,1},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}}

    };

 

  private int [, , ,] RightLShape = {

   {{{0,0},{0,0},{1,2},{0,0}},

   {{0,0},{0,0},{1,2},{0,0}},

   {{0,0},{1,2},{1,2},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{0,0},{0,0},{0,0}},

   {{1,2},{0,0},{0,0},{0,0}},

   {{1,2},{1,2},{1,2},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,2},{1,2},{0,0},{0,0}},

   {{1,2},{0,0},{0,0},{0,0}},

   {{1,2},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,2},{1,2},{1,2},{0,0}},

   {{0,0},{0,0},{1,2},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}}

 

 

   };

  private int [, , ,] LeftZShape = {

   {{{1,3},{1,3},{0,0},{0,0}},

   {{0,0},{1,3},{1,3},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{1,3},{0,0},{0,0}},

   {{1,3},{1,3},{0,0},{0,0}},

   {{1,3},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,3},{1,3},{0,0},{0,0}},

   {{0,0},{1,3},{1,3},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{1,3},{0,0},{0,0}},

   {{1,3},{1,3},{0,0},{0,0}},

   {{1,3},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}}

   };

 

  private int [, , ,] RightZShape = {

   {{{0,0},{1,4},{1,4},{0,0}},

   {{1,4},{1,4},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,4},{0,0},{0,0},{0,0}},

   {{1,4},{1,4},{0,0},{0,0}},

   {{0,0},{1,4},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{1,4},{1,4},{0,0}},

   {{1,4},{1,4},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,4},{0,0},{0,0},{0,0}},

   {{1,4},{1,4},{0,0},{0,0}},

   {{0,0},{1,4},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}}

   };

 

  private int [, , ,] lShape = {

   {{{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{0,0},{0,0},{0,0}},

   {{1,6},{1,6},{1,6},{1,6}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}},

 

   {{{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}},

   {{1,6},{0,0},{0,0},{0,0}}},

 

   {{{0,0},{0,0},{0,0},{0,0}},

   {{1,6},{1,6},{1,6},{1,6}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}}

   };

  private int [, , ,] TuShape = {

   {{{0,0},{1,7},{0,0},{0,0}},

   {{1,7},{1,7},{1,7},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {{{0,0},{1,7},{0,0},{0,0}},

   {{1,7},{1,7},{0,0},{0,0}},

   {{0,0},{1,7},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {{{0,0},{0,0},{0,0},{0,0}},

   {{1,7},{1,7},{1,7},{0,0}},

   {{0,0},{1,7},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {{{0,0},{1,7},{0,0},{0,0}},

   {{0,0},{1,7},{1,7},{0,0}},

   {{0,0},{1,7},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

   };

  private int [, , ,] TianShape = {

   {

   {{1,5},{1,5},{0,0},{0,0}},

   {{1,5},{1,5},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {

   {{1,5},{1,5},{0,0},{0,0}},

   {{1,5},{1,5},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {

   {{1,5},{1,5},{0,0},{0,0}},

   {{1,5},{1,5},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   },

 

   {

   {{1,5},{1,5},{0,0},{0,0}},

   {{1,5},{1,5},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}},

   {{0,0},{0,0},{0,0},{0,0}}

   }

   };

  }

  class GameCtrl

  {

  public List< int [,]> GameBox = new List< int [,]>();

 

  public int gameSclpe;

 

  public GameCtrl()

  {

  gameSclpe = 0;

  this .InitBox();

  }

  public void InitBox()

  {

  int [,] InitZore = new int [18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },

    { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },

    { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};

 

  int [,] InitOne = new int [18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },

    { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },

    { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 } };

  GameBox.Add(InitOne);

  GameBox.Add(InitOne);

  GameBox.Add(InitOne);

  for ( int Cnt = 0; Cnt < 20; Cnt++)

  GameBox.Add(InitZore);

 

  }

  public void ClrBox()

  {

  GameBox.Clear();

  }

 

  public void AddBox(Square landSquare)

  {

  for ( int i = 0; i < 4; i++)

  {

  int rowNum = 22 - landSquare.PositionY - i;

  int [,] ShapeRow = new int [18, 2];

 

  for ( int j =0;j<18;j++)

  {

   if (GameBox[rowNum][j, 0] == 1)

   {

   ShapeRow[j, 0] = 1;

   ShapeRow[j, 1] = GameBox[rowNum][j, 1];

   }

  }

  for ( int j = 0; j < 4; j++)

  {

 

   int colNum = landSquare.PositionX + j+3;

   if (landSquare.Shape[landSquare.State, i, j, 0] == 1)

   {

   ShapeRow[colNum, 0] = 1;

   ShapeRow[colNum, 1] = landSquare.Shape[landSquare.State, i, j, 1];

 

   }

 

  

  }

  GameBox[rowNum] = ShapeRow;

 

  }

  SubBox();

  }

 

 

  private void SubBox()

  {

  int [,] InitZore = new int [18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },

    { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },

    { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};

  int Cnt;

  for (Cnt = 3; Cnt < 23; Cnt++)

  {

  int ColSum,Cnt2;

  for (ColSum = 0, Cnt2 = 3; Cnt2 < 15;Cnt2++ )

   ColSum += GameBox[Cnt][Cnt2, 0];

  if (ColSum==12)

  {

   this .gameSclpe++;

   GameBox.RemoveAt(3);

   GameBox.Add(InitZore);

   Cnt--;

  }

  }

 

 

  }

 

  public void BoxDraw( ref Graphics dc)

  {

  for ( int Cnt1 = 3; Cnt1 < 23; Cnt1++)

  {

  for ( int Cnt2 = 3; Cnt2 < 15; Cnt2++)

  {

   if (GameBox[Cnt1][Cnt2, 0] == 1)

   {

   SolidBrush Brush;

   switch (GameBox[Cnt1][Cnt2, 1])

   {

   case (1):

   Brush = new SolidBrush(Color.Red);

   break ;

   case (2):

   Brush = new SolidBrush(Color.Blue);

   break ;

   case (3):

   Brush = new SolidBrush(Color.Yellow);

   break ;

   case (4):

   Brush = new SolidBrush(Color.Green);

   break ;

   case (5):

   Brush = new SolidBrush(Color.Tan);

   break ;

   case (6):

   Brush = new SolidBrush(Color.Honeydew);

   break ;

   case (7):

   Brush = new SolidBrush(Color.ForestGreen);

   break ;

   default :

   Brush = new SolidBrush(Color.Red);

   break ;

 

   }

   dc.FillRectangle(Brush, new Rectangle((Cnt2-3)* 16, (22 - Cnt1) * 16, 16, 16));

   }

  }

  }

 

 

  }

  }

 

 

}

更多俄罗斯方块精彩文章请点击专题: 俄罗斯方块游戏集合 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

dy("nrwz");

查看更多关于基于C#实现俄罗斯方块游戏的详细内容...

  阅读:49次