当前方块对象

#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. 基于HTML5实现的Heatmap热图3D应用

    Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报.医疗成像.机房温度监控等行业,甚至应用于竞技体育领域的数据分析. 已有众多文章分享了生成Heatmap热图原 ...

  2. SpringMVC核心——视图渲染(包含视图解析)问题

    一.本来想说的是返回值处理问题,但在 SpringMVC 中,返回值处理问题的核心就是视图渲染.所以这里标题叫视图渲染问题. 本来想在上一篇文章中对视图解析进行说明的,但是通过源码发现,它应该算到视图 ...

  3. czxt

    实验三 进程调度模拟程序 1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要 ...

  4. Python好用的网站收集

    第三方Pthon包查找:http://www.lfd.uci.edu/ http://www.cnblogs.com/lanxuezaipiao/p/3543658.html

  5. MVVM(Model-View-View-Model)简单分析(及代码示例)

    项目组,现在用的MVVM(Model-View-View-Model)模式,搞了一个多月,感觉有点明白了.

  6. Ubuntu安装图形桌面

    apt-get直接更新即可 apt-get install ubuntu-desktop

  7. 最全面的jdbcUtils,总有一种适合你

    附加jar包,TxQueryRunner.java文件,dbconfig.properties配置文件(点击链接下载): http://files.cnblogs.com/files/xiaoming ...

  8. rabbitmq+ keepalived+haproxy高可用集群详细命令

    公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...

  9. HTML 块元素

    分为3类 1. 结构块 只能包含块级元素.它们包含结构含义,但没有语义含义,也就是,不能说明内容是什么,只能说明其组织方式. <ol> <ul> <dl> < ...

  10. Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题

    安装完Lync客户端后,运行时Lync客户端时,报出如下错误: [原因解析] Lync客户端没有正确安装CA证书链. [解决办法] 第一种方法:将计算机加入域. 第二种方法:不加入域的处理方法: 1. ...