基于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));

}

}

}

}

}

}

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

以上是 基于C#实现俄罗斯方块游戏 的全部内容, 来源链接: utcz.com/z/357936.html

回到顶部