当前方块对象

#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. 一个android应用开发的感悟

    对于客户端的开发,以我个人现在的水准,很难进行一个系统的讲解,只能分享下遇到的几个问题点好了! 1:对于tabhost的使用,这个东西真的是过时了:第一个版本,我是用的tabhost确实是很难用,不过 ...

  2. tips javascript(一)

    tips javascript(一) 实现type函数用于识别标准类型和内置对象类型,语法如下: var t = type(obj); function type(o){    if (o === n ...

  3. 使用Spark分析拉勾网招聘信息(二): 获取数据

    要获取什么样的数据? 我们要获取的数据,是指那些公开的,可以轻易地获取地数据.如果你有完整的数据集,肯定是极好的,但一般都很难通过还算正当的方式轻易获取.单就本系列文章要研究的实时招聘信息来讲,能获取 ...

  4. [Solution] ASP.NET Identity(1) 快速入门

    本节将介绍: ASP.NET Identity简介 快速入门 扩展 ASP.NET Identity简介 身份管理在ASP.NET中存在很长世间了,ASP.NET 开发团队已经学会了很多从客户的反馈. ...

  5. MIUI选项框开关样式模拟

    有IOS的开关模拟,当然也有MIUI的开关模拟 看到设置选项里面的开关样式,突发奇想地来试试    最终效果如图: 实现过程 1. 选项框checkbox 模拟开关当然需要一个选项框,这里用到了复选框 ...

  6. 在android设备上调试ionic应用

    方法1: ionic run android -l -c 将会在console中输出日志信息 方法2: (1).使用usb连接android设备,并打开android设备的调试功能 (2).在chro ...

  7. 很震撼的HTML5视频播放器,电影院的感觉

    效果很震撼!有电影院的感觉了.呵呵. 看了下代码,依然是 在一个canvas里嵌入<video>然后getImageData 点击这里查看效果 代码: var canvas = docum ...

  8. Win7如何部署apache服务器(包括SSL设置)

    部署普通站点 1.首先下载apache24版本,下载地址为http://pan.baidu.com/s/1pLmvDgB; 2.解压到你的电脑本地目录,如D:\Apache24(下文配置都会以当前目录 ...

  9. 10个出色的NoSQL数据库

    http://www.infoq.com/research/nosql-databases?utm_source=infoqresearch&utm_campaign=lr-homepage ...

  10. Studio for WPF:定制 C1WPFChart 标记

    在本篇文章中,我们将阐述如何定制 C1WPFChart 数据点的标记. 下面分步讲解实现: 1.定制自定义样式: 1: <Window.Resources> 2: <Style x: ...