上次编写俄罗斯方块,好像是N年前的大学时代,使用TC2.0在DOS平台上开发的,由于当时的代码是保存在3.5寸软盘上的,到现在那些程序早已经作了古,没有了踪影。俄罗斯方块其实编写并不太容易,要考虑的东西还是蛮多的,以前想在PPC上用.Net精简框架集实现,后来起了个头,没有太大的动力,也就作罢了。现在对MF充满了激情,所以从零做起(没有参考任何现成代码,只不过还是依照我早期的思路编写而成),花费我大半天的时间才编写完毕(在编写过程中,还发现MF对二维数组支持不大好,我后面会提到)。
好了,让我们在.Net Micro Framework模拟器(由于我这里没有带LCD屏的MF开发板,所以很遗憾,不知道在实际的设备上该程序的性能会怎样)上体验一下俄罗斯方块游戏吧。
进入MF Windows(姑且这么叫吧),单击“开始”菜单按钮(MF平台不支持鼠标,是单击模拟器上的Menu按钮,或在键盘敲“空格”或“Windows”键),我们用光标键选中“俄罗斯方块”游戏,按OK键(或按键盘上的“回车”键)进入游戏。
//俄罗斯方块(叶帆工作室:http://blog.csdn.net/yefanqiu)
public class ElsGame
{
int Current_Y = -2, Current_X =3;
int intGrade = 0;
bool[][] bShowFlag = new bool[22][]; //主显示区含边框
bool[][] bMetaShowFlag = new bool[4][]; //下一个方块显示区
bool[][] bCurrentMetaShowFlag = new bool[4][]; //当前方块显示区
int intNextNo = 0; //下一个方块索引
int intCurrentNo = 0; //当前方块索引
enum MoveWay{Left,Down,Right};
DispatcherTimer GameTimer; //游戏时钟
bool bGameRunFlag = false; //游戏运行标志
public ElsGame(DispatcherTimer GameTimer)
{
this.GameTimer = GameTimer;
Init();
}
//元素
private bool[][] GetElsMeta(int intNo)
{
bool[][] ElsMetaFlag = new bool[4][];
for (int i = 0; i < 4; i++)
{
ElsMetaFlag[i] = new bool[4];
}
switch (intNo)
{
case 0: //田
ElsMetaFlag[1][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[2][2] = true;
return ElsMetaFlag;
case 1://-
ElsMetaFlag[2][0] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[2][3] = true;
return ElsMetaFlag;
case 2: //|
ElsMetaFlag[0][2] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[3][2] = true;
return ElsMetaFlag;
case 3: //┻
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[2][3] = true;
return ElsMetaFlag;
case 4: //┣
ElsMetaFlag[2][2] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[3][1] = true;
return ElsMetaFlag;
case 5: //┳
ElsMetaFlag[2][2] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[1][3] = true;
return ElsMetaFlag;
case 6: //┫
ElsMetaFlag[2][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[3][2] = true;
return ElsMetaFlag;
case 7: //┖
ElsMetaFlag[3][2] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[3][1] = true;
return ElsMetaFlag;
case 8: //┍
ElsMetaFlag[2][1] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[1][3] = true;
return ElsMetaFlag;
case 9: //┒
ElsMetaFlag[1][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[3][2] = true;
return ElsMetaFlag;
case 10: //┙
ElsMetaFlag[1][3] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[2][3] = true;
return ElsMetaFlag;
case 11: //┕
ElsMetaFlag[1][1] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[2][3] = true;
return ElsMetaFlag;
case 12: //┎
ElsMetaFlag[1][2] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[2][1] = true;
ElsMetaFlag[3][1] = true;
return ElsMetaFlag;
case 13: //┑
ElsMetaFlag[2][3] = true;
ElsMetaFlag[1][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[1][3] = true;
return ElsMetaFlag;
case 14: //┚
ElsMetaFlag[3][1] = true;
ElsMetaFlag[1][2] = true;
ElsMetaFlag[2][2] = true;
ElsMetaFlag[3][2] = true;
return ElsMetaFlag;
}
return null;
}
//翻转
private int GetTurnMeta(int intNo)
{
switch (intNo)
{
case 0: //田
return 0;
case 1://-
return 2;
case 2: //|
return 1;
case 3: //┻
return 4;
case 4: //┣
return 5;
case 5: //┳
return 6;
case 6: //┫
return 3;
case 7: //┖
return 8;
case 8: //┍
return 9;
case 9: //┒
return 10;
case 10: //┙
return 7;
case 11: //┕
return 12;
case 12: //┎
return 13;
case 13: //┑
return 14;
case 14: //┚
return 11;
}
return intNo;
}
//初始化
public void Init()
{
if (!bGameRunFlag)
{
//主显示区
for (int i = 0; i < 22; i++)
{
bShowFlag[i] = new bool[12];
for (int j = 0; j < 12; j++)
{
if (i == 21 || j == 0 || j == 11)
{
bShowFlag[i][j] = true;
}
else
{
bShowFlag[i][j] = false;
}
}
}
//辅助显示区
for (int i = 0; i < 4; i++)
{
bMetaShowFlag[i] = new bool[4];
for (int j = 0; j < 4; j++)
{
bMetaShowFlag[i][j] = false;
}
}
//方块初始化
Microsoft.SPOT.Math.Randomize();
intCurrentNo = Microsoft.SPOT.Math.Random(15);
bCurrentMetaShowFlag = GetElsMeta(intCurrentNo);
intNextNo = Microsoft.SPOT.Math.Random(15);
bMetaShowFlag = GetElsMeta(intNextNo);
//时钟开始
GameTimer.Start();
//积分清零
intGrade = 0;
//游戏运行标志
bGameRunFlag = true;
}
}
//下降
public bool DoDownMove()
{
if (IsMove(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Down) && bGameRunFlag)
{
Current_Y++;
MoveBlock(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Down);
}
else
{
//时钟恢复正常
GameTimer.Interval = new TimeSpan(0, 0, 1);
//判断是否得分及游戏是否结束
int intRet=GetGameState() ;
if (intRet == -1)
{
GameTimer.Stop();
bGameRunFlag = false;
//主显示区
for (int i = 0; i < 22; i++)
{
bShowFlag[i] = new bool[12];
for (int j = 0; j < 12; j++)
{
if (i==1 || i == 20 || j == 1 || j == 10)
{
bShowFlag[i][j] = true;
}
else
{
bShowFlag[i][j] = false;
}
}
}
}
else
{
intGrade += intRet;
Current_Y = -3;
Current_X = 3;
NextBlock();
}
}
return true;
}
//判断游戏状态
private int GetGameState()
{
bool bFlag = false;
int intNum = 0;
//判断游戏是否结束
for (int i = 1; i < 11; i++)
{
if (bShowFlag[1][i])
{
return -1;
}
}
//判断得分
for (int i = 1; i < 21; i++)
{
bFlag = true;
for (int j = 1; j < 11; j++)
{
if (!bShowFlag[i][j]) bFlag = false;
}
if (bFlag)
{
//移动数组
for (int e = i; e>0; e--)
{
for (int k = 1; k < 11; k++)
{
bShowFlag[e][k] =bShowFlag[e-1][k];
}
}
intNum++;
}
}
switch (intNum)
{
case 1:
intNum = 100;
break;
case 2:
intNum = 300;
break;
case 3:
intNum = 500;
break;
case 4:
intNum = 800;
break;
}
return intNum;
}
//左移
public bool DoLeftMove()
{
if (!bGameRunFlag) return false;
if (IsMove(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Left))
{
Current_X--;
MoveBlock(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Left);
return true;
}
return false;
}
//右移
public bool DoRightMove()
{
if (!bGameRunFlag) return false;
if (IsMove(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Right))
{
Current_X++;
MoveBlock(Current_X, Current_Y, bCurrentMetaShowFlag, MoveWay.Right);
return true;
}
return false;
}
//方块翻转
public bool DoTurn()
{
if (!bGameRunFlag) return false;
#region //判断是否能翻转
int mX=0, mY = 0;
bool bFlag = true;
//翻转后的标志
bool[][] bFlags = GetElsMeta(GetTurnMeta(intCurrentNo));
SetBlock(Current_X, Current_Y, bCurrentMetaShowFlag, false);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
mX = Current_X + j + 1;
mY = Current_Y + i + 1;
if (mX > -1 && mX < 12 && mY > -1 && mY < 22)
{
if (bShowFlag[mY][mX] && bFlags[i][j])
{
bFlag = false;
}
}
}
}
SetBlock(Current_X, Current_Y, bCurrentMetaShowFlag, true);
#endregion
if (bFlag)
{
SetBlock(Current_X, Current_Y, bCurrentMetaShowFlag, false);
intCurrentNo = GetTurnMeta(intCurrentNo);
bCurrentMetaShowFlag = GetElsMeta(intCurrentNo);
SetBlock(Current_X, Current_Y, bCurrentMetaShowFlag, true);
return true;
}
return false;
}
//设置方块
private void SetBlock(int X, int Y, bool[][] bFlags, bool bFlag)
{
略;-)
}
//下一个方块
private void NextBlock()
{
intCurrentNo = intNextNo;
bCurrentMetaShowFlag = bMetaShowFlag;
intNextNo = Microsoft.SPOT.Math.Random(15);
bMetaShowFlag = GetElsMeta(intNextNo);
}
//移动方块
private void MoveBlock(int X, int Y, bool[][] bFlags,MoveWay mw)
{
switch (mw)
{
case MoveWay.Left:
SetBlock(X+1, Y, bCurrentMetaShowFlag, false);
SetBlock(X, Y, bCurrentMetaShowFlag, true);
break;
case MoveWay.Down:
SetBlock(X, Y - 1, bCurrentMetaShowFlag, false);
SetBlock(X, Y, bCurrentMetaShowFlag, true);
break;
case MoveWay.Right:
SetBlock(X-1, Y, bCurrentMetaShowFlag, false);
SetBlock(X, Y, bCurrentMetaShowFlag, true);
break;
default:
break;
}
}
//是否可以移动
private bool IsMove(int X, int Y, bool[][] bFlags, MoveWay mw)
{
略 ;-)
}
//绘制
public void Draw(DrawingContext dc)
{
int BarTop = 26;
int BarHeight = SystemMetrics.ScreenHeight - BarTop * 2;
dc.DrawRectangle(new SolidColorBrush(Colors.Gray), new Pen(Colors.Gray), 0, BarTop, SystemMetrics.ScreenWidth, BarHeight);
//主显示区
dc.DrawRectangle(new SolidColorBrush(Colors.Black), new Pen(Colors.White), 79, BarTop + 3, 92, 182);
//辅助显示区
dc.DrawRectangle(new SolidColorBrush(Colors.Black), new Pen(Colors.White), 222,120, 38, 38);
//积分区
dc.DrawRectangle(new SolidColorBrush(Colors.White), new Pen(Colors.Blue), 205, 180, 74, 20);
dc.DrawText(intGrade.ToString(), YFWinApp.YFFont,ColorUtility.ColorFromRGB(0,120,0), 224 + 17 - intGrade.ToString().Length * 3, 184);
//显示
DrawEls(80, BarTop + 4, 9, 9, dc);
//结束
if (!bGameRunFlag)
{
dc.DrawText("Game Over!", YFWinApp.YFFont, Colors.Red,96, 110);
}
}
//显示方块
private void DrawEls(int X,int Y,int Width,int Height,DrawingContext dc)
{
SolidColorBrush sb=new SolidColorBrush(Colors.Green);
Pen pen=new Pen(Colors.Blue);
//主显示区
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 10; j++)
{
if(bShowFlag[i+1][j+1])
dc.DrawRectangle(sb, pen, X +j * Width, Y + i * Height, Width, Height);
}
}
//辅助显示区
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if(bMetaShowFlag[i][j])
dc.DrawRectangle(sb, pen,223 + j * Width, 121 + i * Height, Width, Height);
}
}
}
}
相关推荐
The Microsoft .NET Micro Framework is a small and efficient .NET runtime environment used to run managed code on devices that are too small and resource constrained for Windows CE and the Compact ...
5. **文档**:SDK还包含了详细的开发者指南和API参考,帮助开发者了解如何使用.NET Micro Framework的各种功能。 6. **示例代码**:为了加快学习过程,SDK通常会提供一些示例项目,展示如何使用不同的API和功能,...
3. **编程模型**:讲解.NET MF的编程模型,包括基本数据类型、控制结构、异常处理、内存管理等,以及如何使用.NET MF提供的类库服务。 4. **硬件交互**:探讨如何通过.NET MF访问和控制硬件资源,如GPIO(General-...
《玩转.NET Micro Framework移植-基于STM32F10x处理器》这本书的主题聚焦于将.NET Micro Framework(简称.NET MF)应用到STM32F10x系列微控制器上,这是一个涉及嵌入式系统开发、C#编程以及硬件平台集成的重要技术...
微软的.NET Micro Framework(简称.NET MF)是一个专为嵌入式设备设计的轻量级.NET运行时环境,它允许开发者使用C#和.NET编程语言来构建和控制低功耗、资源受限的硬件系统。.NET Micro Framework 2.5 SDK是该框架的...
.Net Micro Framework(.Net MF)是微软为小型设备设计的一个精简版的.NET框架。它不仅继承了.NET的硬件独立性,还提供了两个关键的抽象层:硬件抽象层(HAL)与平台抽象层(PAL),进一步隔离应用程序与硬件细节,...
.NET Micro Framework(简称.NET MF)是微软开发的一个轻量级.NET框架,主要针对嵌入式设备和物联网(IoT)应用。它提供了基础的.NET编程模型,使得开发者能够使用C#、VB.NET或其他.NET语言来编写高效能的嵌入式程序。...
通过阅读《Expert .NET Micro Framework》,开发者可以掌握在资源受限环境中使用.NET Micro Framework开发嵌入式系统的全面技能,从而提高工作效率,创造更多创新的物联网解决方案。同时,这本书对于那些想要深入...
对于红牛开发板上的硬件操作,可以使用.NET MF的System.Device.Gpio命名空间,其中包含了对GPIO端口的管理类,方便直接操作硬件。 在调试阶段,你可以利用开发板上的串行端口连接到计算机,通过串行通信协议如UART...
在使用.NET Micro Framework进行开发时,为了确保软件的安全性和合法性,开发者需要对开发板进行注册并获取相应的Key文件(MFKey.bin)。本文档旨在详细介绍如何获取及部署Key文件的过程。 #### 二、获取芯片ID与...
它提供了一个基于.NET Framework的编程模型,使得开发者可以使用C#或Visual Basic等高级语言来编写代码,而不是传统的汇编语言或C/C++。NETMF的核心组件包括运行时环境、类库、设备驱动模型和一个可扩展的硬件抽象层...
.NET Micro Framework(简称.NET MF)是微软开发的一个嵌入式平台,主要面向资源...通过遵循上述步骤,你可以在Windows 7(64位)系统上成功安装并使用.NET Micro Framework的USB驱动,从而进行有效的开发和调试工作。
expert .net micro frameworkexpert .net micro frameworkexpert .net micro framework
- **数字输入输出**:介绍了如何使用.NET Micro Framework控制数字输入输出端口,包括LED闪烁示例。 - **中断端口**:解释了中断端口的概念及其在实际编程中的应用。 - **三态端口**:介绍了一种特殊的端口类型——...
.NET Micro Framework自动化测试工具,需.NET Micro Framework3.0和.NET Micro Framework Test Kit支持...
4. **编程模型**:介绍如何使用.NET MF的类库进行程序设计,包括事件驱动编程、线程管理、内存管理和资源优化。 5. **设备接口**:讨论如何访问和控制硬件设备,如传感器、串行通信和GPIO端口,通过.NET MF提供的...