`
isiqi
  • 浏览: 16558308 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

.Net Micro Framework研究—用MF编写俄罗斯方块

阅读更多

上次编写俄罗斯方块,好像是N年前的大学时代,使用TC2.0在DOS平台上开发的,由于当时的代码是保存在3.5寸软盘上的,到现在那些程序早已经作了古,没有了踪影。俄罗斯方块其实编写并不太容易,要考虑的东西还是蛮多的,以前想在PPC上用.Net精简框架集实现,后来起了个头,没有太大的动力,也就作罢了。现在对MF充满了激情,所以从零做起(没有参考任何现成代码,只不过还是依照我早期的思路编写而成),花费我大半天的时间才编写完毕(在编写过程中,还发现MF对二维数组支持不大好,我后面会提到)。

好了,让我们在.Net Micro Framework模拟器(由于我这里没有带LCD屏的MF开发板,所以很遗憾,不知道在实际的设备上该程序的性能会怎样)上体验一下俄罗斯方块游戏吧。
进入MF Windows(姑且这么叫吧),单击“开始”菜单按钮(MF平台不支持鼠标,是单击模拟器上的Menu按钮,或在键盘敲“空格”或“Windows”键),我们用光标键选中“俄罗斯方块”游戏,按OK键(或按键盘上的“回车”键)进入游戏。
通过开始菜单进入“俄罗斯方块”游戏
编写的俄罗斯方块游戏可是具备经典版的所有功能哟!可以翻转,可以移动,可以得分,可以快速降落等等!要认真玩,否则很快就“Game Over”的。
在编写过程中发现MF对二维数组支持不是太好。
下面的代码编译时会报错:
bool[,] bFlag=new bool[10,20];
所以在MF中二维数组必须这样声明才行:
bool[][] bShowFlag = new bool[22][]; //主显示区含边框
for (int i = 0; i < 22; i++)
{
bShowFlag[i] = new bool[12];
}
附:MF俄罗斯方块核心代码
//俄罗斯方块(叶帆工作室: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);
}
}
}
}
分享到:
评论

相关推荐

    Expert .NET Micro Framework

    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 ...

    Microsoft .net micro framework 4.0 SDK 含源码

    5. **文档**:SDK还包含了详细的开发者指南和API参考,帮助开发者了解如何使用.NET Micro Framework的各种功能。 6. **示例代码**:为了加快学习过程,SDK通常会提供一些示例项目,展示如何使用不同的API和功能,...

    Microsoft .NET Micro Framework嵌入式编程(美 汤普逊)

    3. **编程模型**:讲解.NET MF的编程模型,包括基本数据类型、控制结构、异常处理、内存管理等,以及如何使用.NET MF提供的类库服务。 4. **硬件交互**:探讨如何通过.NET MF访问和控制硬件资源,如GPIO(General-...

    《玩转.NET Micro Framework移植-基于STM32F10x处理器》源程序.rar

    《玩转.NET Micro Framework移植-基于STM32F10x处理器》这本书的主题聚焦于将.NET Micro Framework(简称.NET MF)应用到STM32F10x系列微控制器上,这是一个涉及嵌入式系统开发、C#编程以及硬件平台集成的重要技术...

    Microsoft .NET Micro Framework 2.5 SDK

    微软的.NET Micro Framework(简称.NET MF)是一个专为嵌入式设备设计的轻量级.NET运行时环境,它允许开发者使用C#和.NET编程语言来构建和控制低功耗、资源受限的硬件系统。.NET Micro Framework 2.5 SDK是该框架的...

    .Net Micro Framework 移植说明文档

    .Net Micro Framework(.Net MF)是微软为小型设备设计的一个精简版的.NET框架。它不仅继承了.NET的硬件独立性,还提供了两个关键的抽象层:硬件抽象层(HAL)与平台抽象层(PAL),进一步隔离应用程序与硬件细节,...

    .net micro framework file

    .NET Micro Framework(简称.NET MF)是微软开发的一个轻量级.NET框架,主要针对嵌入式设备和物联网(IoT)应用。它提供了基础的.NET编程模型,使得开发者能够使用C#、VB.NET或其他.NET语言来编写高效能的嵌入式程序。...

    Expert .NET Micro Framework(德 Jens Kühner)

    通过阅读《Expert .NET Micro Framework》,开发者可以掌握在资源受限环境中使用.NET Micro Framework开发嵌入式系统的全面技能,从而提高工作效率,创造更多创新的物联网解决方案。同时,这本书对于那些想要深入...

    .NET Micro Framework开发板使用手册(红牛开发板)

    对于红牛开发板上的硬件操作,可以使用.NET MF的System.Device.Gpio命名空间,其中包含了对GPIO端口的管理类,方便直接操作硬件。 在调试阶段,你可以利用开发板上的串行端口连接到计算机,通过串行通信协议如UART...

    .NET Micro Framework Key文件部署说明

    在使用.NET Micro Framework进行开发时,为了确保软件的安全性和合法性,开发者需要对开发板进行注册并获取相应的Key文件(MFKey.bin)。本文档旨在详细介绍如何获取及部署Key文件的过程。 #### 二、获取芯片ID与...

    Windows Embedded从入门到精通系列课程(18):.NET Micro Framework——用模拟器零成本体验MF开发

    它提供了一个基于.NET Framework的编程模型,使得开发者可以使用C#或Visual Basic等高级语言来编写代码,而不是传统的汇编语言或C/C++。NETMF的核心组件包括运行时环境、类库、设备驱动模型和一个可扩展的硬件抽象层...

    .NET Micro Framework for Windows 7(X64) USB驱动安装说明

    .NET Micro Framework(简称.NET MF)是微软开发的一个嵌入式平台,主要面向资源...通过遵循上述步骤,你可以在Windows 7(64位)系统上成功安装并使用.NET Micro Framework的USB驱动,从而进行有效的开发和调试工作。

    expert .net micro framework

    expert .net micro frameworkexpert .net micro frameworkexpert .net micro framework

    GHI .NET Micro Framework培训教材(英文版)

    - **数字输入输出**:介绍了如何使用.NET Micro Framework控制数字输入输出端口,包括LED闪烁示例。 - **中断端口**:解释了中断端口的概念及其在实际编程中的应用。 - **三态端口**:介绍了一种特殊的端口类型——...

    .NET Micro Framework Testing Batch File Generator

    .NET Micro Framework自动化测试工具,需.NET Micro Framework3.0和.NET Micro Framework Test Kit支持...

    Apress - Expert .NET Micro Framework (Apr 2008)

    4. **编程模型**:介绍如何使用.NET MF的类库进行程序设计,包括事件驱动编程、线程管理、内存管理和资源优化。 5. **设备接口**:讨论如何访问和控制硬件设备,如传感器、串行通信和GPIO端口,通过.NET MF提供的...

Global site tag (gtag.js) - Google Analytics