当前方块对象

#region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行
private int[, , ,] Tricks = {{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
},
{
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
},
{
{,,,},
{,,,},
{,,,},
{,,,}
}
}}; #endregion //当前的砖块
public int[,] CurrentTrick = new int[, ]; //CurrentTrickNum当前砖块的数目, CurrentStatusNum当前状态,CurrentColor当前颜色, CurrentX当前x, CurrentY当前y
public int CurrentTrickNum, CurrentStatusNum, CurrentColor, CurrentX, CurrentY; //方块种类
private int TricksNum = ; //方块样式
private int StatusNum = ; //颜色种类
private int ColorNum = ; private Random rand = new Random(); /// <summary>
/// 随机生成方块和状态
/// </summary>
public void BeginTricks()
{
//随机生成砖码和状态码
CurrentTrickNum = rand.Next(, TricksNum);
CurrentStatusNum = rand.Next(, StatusNum);
CurrentColor = rand.Next(, ColorNum);
//分配数组
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
}
}
CurrentX = ;
CurrentY = ;
} /// <summary>
/// 变化方块
/// </summary>
public void ChangeTricks()
{
if (CurrentStatusNum < )
{
CurrentStatusNum++;
}
else
{
CurrentStatusNum = ;
}
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
}
}
} /// <summary>
/// 下落方块
/// </summary>
public void DownTricks()
{
CurrentY++;
} /// <summary>
/// 左移方块
/// </summary>
public void LeftTricks()
{
CurrentX--;
} /// <summary>
/// 右移方块
/// </summary>
public void RightTricks()
{
CurrentX++;
}

Brick

操作类

#region 定义背景
private int[,] bgGraoud ={
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,},
{,,,,,,,,,,,,,}
};
#endregion //定义颜色
private Color[] TrickColor = { Color.Transparent, Color.Red, Color.Blue, Color.Orange, Color.Green }; //Sorce分数
public int Sorce; private Image myImage; private Color backColor; private Brick brick = new Brick(); public TetrisHelper(Image myImage, Color backColor)
{
this.myImage = myImage;
this.backColor = backColor;
} /// <summary>
/// 重新开始
/// </summary>
public void Renew()
{
Sorce = ;
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
bgGraoud[y, x] = ;
}
}
} /// <summary>
/// 随机生成方块和状态
/// </summary>
public void BeginTricks()
{
brick.BeginTricks();
} /// <summary>
/// 变化方块
/// </summary>
public void ChangeTricks()
{
brick.ChangeTricks();
} /// <summary>
/// 检测是否可以向下了
/// </summary>
/// <returns></returns>
private bool CheckIsDown()
{
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
if (brick.CurrentTrick[y, x] == )
{
//超过了背景
if (y + brick.CurrentY + >= )
{
return false;
}
if (x + brick.CurrentX >= )
{
brick.CurrentX = - x;
}
if (bgGraoud[y + brick.CurrentY + , x + brick.CurrentX] >= )
{
return false;
}
}
}
}
return true;
} /// <summary>
/// 下落方块
/// </summary>
public bool DownTricks()
{
if (CheckIsDown())
{
brick.DownTricks();
}
else
{
if (brick.CurrentY == )
{
return false;
}
//下落完成,修改背景
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
if (brick.CurrentTrick[y, x] == )
{
bgGraoud[brick.CurrentY + y, brick.CurrentX + x] = brick.CurrentColor;
}
}
}
CheckSore();
BeginTricks(); }
return true;
} /// <summary>
/// 检测是否可以左移
/// </summary>
/// <returns></returns>
private bool CheckIsLeft()
{
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
if (brick.CurrentTrick[y, x] == )
{
if (x + brick.CurrentX - < )
{
return false;
}
if (bgGraoud[y + brick.CurrentY, x + brick.CurrentX - ] >= )
{
return false;
}
}
}
}
return true;
} /// <summary>
/// 左移方块
/// </summary>
public void LeftTricks()
{
if (CheckIsLeft())
{
brick.LeftTricks();
}
} /// <summary>
/// 检测是否可以右移
/// </summary>
/// <returns></returns>
private bool CheckIsRight()
{
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
if (brick.CurrentTrick[y, x] == )
{
if (x + brick.CurrentX + >= )
{
return false;
}
if (bgGraoud[y + brick.CurrentY, x + brick.CurrentX + ] >= )
{
return false;
}
}
}
}
return true;
} /// <summary>
/// 右移方块
/// </summary>
public void RightTricks()
{
if (CheckIsRight())
{
brick.RightTricks();
}
} public Image Draw()
{
Graphics g = Graphics.FromImage(myImage);
g.Clear(backColor);
for (int bgy = ; bgy < ; bgy++)
{
for (int bgx = ; bgx < ; bgx++)
{
if (bgGraoud[bgy, bgx] > )
{
g.FillRectangle(new SolidBrush(TrickColor[bgGraoud[bgy, bgx]]), bgx * , bgy * , , );
g.DrawRectangle(Pens.White, bgx * , bgy * , , );
}
}
}
//绘制当前的图片
for (int y = ; y < ; y++)
{
for (int x = ; x < ; x++)
{
if (brick.CurrentTrick[y, x] == )
{
g.FillRectangle(new SolidBrush(TrickColor[brick.CurrentColor]), (x + brick.CurrentX) * , (y + brick.CurrentY) * , , );
g.DrawRectangle(Pens.White, (x + brick.CurrentX) * , (y + brick.CurrentY) * , , );
}
}
} return myImage;
} private void CheckSore()
{
for (int y = ; y > -; y--)
{
bool isFull = true;
for (int x = ; x > -; x--)
{
if (bgGraoud[y, x] == )
{
isFull = false;
break;
}
}
if (isFull)
{
//增加积分
Sorce = Sorce + ;
for (int yy = y; yy > ; yy--)
{
for (int xx = ; xx < ; xx++)
{
int temp = bgGraoud[yy - , xx];
bgGraoud[yy, xx] = temp;
}
}
y++;
}
}
}

