嵌入式课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
仲恺农业工程学院嵌入式课程设计报告
基于Linux下mono平台的俄罗斯方块游戏
学院:信息科学与技术学院
班级:电子信息工程111班
姓名:左林雄1
梁亚琦0
官镇洲1
指导老师:肖明明
前言
众所周知,C#是在Microsoft推出的.NET语言,只在.NET 平台上运行,例如Win 9x﹑ME﹑NT﹑2000﹑XP和Win CE之类的操作系统。
但是,现在却有一个叫做Mono的项目,它的目标就是把.NET及其编程语言移植到非Windows平台上。
而C#是目前为止唯一被移植到非Windows平台的.NET语言。
在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个最根本的需求是库、编译器/解释器、运行环境。
库以类和方法(函数)的形式提供常用的例程,简化大型程序的编写。
.NET框架也不例外,包含了许多类库。
另外,把程序转换成可执行形式以及运行执行文件时,编译器和运行环境是必不可少的。
Mono软件包包含了.NET类库的一部分、一个C#编译器和.NET运行环境CLR(mon Language Runtime,公共语言运行时环境)。
Mono声称支持Linux、Solaris、Free BSD和MS Windows;除了Intel x86系列的CPU(486,各类Pentium等)之外,据说还要支持Sparc、PowerPC和StrongArm处理器。
设计概述:
一.linux下mono的平台搭建过程
1.构建编译环境
2.安装libgdiplus、mono以及编译环境所需要的其它库文件
3.安装Libgdiplus和Mono
二.在Windows下游戏功能的实现
1.游戏界面设计
2.配置界面设计
3.砖块样式界面设计
三.设计心得
项目介绍:
本设计是基于跨平台的程序编译功能的实现基础上进行的,在实现功能之前,首先要测试实验平台的稳定性与可操作性。
因此品台的搭建对于功能的实现是必不可少的。
环境搭建过程:
sudo apt-get install build-essential
sudo apt-get install automake autoconf
sudo apt-get install bison gettext libtool libglib2.0-dev libfreetype6-dev libfontconfig-dev
以上完成对mono源文件的编译安装。
我们应该知道要想实现程序的完整功能,仅有的编译器是不够的,因此在此基础之上我们还要安装一些实现编译过程的依赖:sudo apt-get install libgif-dev libtiff4-dev libpng12-dev libexif-dev libx11-dev libxft-dev
libjpeg62-dev(或libgpeg-dev)
安装过程:
1、安装libgdiplus
cd libgdiplus-2.10
./configure --prefix=/usr
make
sudo make install
cd ..
2、安装Mono
cd mono-3.0.12
./configure --prefix=/usr
make
sudo make install
cd ..
平台测试:
在Linux文本编辑器中输入下面的内容,把文件保存为HelloMono.cs:
class HelloMono
{
public static void Main(string[ ] args)
{ System.Console.WriteLine("Hello Mono");
}
}
执行下面的命令编译C#文件:
mcs HelloMono.cs
mcs是Mono的C#命令行编译器。
与MS .NET SDK的csc编译器相似,mcs也有很多命令行选项。
上面的命令将生成可执行文件HelloMono.exe。
注意这个执行文件不是Linux执行文件,而是一个.NET 执行文件,或者说,这个文件的可执行代码形式是中间语言(IL,Intermediate Language)。
要运行这个执行文件,必须执行如下命令:mono HelloMono.exe
Linux控制台上将显示出"Hello Mono"。
下面开始俄罗斯方块的功能实现:
1.游戏界面总体效果图
2.配置窗口总体效果
3.砖块样式效果图
代码(主要)实现过程:
一.砖块样式配置
bel控件(lblMode)
点击“事件”,选择“Paint”Graphics gp=e.Graphics;
gp.Clear(Color.Black);
Pen p=new Pen(Color.White);
for (int i=31;i<155;i=i+31)
gp.DrawLine(p,1,i,155,i);
for (int i=31;i<155;i=i+31)
gp.DrawLine(p,i,1,i,155);
SolidBrush s=new SolidBrush(blockColor); for (int x=0;x<5;x++)
{
for(int y=0;y<5;y++)
{
if(struArr[x,y])
{gp.FillRectangle(s,31*x+1,31*y+1,30,30);}}}
点击“事件”,选择“MouseClick”
private bool[,] struArr=new bool[5,5];
private Color blockColor=Color.Red;
-------------------------------------------------------- if (e.Button!=MouseButtons.Left)
return;
int xPos,yPos;
xPos=e.X/31;
yPos=e.Y/31;
struArr[xPos,yPos]=!struArr[xPos,yPos];
bool b=struArr[xPos,yPos];
Graphics gp=lblMode.CreateGraphics();
SolidBrush s=new SolidBrush(b ? blockColor:Color.Black);
gp.FillRectangle(s,31*xPos+1,31*yPos+1,30,30);
gp.Dispose();
添加ColorDialog控件
添加label(lblColor)控件
点击“事件”,选择“click”
colorDialog1.ShowDialog();
blockColor=colorDialog1.Color;
lblColor.BackColor=colorDialog1.Color;
lblMode.Invalidate();
III.添加listView控件(lsvBlockSet)
点击“事件”,选择“ItemSelectionChanged”
if (e.IsSelected)
{
blockColor=Color.FromArgb(int.Parse(e.Item.SubItems[1].Text)); lblColor.BackColor=blockColor;
string s=e.Item.SubItems[0].Text;
for(int i=0;i<s.Length;i++)
{struArr[i/5,i%5]=(s[i]=='1')?true:false;}
lblMode.Invalidate();
}
IV.“Add”按钮(btnAdd)bool isEmpty=false;
foreach (bool i in struArr)
{if(i)
{
isEmpty=true;
break;
}
}
if (!isEmpty)
{
MessageBox.Show("Patternis empty,pleaseclick onthe left side ofthe windowwith the mouseto drawa pattern!","Prompt form",
MessageBoxButtons.OK,
rmation);
return;
}
StringBuilder sb=new StringBuilder(25);
foreach (bool i in struArr)
{sb.Append(i?"1":"0");
}
string blockString=sb.ToString();
foreach(ListViewItem item in lsvBlockSet.Items)
{if (item.SubItems[0].Text==blockString)
{
MessageBox.Show("The pattern already exists!","Prompt window",
MessageBoxButtons.OK,
rmation);
return;
}
}
ListViewItem myItem=new ListViewItem();
myItem=lsvBlockSet.Items.Add(blockString);
myItem.SubItems.Add(Convert.ToString(blockColor.ToArgb()));
V.“Delete”按钮(btnDel)
if(lsvBlockSet.SelectedItems.Count==0)
{
MessageBox.Show("Please select an item to delete in the right window!","Prompt window", MessageBoxButtons.OK,
rmation);
return;
}
lsvBlockSet.Items.Remove(lsvBlockSet.SelectedItems[0]);
btnClear.PerformClick();
VI.“Clear”(btnClear)
for (int x=0;x<5;x++)
{
for(int y=0;y<5;y++)
{struArr[x,y]=false;}
}
lblMode.Invalidate();
VII.“Update”(btnUpdate)
if(lsvBlockSet.SelectedItems.Count==0)
{
MessageBox.Show("Please select an entry to be modified in the right window!","Prompt window", MessageBoxButtons.OK,
rmation);
return;
}
bool isEmpty=false;
foreach (bool i in struArr)
{
if(i)
{
isEmpty=true;
break;
}
}
if (!isEmpty)
{
MessageBox.Show("
MessageBox.Show("Patternis empty,pleaseclick onthe left side ofthe windowwith the mouseto drawa pattern!","Prompt form",
MessageBoxButtons.OK,
rmation);
return;
}
StringBuilder sb=new StringBuilder(25);
foreach (bool i in struArr)
{
sb.Append(i?"1":"0");
}
lsvBlockSet.SelectedItems[0].SubItems[0].Text=sb.ToString();
lsvBlockSet.SelectedItems[0].SubItems[1].Text=Convert.ToString(blockColor.ToArgb());
参数配置
I.添加GroupBox1控件(gbKeySet)“键盘设置”
i.拖入六个label控件
ii.拖入六个TextBox控件(改名)
全部选中,选择“事件”,选择“KeyDown”
if((e.KeyValue>=33 && e.KeyValue<=36)||(e.KeyValue>=45 && e.KeyValue<=46)||
(e.KeyValue>=48 && e.KeyValue<=57)||(e.KeyValue>=65 && e.KeyValue<=90)||
(e.KeyValue>=96 && e.KeyValue<=107)||(e.KeyValue>=109 && e.KeyValue<=111)||
(e.KeyValue>=186 && e.KeyValue<=192)||(e.KeyValue>=219 && e.KeyValue<=222))
{foreach(Control c in gbKeySet.Controls)
{Control TempC=c as TextBox;
if(TempC!=null &&((TextBox)TempC).Text!="")
{if(((int)((TextBox)TempC).Tag)==e.KeyValue)
{((TextBox)TempC).Text="";
((TextBox)TempC).Tag=Keys.None;}}}
((TextBox)sender).Text=e.KeyCode.ToString();
((TextBox)sender).Tag=(Keys)e.KeyValue;}
II.添加GroupBox2控件(gbEnvironmentSet)“环境设置”
i.拖入四个label控件
ii.拖入三个TextBox控件(改名)
一个label控件(lblBackColor)
选择“事件”,选择“click”
colorDialog1.ShowDialog();
lblBackColor.BackColor=colorDialog1.Color;
多个砖块信息类
解决方案中添加InfoArr.cs类
各个方块信息类
private ArrayList info = new ArrayList();
private int _length=0;
public int Length//长度
{get
{return _length;}}
public BlockInfo this[int index]//砖块信息
{get
{return (BlockInfo)info[index];}}
public string this[string id]//
{set
{if(value =="")
{return;}
for(int i=0;i<info.Count;i++)
{if(((BlockInfo)info[i]).GetIdStr()==id)
{try
{((BlockInfo)info[i]).BColor=Color.FromArgb(Convert.ToInt32(value));}
catch(System.FormatException)
{MessageBox.Show("Brick style information is not legal!?Please delete BlockSet.xml file and restart the program","Error message!",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}}}} }
二:新建配置类
I.私有变量属性
#region 私有变量相应的属性
public Keys DownKey//向下方向键
{get
{return _downKey;}
set
{_downKey=value;}}
public Keys DropKey//直接放下键
{get
{return _dropKey;}
set
{_dropKey=value;}}
public Keys MoveLeftKey//左移键
{get
{return _moveLeftKey;}
set
{_moveLeftKey=value;}}
public Keys MoveRightKey//右移键
{get
{return _moveRightKey;}
set
{_moveRightKey=value;}}
public Keys DeasilRotateKey//顺时针旋转
{get
{return _deasilRotateKey;}
set
{_deasilRotateKey=value;}}
public Keys ContraRotateKey//逆时针旋转
{get
{return _contraRotateKey;}
set
{_contraRotateKey=value;}}
Ⅱ.把信息保存为xml文件
public void SaveToXmlFile() //把信息保存为xml文件{
XmlDocument doc =new XmlDocument();
doc.LoadXml("<BlockSet></BlockSet>");
XmlNode root=doc.SelectSingleNode("BlockSet");
for(int i=0;i<info.Length;i++)
{
XmlElement xelType=doc.CreateElement("Type"); XmlElement xelID=doc.CreateElement("ID");
xelID.InnerText=((BlockInfo)info[i]).GetIdStr(); xelType.AppendChild(xelID);
XmlElement xelColor=doc.CreateElement("Color"); xelColor.InnerText=((BlockInfo)info[i]).GetColorStr(); xelType.AppendChild(xelColor);
root.AppendChild(xelType);
}
三.新建方块类
解决方案中添加Block.cs类
protected Point[] structArr;
protected int _xPos;
protected int _yPos;
protected Color _blockColor;
protected Color disapperColor;
protected int rectPix;
public Block()
{}
public Block(Point[] sa, Color bColor, Color dColor, int pix) {_blockColor=bColor;
disapperColor=dColor;
rectPix=pix;
structArr=sa;}
public Point this[int index]//声明一个坐标索引
{get
{return structArr[index];}}
public int Length
{get
{return structArr.Length;}}
--------------------------------
public void DeasilRotate()//顺时针旋转
{int temp;
for(int i=0;i<structArr.Length;i++)
{temp=structArr[i].X;
structArr[i].X=structArr[i].Y;
structArr[i].Y=-temp;}
public void ContraRotate()//逆时针旋转
{int temp;
for(int i=0;i<structArr.Length;i++)
{temp=structArr[i].X;
structArr[i].X=-structArr[i].Y;
structArr[i].Y=temp;}}
private Rectangle PointToRect(Point p)//坐标点转化为画布坐标值{return new Rectangle((_xPos + p.X)*rectPix+1,
(_yPos-p.Y)*rectPix+1,
rectPix-2,
rectPix-2);}
public virtual void Paint(Graphics gp)//制定画板下绘制砖块{SolidBrush sb=new SolidBrush(_blockColor);
foreach(Point p in structArr)
{lock(gp)
{gp.FillRectangle(sb,PointToRect(p));}}}
public void erase(Graphics gp)//擦除矩形
{SolidBrush sb=new SolidBrush(disapperColor);
foreach(Point p in structArr)
{lock(gp)
{gp.FillRectangle(sb,PointToRect(p))}}}
四.游戏运行窗体的设计
解决方案中添加FrmTeris窗体
I.PictureBox控件(pbRun)
点击“事件”,选择“paint”,调用palette中相应的方法
bel控件(lblReady)
点击“事件”,选择“paint”,调用palette中相应的方法
III.添加Panel控件
IV.“Start”按钮(btnStart)
if(p !=null)
{p.Close();}
p=new Palette(paletteWidth,paletteHeight,rectPix,paletteColor, Graphics.FromHwnd(pbRun.Handle),
Graphics.FromHwnd(lblReady.Handle));
p.Start();
VII.“Pause”按钮(btnPause)
if(p==null)
{return;}
if(btnPause.Text=="pause")
{p.Pause();
btnPause.Text="continue";}
else
{p.EndPause();
btnPause.Text="pause";}
VIII.“Config”按钮(btnConfig)
if(btnPause.Text=="")
{btnPause.PerformClick(); }
using(FrmConfig frmConfig=new FrmConfig()) {frmConfig.ShowDialog();}
五.将windows下的程序移植到linux下运行
运行结果截图:
设计心得:
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着网络在人们生活中的运用越来越广泛和嵌入式技术在日常生活中的地位日益凸显。
这对我们这些学习有关网络以及计算机专业的学生来说既是一种挑战,又是一种难得的机会。
这次课程设计,我们不仅运用了所学嵌入式课程的基本知识,而且也将我们近期内对本专业的一些编程方面知识的学习和一些项目内容糅合到里面。
尽管在这次项目的过程中遇到了不少的困难,但是我们小组分工明确,每位组员对自己分工X围内的问题竭尽全力去解决,尤其是组员在编程方面遇到的问题,进行了很好的学习,这不仅将我们一个学期以来所学内容进行了很好的回顾,而且也很好的对我们专业的前景进行了很好的预热。
总体上看,这次课程设计使我们自身的知识丰富了不少,但同时也发现了自身的不足之处。
例如在动手方面,和知识融合方面,不能与实践相结合。
软件操作不够熟练,不能灵活运用。
也使我们了解要学好理论知识才能很好地与实践相结合,才能熟练地运用到生活中
去。