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

 更新时间:2020年6月25日 11:19  点击:1889

最近在看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));
  }
 }
 }

 
 }
 }

 
}

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

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

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25