TetrisHelper

窗体代码

public Form1()
{
InitializeComponent();
} TetrisHelper tetrisHelper; private void Form1_Load(object sender, EventArgs e)
{
//初始化
Image myImage = new Bitmap(panel1.Width, panel1.Height);
tetrisHelper = new TetrisHelper(myImage, panel1.BackColor);
loadGame();
} protected override void OnPaint(PaintEventArgs e)
{
Draw();
base.OnPaint(e);
} private void loadGame()
{
timer1.Interval = ;
tetrisHelper.Renew();
label1.Text = "分数:" + tetrisHelper.Sorce;
tetrisHelper.BeginTricks();
button2.Text = "开始游戏";
this.Focus();
} private void timer1_Tick(object sender, EventArgs e)
{
if (tetrisHelper.DownTricks())
{
Draw();
}
else
{
timer1.Stop();
if (MessageBox.Show("哈哈,你玩玩了", "确认", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
{
loadGame();
}
}
} private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (timer1.Enabled == false)
{
return;
}
if (e.KeyCode == Keys.W)
{
tetrisHelper.ChangeTricks();
Draw();
}
else if (e.KeyCode == Keys.A)
{
tetrisHelper.LeftTricks();
Draw();
}
else if (e.KeyCode == Keys.D)
{
tetrisHelper.RightTricks();
Draw();
}
else if (e.KeyCode == Keys.S)
{
timer1.Stop();
timer1.Interval = ;
timer1.Start();
}
} private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (timer1.Enabled == false)
{
return;
}
if (e.KeyCode == Keys.S)
{
timer1.Stop();
timer1.Interval = ;
timer1.Start();
}
} private void Draw()
{
Image img = tetrisHelper.Draw(); Graphics gg = panel1.CreateGraphics(); gg.DrawImage(img, , );
} private void button2_Click(object sender, EventArgs e)
{
if (button2.Text == "暂停游戏")
{
button2.Text = "开始游戏";
timer1.Stop();
}
else
{
button2.Text = "暂停游戏";
timer1.Start();
}
}

Form1

页面展现

GDI学习之俄罗斯方块续的更多相关文章

  1. GDI学习之俄罗斯方块

    做个玩玩 public Form1() { InitializeComponent(); } #region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行 pr ...

  2. C# GDI+学习笔记1

    —前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...

  3. Delphi7 GDI+学习

    Delphi7自带的绘图有锯齿,所以要学习GDI+ 主要是从这个网站学习 http://www.bianceng.com/Programming/Delphi/201212/34691.htm 相关控 ...

  4. GDI+学习笔记(六)渐变画笔

    刷,顾名思义,它是一样的刷.提请设备,还记得常唱歌曲,"我是一个画家.." 好吧.跑题了. 本系列博客希望尽可能简单的描写叙述每项功能,而不希望把每一个參数都介绍的详具体细,假设须 ...

  5. GDI+学习---2.GDI+编程模式及组成类

    在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(paramet ...

  6. GDI+学习---1.初识GDI+

    ---恢复内容开始--- GDI+: GDI+由一组C++类实现,是对于GDI的继承,GDI+不仅优化了大部分GDI性能而且提供了更多特性.允许应用程序开发者将信息显示在显示器或者打印机上,而无需考虑 ...

  7. GDI+学习笔记

    7.1.1 GDI+概述 GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现, 这套类被称为GDI+的“托管类接口”,GDI+主要提供了以 ...

  8. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

  9. JFinal学习 & Gradle配置续 & Tomcat配置

    接上一篇对Gradle的学习,再用JFinal项目再建一个. 参考了这篇文章:https://my.oschina.net/u/1010578/blog/390094 但是其中没有代码,所以看了这篇  ...

随机推荐

  1. sprint3(第十天)

    因为近期准备四六级考试还有准备期末的作业,任务比较多,所以进度落下了很多,没有完成预期的计划. 燃尽图

  2. ok6410 android driver(8)

    In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...

  3. IT人生思考

    夜已深,心里却十分清醒... 说说,这段时间经历的事情吧.我是一枚IT菜鸟,2014年毕业于武汉软件工程职业学院.大学时代,虽然没翘过课,专业学的也不是特别好.当时也没有想过毕业会从事IT行业.只是想 ...

  4. 面向对象的Javascript(5):继承

    在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScrip ...

  5. ADO.net中常用的对象介绍

    ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation. DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表 ...

  6. javascript中怎样验证密码是否含有特殊符号、数字、大小写字母,长度是否大于6小于12

    今天在温习了一下以前学过的知识,一般常用验证密码是通过正则表达式或是通过ASCII 一.用AscII码来验证

  7. AC自动机---Searching the String

    ZOJ   3228 题目网址:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16401 Description Little ...

  8. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  9. ahjesus js 快速求幂

    /* 快速幂计算,传统计算方式如果幂次是100就要循环100遍求值 快速幂计算只需要循环7次即可 求x的y次方 x^y可以做如下分解 把y转换为2进制,设第n位的值为i,计算第n位的权为x^(2^(n ...

  10. C#6.0语法糖剖析(一)

    1.自动属性默认初始化 使用代码 "; 编译器生成的代码: public class Customer { [CompilerGenerated] private string kBacki ...