




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于C#的五子棋游戏开发(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)
基于C#的五子棋游戏开发(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)青岛理工大学琴岛学院设计报告课题名称:基于C#的五子棋游戏开发学院:计算机工程系专业班级:计科(专升本)14-21学号:20140371006学生:指导教师:青岛理工大学琴岛学院教务处2015年12月18日学生指导教师课题名称基于C#的五子棋游戏开发设计时间2015。11.23—2015.12。18设计地点动漫1设计目的课程设计的目的就是培养学生的理论联系实际的能力。通过课程设计,使得学生能够加深对讲授内容的理解、累积经验、学会独立上机调试程序;并且逐步达到综合运用网页相关知识,真正掌握。NET技术的精华,从而达到熟练应用程序设计语言的目的.也为将来做较大的系统打下坚实基础。通过本次课程设计,应该达到以下教学任务:巩固所学知识,培养学生的上机实践能力以及独立调试程序的能力,更主要的是使学生了解做项目的大体流程.每一个小组制定一题,项目成员要在项目经理的带领下,完成项目的所有内容.重点掌握ASP。NET网站设计开发流程,界面要友好,功能齐全,完成一个综合项目。指导教师评语系部教研室意见一、需求分析1.选题:通过学习window窗体应用程序的开发与实现,对C#程序开发逐渐产生了浓厚的兴趣,心中有了设计游戏的想法,通过学习和查资料慢慢对游戏制作有了一定的了解,后来通过深入学习,对五子棋游戏设计有了进一步了解,慢慢理清了其中的开发过程与原理,最终确定了基于C#五子棋游戏的设计与实现项目。2.界面:(1)通过上网学习,对游戏界面风格有了一定的认知,于是决定走界面美观风。手游中的主界面给人一种简单明了的感觉,通常有模式关卡,让玩家越玩越带感,于是决定模仿它们,游戏主界面有四个模式,玩家可以选择不同模式进行对弈。如图1所示:模式四模式三模式二模式一模式四模式三模式二模式一图1。主界面(2)游戏模式一,双人对战模式。界面右侧有悔棋、返回、排行榜、关于、重新开始等功能按钮,点击各按钮,执行各功能。如图2所示:棋盘棋盘关于按钮排行榜按钮悔棋按钮返回按钮重新开始按钮n关于按钮排行榜按钮悔棋按钮返回按钮重新开始按钮n图2.模式一界面(3)游戏模式二,人机对战模式。游戏界面中左部是棋盘,悔棋、返回、排行榜、关于、重新开始等功能按钮,此模式实现了人和电脑的交互。如图3所示:棋盘棋盘关于按钮排行榜按钮悔棋按钮返回按钮重新开始按钮n关于按钮排行榜按钮悔棋按钮返回按钮重新开始按钮n图3.模式二界面(4)游戏模式三,让子挑战模式。游戏界面中左部是棋盘,右部有悔棋、返回、排行榜、关于、重新开始功能选项按钮。和模式二不同的地方是让子,开局后棋盘中布好了让给电脑的白子。正所谓有人的地方就会有争斗,游戏中有菜鸟就会有高手.高手喜欢挑战,于是挑战模式应运而生.此模式的界面和模式二界面相同,在此不再重画。(5)游戏模式四,收拾残局模式。游戏界面中左部是棋盘,右部有摆棋、对战、悔棋、返回、再来一局功能选项按钮。和模式二不同的地方是开局,开局后玩家需先摆放棋子,然后点击对战按钮开始游戏。此模式界面设计参造模式二,不再重画。3。功能划分:通过对五子棋游戏的分析与了解,可知其基本功能有开始、保存、打开、悔棋、认输、和棋、返回、退出及聊天等功能.在这里,由于条件时间有限,仅实现悔棋、返回、重新开始及模式选择等功能.(1)模式选择功能:在打开游戏后,出现在玩家面前的是模式选择窗口,即主窗口。玩家可通过点击相应按钮进入相应模式进行对弈。此功能参照手游及单机小游戏主界面简约美观的特性制作的,多模式的增加符合广大玩家的喜好。(2)悔棋功能:在每个模式中都有悔棋功能,在模式一中每次悔棋退后一子,模式二到模式四每次悔棋退后两子,棋盘开局后就有的让子的棋子悔棋无效.人无完人,谁能不犯错,根据玩家的棋艺高低程度难以把握,为了让玩家不至于因电脑太强对开发者产生怨言,从而有了悔棋功能,进而对五子棋菜鸟起引导作用,使其怀着开心的心情与保持兴趣走向棋圣之路。对于高手而言,棋品也是要有的,悔棋功能形同虚设而已。(3)从新开始功能:此功能是菜鸟提升棋艺的首选功能,当玩家进行游戏到中途时,因棋势不明,或要败时,不能接受这一现状,导致心情低落,怎么办?只需轻轻一点,一切回归起点,也就是初始化而已。(4)返回功能:此功能的作用是退出当前模式,回到游戏主窗口,也就是模式选择窗口。方便玩家在各个模式自由出入,尽情的展现自己的风采。(5)人机对弈电脑下棋功能:在模式二到模式四中,玩家的对手都是电脑,电脑棋力取决于开发者,在某中意义上来说,玩家在和开发者对弈也是正确的。此功能是程序按照一定的算法循环扫描,算出己方和敌方最佳落子点,再判断出攻守,选出最终的落子点,落子后等待玩家落子。(6)让子功能:在模式三中,为了增加游戏难度,对棋艺大成者量身打造了让子功能。开局后,一般都是黑棋先行,在这里玩家执黑,让电脑1子,棋盘上变成了电脑执白先行1子,白棋落在天元位置上,难度一般.玩家赢后,挑战难度+1,玩家让电脑2子,棋盘上电脑执白先行2子,白棋落在天元位置左右两侧,难度适中,适合一段棋手挑战.玩家赢两局后,挑战难度+1,玩家让电脑3子,棋盘上电脑执白先行3子,考录到一般玩家没有如此高深棋力,因此白棋分散落在棋盘交叉线上,难度相对适中,适合一段及以上棋手挑战。让4子和5子也是一样的原理,难度较高,适合二段及以上棋手挑战.对战后,会在棋盘中部上方显示让子数目,为迎合玩家的虚荣心理而设计。(7)判断胜负功能:在每个模式中都需要对对局进行胜负判断,进而产生了胜负判断功能。其功能原理是对玩家或电脑下的棋子进行循环扫描,对各个方向扫描黑白子双方是否形成五子连珠,根据形成五子连珠方判断胜负,根据判断弹出对应的胜负提示框。再根据所属模式对胜负后的对局进行参数修改,如:模式一和模式二,不论胜负只需对其进行初始化;模式三,玩家胜出,让子加一,难度增加,需对其让子参数进行修改,反之则不进行任何处理操作;模式四,玩家胜出,对局胜出参数加一,呼应必胜模式的让子布局功能,玩家失败则不进行参数修改操作等。(8)初始化界面功能:在每个模式中都需对窗口界面进行初始化,考录到原有界面运行后的效果略显呆板,为增加美观性,需要对各窗口进行导入图片处理,美化界面.根据对局情形,在棋盘中部上方显示提示文字,并在棋盘上显示存在的棋子,对各参数进行初始化处理。4.自定义类描述、各类方法描述及添加的命令响应.如表1所示:表1。用到的类类名描述说明Form3模式一游戏窗口类,该类主要对该模式下的窗口初始化并对鼠标等事件消息进行处理,实现悔棋功能、返回功能、排行榜功能、关于功能、重新开始功能等。Form4模式二游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标等事件消息进行处理,实现人机对弈功能、悔棋功能、返回功能、排行榜功能、关于功能、重新开始功能、提示胜败功能等.Form5模式三游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标等事件消息进行处理,实现让子功能、人机对弈功能、悔棋功能、返回功能、排行榜功能、关于功能、重新开始功能、提示胜败功能等。Form6模式四游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标等事件消息进行处理,实现摆棋功能、人机对弈功能、悔棋功能、返回功能、排行榜功能、关于功能、重新开始功能、提示胜败功能等。二、总体设计1.游戏功能概述打开程序,游戏开始运行,登录进入模式窗口,选择游戏模式窗口弹出,窗口中有四个模式选择按钮,点击按钮,分别弹出对应的模式一、二、三、四窗口,完成具体模式的跳转。对于模式一,玩家点击鼠标进行下棋操作,判断点击点在棋盘内且无子时,在点击点画出棋子;如果点击点在棋盘外或有子时,则不处理,返回等待鼠标命令.然后判断是否存在五子连珠,如果不存在五子连珠,则返回等待鼠标命令;如果存在五子连珠,则进行判断胜负并提示胜负信息,再调用OnStart()函数初始化模式一窗口,重新开始游戏。玩家点击悔棋按钮,调用悔棋功能函数OnHuiqi(),在窗口中重画棋盘,去掉最后下的一个棋子,把悔棋后存在的棋子重新画在棋盘上。玩家点击重新开始按钮,程序调用OnStart()函数,初始化模式一窗口,重新开始游戏.对于模式二、三、四,玩家点击鼠标进行下棋操作,首先调用MouseMove函数。此函数的作用是判断点击点在棋盘内且无子时,在点击点画出棋子,如果点击点在棋盘外或有子时,则不处理,返回等待鼠标命令。然后调用gameOver()函数判断是否存在五子连珠,如果存在五子连珠,则进行判断胜负并提示胜负信息,再调用OnStart()函数初始化这一模式窗口,重新开始游戏;如果不存在五子连珠,则调用AiGo()函数,进行电脑扫描最佳落子点完成电脑下棋操作。再调用Over()函数判断是否存在五子连珠,如果不存在五子连珠,则返回等待鼠标命令;如果存在五子连珠,则进行胜负判断并提示胜负信息,再调用OnStart()函数初始化这一模式窗口,重新开始游戏.玩家点击悔棋按钮,程序调用悔棋功能函数OnHuiqi(),在窗口中重画棋盘,去掉最后下的两个棋子,把悔棋后存在的棋子重新画在棋盘上。玩家点击重新开始按钮,程序调用OnStart()函数,初始化模式一窗口,重新开始游戏。开始模式选择窗口1。绘制游戏进程图,如图4所示:开始模式选择窗口模式四选择按钮模式三选择按钮模式二选择按钮模式一选择按钮模式四选择按钮模式三选择按钮模式二选择按钮模式一选择按钮模式四窗口模式三窗口模式二窗口模式一窗口模式四窗口模式三窗口模式二窗口模式一窗口退出退出排行榜排行榜是在点击点画出棋子鼠标点击弹起等待鼠标命令否悔棋是在点击点画出棋子鼠标点击弹起等待鼠标命令否悔棋关于关于从新开始从新开始等待鼠标命令等待鼠标命令判断点击点在棋盘内且无子判断点击点在棋盘内且无子鼠标点击弹起鼠标点击弹起否否判断点击点在棋盘内且无子判断点击点在棋盘内且无子是否判断是否存在五子连珠是否判断是否存在五子连珠是是在点击点画出棋子在点击点画出棋子否弹出胜负提示框否弹出胜负提示框判断是否存在五子连珠判断是否存在五子连珠电脑扫描最佳落子点电脑扫描最佳落子点是是是是否否弹出胜负提示框判断是否存在五子连珠弹出胜负提示框判断是否存在五子连珠图4。流程图详细设计与实现1.悔棋功能的实现:为悔棋按钮添加类向导,再添加int变量bushu、qi[400]、wzq[19][19],用于记录先后下棋的具体坐标,以便于悔棋功能的实现。bushu用于记录下棋的落子数,qi[400]用于记录棋子的具体坐标,wzq[19][19]用于记录棋盘上各点存在棋子的黑白及有无情况。悔棋功能的实现原理是重新画出棋盘及悔棋后存在棋子。先判断是否刚刚开局,bushu不为0,就执行悔棋命令,把最后落下的第bushu个棋子的信息初始化,再画出棋盘,重画悔棋后存在的棋子。模式一与模式二、三、四的悔棋不同之处在于悔棋棋子数。具体代码如下:privatevoidOnHuiqi(){if(bushu〉0&&star==true){if(colorwhite)colorwhite=false;elseb=newSolidBrush(Color。White);g。FillEllipse(b,20*i+20,20*j+30,20,20);b.Dispose();g.Dispose();}elseif(wzq[i,j]==-1){Graphicsg=this.pictureBox1.CreateGraphics();Brushb;b=newSolidBrush(Color。Black);g.FillEllipse(b,20*i+20,20*j+30,20,20);b。Dispose();g.Dispose();}}}}悔棋功能的具体实现过程是先判断是否刚开局,有无可悔棋的棋子,如果有,就在窗口中重新画出棋盘,根据模式不同将最后落下的1个或2个棋子的信息初始化,再重新把悔棋后存在的棋子画在棋盘上。2.鼠标点击落子功能的实现:添加鼠标事件处理函数MouseDown(),先获取点击点位置坐标,再判断出点击点是否在棋盘内且无子,当点击点可落子时,就在棋盘上画出棋子,让wzq[19][19]记录该点棋子信息,把该手棋的具体坐标交给qi[bushu],用于悔棋操作,后检查游戏是否形成五子连珠,完成本次落子任务。具体代码如下:privatevoidpictureBox1_MouseDown(objectsender,MouseEventArgse){intx,y;x=(e.X-20)/20;y=(e.Y—30)/20;if(star==true&&x〉=0&&x<19&&y〉=0&&y<19){if(wzq[x,y]==0){Graphicsg=this.pictureBox1.CreateGraphics();Brushb;bushu++;if(colorwhite){b=newSolidBrush(Color.White);wzq[x,y]=1;colorwhite=false;}else{b=newSolidBrush(Color.Black);wzq[x,y]=—1;colorwhite=true;}g.FillEllipse(b,20*x+20,20*y+30,20,20);b。Dispose();g.Dispose();gameOver(x,y);qi[bushu]=x*100+y;}}}鼠标点击落子功能的运行过程是,获取点击点坐标并进行提取处理,方便棋子画在交叉线上判断点击点是否在棋盘内,如果在棋盘内。再判断点击点是否有棋子,如果没有,就根据上一手棋的颜色在点击点画上相反颜色的棋子。调用gameOver(x,y)方法,判断是否形成五子连珠,把落子点记录到qi[bushu]数组中.3。检查游戏是否形成五子连珠,判断游戏是否结束功能:新建gameOver()函数,进行循环扫描横竖撇捺四方向上有无黑子或白子形成五子连珠棋形,判断游戏是否结束,是否弹出胜负提示框。具体代码如下:privatevoidgameOver(intx,inty){intxx,yy;if(x〈4)xx=0;elsexx=x-4;if(y<4)yy=0;elseyy=y—4;inti,j,a;for(i=xx;i<15;i++){a=0;for(j=i;j<i+5;j++){a=a+wzq[j,y];if(a==5){MessageBox.Show(”白棋胜!”);star=false;return;}if(a==—5){MessageBox.Show(”黑棋胜!");star=false;return;}}}……}先获取下棋点的坐标并转化为棋盘上对应的棋子坐标,判断棋子在棋盘上的位子是否在棋盘边缘。如果是,就从棋盘(0,0)位置开始向后扫描;不是,则从点击点棋子坐标向左上方移动四个交叉位,开始向后扫描。进行循环扫描横竖撇捺四方向上有无黑子或白子形成五子连珠棋形,进而判断游戏是否结束,根据情况决定是否弹出胜负提示框。4.让子功能实现:在模式三中,为了增加游戏难度,开发者首创让子功能.开局后,先进行让子布局。一般都是黑棋先行,在这里玩家执黑,让电脑1子,棋盘上变成了电脑执白先行1子,白棋落在天元位置上,难度一般.玩家赢后,挑战难度+1,玩家让电脑2子,棋盘上电脑执白先行2子,白棋落在天元位置左右两侧,难度适中,适合一段棋手挑战。玩家赢两局后,挑战难度+1,玩家让电脑3子,棋盘上电脑执白先行3子,考录到一般玩家没有如此高深棋力,因此白棋分散落在棋盘交叉线上,难度相对适中,适合一段及以上棋手挑战。让4子和5子也是一样的原理,难度较高,适合二段及以上棋手挑战。具体代码如下:privatevoidpictureBox1_MouseMove(objectsender,MouseEventArgse){if(jushu==1&&wzq[9,9]==0&&star==true){Graphicsg=this.pictureBox1.CreateGraphics();Brushb;b=newSolidBrush(Color.White);wzq[9,9]=1;colorwhite=false;g.FillEllipse(b,20*9+20,20*9+30,20,20);b.Dispose();g.Dispose();}……}鼠标移动让子功能的运行过程是,判断是否刚刚开局,如果刚开局,就根据赢棋局数进行让子布局,把让电脑先下的棋子在棋盘上画出来。如果不是刚开局,说明已经对让子布局处理过,则跳过不再处理。5。模式选择窗口到各模式的跳转功能实现:新建四个window窗体,各自添加按钮控件,为模式选择窗口添加四个模式跳转按钮并对其建立点击事件,完成模式窗口到各模式的跳转.具体函数代码如下:privatevoidbutton1_Click(objectsender,EventArgse){Form3f3=newForm3();this。Hide();DialogResultdr=f3.ShowDialog();if(dr==DialogResult.OK)this。Visible=true;}调用此函数后,会弹出模式一游戏窗口。其余跳转按钮代码处理与此相似,只是弹出的窗体不同,进入的模式窗口也就不同,也就实现了模式窗口的跳转功能。6.人机对战电脑下棋功能:添加电脑下棋方法AiGo(),循环扫描棋盘上的棋形,算出最优下棋点坐标,处理代码如下:privatevoidAiGo(){……for(i=0;i<19;i++)for(j=0;j<19;j++){if(a1[x1,y1]<a1[i,j]){y1=j;x1=i;}}for(i=0;i<19;i++)for(j=0;j<19;j++){if(a2[x2,y2]<a2[i,j]){y2=j;x2=i;}}if(a2[x2,y2]>=a1[x1,y1]){px=x2;py=y2;}else{px=x1;py=y1;}}该算法先对棋盘上的棋子进行循环扫描,分析横竖撇捺四方向上的棋子分布情况,算出黑白棋子在棋盘上各点的棋形得分情况,分数越高,该点越重要,此部分为函数中省略部分,由于代码量庞大,不再阐述。接下来对是循环比较,分别找出黑白棋子在棋盘上的最高得分点坐标,进而比较出二者中的得分最高点坐标,即最优下棋点坐标。7.初始化功能的实现:privatevoidOnStart(){for(inti=0;i〈19;i++)for(intj=0;j〈19;j++)wzq[i,j]=0;colorwhite=false;star=true;bushu=0;pictureBox1。Refresh();}在每个模式中都需对窗口界面进行初始化,对各参数进行初始化处理。8.返回功能的实现:privatevoidbutton1_Click(objectsender,EventArgse){this.DialogResult=DialogResult。OK;this.Close();}关闭子窗体,恢复隐藏的父窗体。遇到的问题及解决方案问题1:窗口间的跳转,实现不了。解决方法:查找资料,上网学习,百度知道,当然搜索到的答案不一定正确且不全面,需要反复尝试,于是经过慢慢尝试,解决了窗口跳转问题。问题2:在窗口中的棋盘上画棋子,棋子有时不会落在交叉线上。解决方法:经过仔细观察,总结规律,发现画棋子用的方法不对,画在棋盘上的棋子坐标与棋盘上的交叉点有出入。经过尝试,找到了方法,于是改变了画棋盘的方法,让每一个交叉点都有具体的坐标,这样,不管鼠标点在哪里,想办法在交叉点坐标画棋子就可以了。问题3:实现悔棋功能时,想着把最后下的棋子去掉,却实现不了。解决方法:静下心来,仔细看自己编写的代码,模拟电脑运行调用程序的先后顺序看代码,想象运行的结果,于是发现悔棋的棋子信息是初始化了,但没有在棋盘上表现出来,没想到好办法,只好麻烦电脑再重新画出棋盘,循环画出悔棋后存在的棋子。问题4:判断游戏是否结束,扫描是否产生五子连珠,老是判断出错误。解决方法:经过请教度娘后,借鉴了前辈们的方法,完成了游戏结果分析函数。问题5:加载自己处理的图片作为游戏棋盘背景,却加载不进去或图片不管用。解决方法:直接在属性中设置背景图片.问题6:人机对战,机器下棋功能的实现,算法写不出来,没有头绪,不知道从何处下手。解决方法:经过多次尝试失败后,决定借鉴前辈们的算法,于是搜索到了不少算法,心中的贪念让人无法取舍,不知道用哪个好,看着这些算法不知道怎么用,更不清楚原理。几经波折终于意识到了自己的当务之急是先理解,于是选了一个注释全面的算法,深入理解,经过尝试学会了调用这个算法的工作过程,也实现了机器下棋的功能。问题7:让子对战模式中让电脑先下的棋子,怎样画在棋盘上,出现了问题。解决方法:首先把这些棋子放在了OnPaint()函数中来绘制,结果有偏差,也没弄懂原因,于是尝试着在OnLButtonDown()函数中来绘制,运行界面后棋盘上无棋子,结果鼠标点击的一瞬间出现了3颗棋子,这才意识到鼠标事件产生了冲突,也想到了在点击鼠标时,鼠标的移动事件先触发,然后点击事件才被触发。想到做到,马上把这些棋子放在了OnMouseMove()中来绘制,运行正确,让子对战功能完成了.问题8:在模式二的制作中,发现模式一的一些功能模式二都有用到,于是想到了继承,想让模式二继承模式一,尝试后发现,继承后的模式二运行界面和模式一很像,但是模式二中自建的按钮却不见了,变成了模式一中存在的按钮,和设计计划产生了误差。实现不了。解决方法:经过取舍,决定用笨方法,不怕麻烦,方法重写一遍,虽然代码存在冗余,但为了更好的完成设计计划,先这样处理,只能以后找机会来完善了。总结与体会通过本次课程设计,学到了很多知识,接触了一些以前没接触过的领域,对C#编程有了深入的了解,也学会了很多解决问题的方法,认识到了自己的不足,同时发现原来自己也是可以做出小游戏的。在做这个项目之前,想到了自己会的和能实现的功能有哪些,自己会的也就窗口跳转和鼠标处理事件等.于是想着用到这些知识的项目有哪些是自认为可以轻松实现的,经过对比选择了五子棋小游戏开发,因为这个项目中的棋盘自己是能画出来的。对于下棋而言,也就是一个鼠标处理事件,也能实现。难点在于人机对战的算法上。于是清楚了自己接下来要做的事情,对于未知的先不要去考虑了,自己有多大能耐还不清楚,先做会做的,能实现再说.不做不知道,一做吓一跳,想着简单,做起来难,往往是在人最得意的时候来一记狠得,让人都不知道怎么着程序突然就报错了。经过慢慢尝试,一步步做下来,终于完成了基本功能的实现.接下来就是一步一步的去完善这个游戏,如何设计的更加有难度与挑战性,比如在游戏中玩家可以选择不同的模式来进行游戏,在让子模式三中玩家可以让电脑先下几颗棋子,在玩家获胜后会在棋盘中部上方显示让子数量满足玩家的虚荣心与好胜心,激起玩家的挑战欲望;如何设计的更加有趣味性,比如在模式四中玩家可以通过下残局获得荣誉称号,而且还是棋力评级称号,让玩家对未知的棋局产生兴趣。另外,对于这个游戏还有很多需要改进的地方,比如让子模式可以把固定的让子位置做成随机的,这样给玩家一种未知的探险感觉,让玩家全身心的融入到游戏中。还可以在游戏中加入排行榜,得分记录等功能。对于这些问题,由于时间问题只能在以后的进一步学习过程中想办法对其进行解决与改进。项目能够按计划完成,需要技术与知识的支持,也少不了个人的坚持与努力,为了以后更好的完成项目,而时刻努力着。学号:学号:实习论文(本科)学院数学与统计学院专业统计学年级2013级姓名论文题目基于C++的2048游戏设计指导教师职称讲师成绩2016年10月16日目录TOC\o”1-3"\h\z\u摘要PAGEREF_Toc464584600\h1HYPERLINK\l”_Toc464584601"关键词PAGEREF_Toc464584601\h1AbstractPAGEREF_Toc464584602\h1HYPERLINK\l"_Toc464584603"KeywordsPAGEREF_Toc464584603\h1HYPERLINK\l"_Toc464584604”前言PAGEREF_Toc464584604\h1HYPERLINK\l”_Toc464584605"1实习前的准备PAGEREF_Toc464584605\h12实习目的PAGEREF_Toc464584606\h23实习任务PAGEREF_Toc464584607\h2HYPERLINK\l”_Toc464584608"4实习内容PAGEREF_Toc464584608\h2HYPERLINK\l”_Toc464584609"4.12048游戏简介PAGEREF_Toc464584609\h24.22048模块需求分析PAGEREF_Toc464584610\h3HYPERLINK\l"_Toc464584611”4.3UI界面的规划设计PAGEREF_Toc464584611\h3HYPERLINK\l”_Toc464584612"4.4头文件的需求分析PAGEREF_Toc464584612\h4HYPERLINK\l"_Toc464584613”4.5随机数的生成PAGEREF_Toc464584613\h44.6图片资源的导入和加载PAGEREF_Toc464584614\h5HYPERLINK\l"_Toc464584615"4.7主体算法的分析和实现PAGEREF_Toc464584615\h6HYPERLINK\l”_Toc464584616"4。8游戏结束的判断PAGEREF_Toc464584616\h84.9游戏最终运行成果PAGEREF_Toc464584617\h9HYPERLINK\l"_Toc464584618”5个人总结PAGEREF_Toc464584618\h10参考文献PAGEREF_Toc464584619\h10基于C++的2048游戏设计学生姓名:学号:学院:数学与统计学院专业:统计学指导教师:职称:讲师摘要:专业实习,是教学计划中的一门重要的必修课和综合实践课程,是培养学生的专业素质和实际能力的重要实践环节.通过此次的C++实习,掌握了程序设计的基本理论与方法,能够运用基本代码进行简单的程序设计,运行基本的游戏程序.关键词:C++;设计;程序TheGameDesignof2048BasedonC++Abstract:Theimportantrequiredcourseintheteachingplanandcomprehensivepracticecurriculum,professionalinternships,istocultivatethestudents'professionalqualityandpracticalabilityoftheimportantlinkofpractice。ThroughtheC++practice,wegraspthebasictheoryandmethodofprogramdesign,beabletousebasiccodetobuildsimpleprogramandrunit.Keywords:C++;Design;Program前言这次实习是我们毕业前的一次实践性实习。为了拓展我们的知识面,增强我们对所学知识的应用能力,增加我们在社会竞争中的经验,锻炼和提高我们的综合素质,以便在以后毕业后能真正走入社会,并且能够在生活和工作中很好地处理各方面的问题,学校特地从北京达内科技集团聘请了专业的C++工程师讲师来对我们进行专业实训,进一步运用所学知识分析和解决实际专业问题,从而为就业打下良好的基础。1实习前的准备学校对我们的实习非常重视,本着通过实习来检验本专业教学中存在的问题,改进教学工作的目的,提前就为我们联系好了与专业相关的单位来做实习培训.在正式进入机房实训前,讲师还专门做了一场关于实习内容的分享会,介绍了实习的基本情况、基本要求、实习项目的基本情况,学习和了解实习项目的相关文件和资料,帮助我们更系统地了解和熟悉接下来的实习课程内容。2实习目的1。培养理论联系实际的思想作风和工作作风;2.培养作为计算机类工作人员的专业素质;3。培养独立或与团队一起开展信息处理工作的基本业务能力。3实习任务1。通过实际操作,了解并逐步熟悉掌握C++;2。掌握常用软件的熟练操作,为今后所期望的专业方向做准备;3.在教师指导下,利用C++编程,完成独立的游戏编程任务;4。最后在实习指导老师的指导下,参与信息处理与计算工作,完成一篇相关的实习论文(或实习记录)。4实习内容4。12048游戏简介2048游戏是一款简单而流行的数字游戏,属于益智游戏。操作界面上有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动.每滑动一次,所有的数字方块都会往滑动的方向靠拢。两个相同数字方块撞在一起之后合并成为他们的和。每次操作之后会在空白的方格处随机生成一个2或者4(其他模式会有所改变),最终得到一个“2048”的方块就是胜利了。由于规则简单,各种版本和平台上均有该款游戏.相信有不少人都玩过它,但是操作界面只有半个巴掌大的一个游戏,背后却要用到类似随机数的产生、大批量数据的处理、UI设计等任务,真的不算是一个很简单的工作。本次的游戏程序设计任务将运用C++来实现。4.22048模块需求分析首先分析了这款游戏的功能需求。2048游戏一般由以下几个模块来构成:1。矩阵方块;2。控制模块;3.计算模块;4.输出模块.每个模块来实现2048游戏的各项功能:方向移动、方块合并、记录当前数据和输出计分结果、游戏胜利或失败后执行结束游戏操作等。4。3UI界面的规划设计首先进行UI界面的规划设计。创建一个800×600的背景模块,在模块左侧这里我们需要16个方块,按照4×4的规格排列整齐。模块右侧的空白区域需要添加功能键:上、下、左、右、重置、关闭.另外我们还需要再添加一个计分标签,用来计算并输出游戏得分。最后按照模块功能与人的操作习惯,将标签分别排列在合适的位置。最终的UI界面如图1所示:图1UI界面(矩阵方块)设计完成以后,接着来开始程序代码的编写。4。4头文件的需求分析首先分析需要用到的头文件。第一步需要生成随机数,第二步要为16个矩形模块填充随机数所对应的图片,第三步为操作界面添加背景,第四步在游戏成功或失败时即时输出信息。分析完成以后将所有需要用到的头文件都写入show。cpp文件里:#include"show.h”#include”ui_show.h"#include<ctime〉#include<cstdlib>#include<QPixmap〉#include<QPalette〉#include〈QMessageBox>QDialog(parent),ui(newUi::Show)4.5随机数的生成接下来我们开始写入生成两个随机数和分数从零开始的代码,同时加入图片加载和声明面板对象的代码:{ui—>setupUi(this);srand(time(NULL));for(inti=0;i<4;i++){for(intj=0;j<4;j++){map[i][j]=0;}}sui();sui();fen=0;QPixmappix(":/image/bj.jpg”);//加载图片QPalettepalette;//声明画板对象palette。setBrush(this-〉backgroundRole(),QBrush(pix));//设置画板样式this—〉setPalette(palette);//设置到我们的面板上}voidShow::sui(){do{intx=rand()%4;inty=rand()%4;if(map[x][y]==0){if(rand()%20==4)map[x][y]=4;elsemap[x][y]=2;break;}}while(1);}4。6图片资源的导入和加载将所有准备好的图片资源载入设计程序,以便后续的图片加载工作。随后我们进入为16个矩形模块和背景加载其各对应随机数图片的设计过程,这个模块以地址形式实现:voidShow::paintEvent(QPaintEvent*){QImageimg;img.load(":/image/"+QString::number(map[0][0])+"。png");ui—〉show_1->setPixmap(QPixmap::fromImage(img));img.load(”:/image/"+QString::number(map[0][1])+".png");ui->show_2—>setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[0][2])+".png");ui—>show_3-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[0][3])+".png”);ui-〉show_4—>setPixmap(QPixmap::fromImage(img));img。load(":/image/”+QString::number(map[1][0])+".png");ui—〉show_5-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/”+QString::number(map[1][1])+".png");ui—>show_6-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[1][2])+".png”);ui—>show_7->setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[1][3])+"。png”);ui—>show_8—>setPixmap(QPixmap::fromImage(img));img.load(":/image/”+QString::number(map[2][0])+"。png");ui—>show_9->setPixmap(QPixmap::fromImage(img));img。load(":/image/”+QString::number(map[2][1])+".png”);ui->show_10-〉setPixmap(QPixmap::fromImage(img));img。load(”:/image/"+QString::number(map[2][2])+".png");ui-〉show_11—>setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[2][3])+"。png”);ui->show_12-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[3][0])+”。png");ui->show_13->setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[3][1])+"。png");ui-〉show_14->setPixmap(QPixmap::fromImage(img));img。load(":/image/"+QString::number(map[3][2])+"。png");ui—〉show_15->setPixmap(QPixmap::fromImage(img));img。load(”:/image/"+QString::number(map[3][3])+”.png”);ui->show_16—〉setPixmap(QPixmap::fromImage(img));ui->fen->setText(QString::number(fen));}4.7主体算法的分析和实现接下来进入主要的算法设计步骤.在此根据2048游戏算法的功能需求和功能模块,对主要算法进行分析并实现。对于控制模块,一共有上、下、左、右、重置、关闭六个控制功能键。对于左移功能键的算法,每点击一次,所有的数字方块都会往滑动的方向靠拢。两个相同数字方块撞在一起之后合并成为他们的和。每次操作之后会在空白的方格处随机生成一个2或者4.此时分数也在累计增加。这一部分中重置和关闭这两个功能键相对与其他功能键独立,而上、下、左、右四个功能键的算法有一定的相似之处,所以以下仅详细展示左移功能键的代码。现在开始对这六个功能键进行代码编写:voidShow::on_pushButton_3_clicked(){//resetfor(inti=0;i<4;i++){for(intj=0;j<4;j++){map[i][j]=0;}}sui();sui();fen=0;update();}voidShow::on_clo_clicked(){//clothis->close();}voidShow::on_pushButton_2_clicked(){//upfor(intk=0;k〈3;k++){for(inti=1;i<4;i++){for(intj=0;j<4;j++){if(map[i-1][j]==0){map[i-1][j]=map[i][j];map[i][j]=0;}else{if(map[i][j]==map[i—1][j]){map[i—1][j]=map[i-1][j]+map[i][j];map[i][j]=0;fen+=map[i—1][j];}}}}}if(go()==1){sui();//产生随机数}update();//更新界面}Show::~Show(){deleteui;}voidShow::on_pushButton_clicked(){//right}voidShow::on_pushButton_5_clicked(){//down}voidShow::on_pushButton_4_clicked(){//left}4。8游戏结束的判断最后一个需解决的问题就是对于游戏是否结束的判断,其主要体现在控制和计算模块.如果游戏未能达成任务而失败,输出“失败"和“游戏结束”的信息,同时只有关闭和重置功能键可以被操作:intShow::go(){for(inti=0;i<4;i++){for(intj=0;j<4;j++){if(map[i][j]==0){return1;}}}return—1;}voidShow::pan(){intarr[4][2]={-1,0,0,-1,0,1,1,0};for(inti=0;i<4;i++){for(intj=0;j<4;j++){if(map[i][j]==0){return;}else{for(intloop=0;loop<4;loop++){intx=i+arr[loop][0];inty=j+arr[loop][1];if(x<0||x>3||y>3||y<0){continue;}elseif(map[x][y]==0){return;}elseif(map[i][j]==map[x][y]){return;}}}}}if(QMessageBox::question(this,tr("失败”),tr(”游戏结束”);QMessageBox::Yes|QMessageBox::No,QMessageBox::Ok)==QMessageBox::Yes){on_pushButton_3_clicked();}else{this—>close();}}以上我们对2048这个游戏的程序设计部分的工作已经完全结束,接下来构建程序,检查并修改错误,就可以打开并运行这个游戏了。4。9游戏最终运行成果最终的游戏界面如图2所示:图2点击右侧功能键,即可开始游戏.5个人总结通过这次实习我很好地掌握了如何将C++实际运用到游戏开发中去,检验了自己学习的成效、检测了自己的所缺。这就形成了从实践中学习,从学习中实践的良性循环。这是一个很好的锻炼机会,能将所学的理论知识联系于实际,我感觉学习与实践是密不可分的。当今中国经济飞速发展,国内外经济不断变化,在机会越来越多的同时,也出现了更多的题目,有了更多更艰巨的挑战,这也就对人才的要求越来越高。我们不仅要学好课本里的知识,还要主动走进社会,积极在实践中学习其他的东西,不断增加自己的经验,全方面武装自己,才能在这个社会有立足之地甚至拥有不败之地.参考文献[1]
谭浩强.C程序设计教程[M]。清华大学出版社,2007。ﻫ[2]
荣钦科技.Visual
C++游戏编程基础[M]。电子工业出版社,2005。
[3]
王浩.Visual
C++游戏开发经典案例详解[M]。清华出版社,2010.[4]刘明军.C语言程序设计[M]。电子工业出版社,2007.[5]凌云。C语言程序设计与实践[M]。机械工业出版社,2010.[6]StanleyB。LippmanC++primer[M]。人民邮电出版社,2006.[7]SteveMaguire。编程精粹[M]。人民邮电出版社,2009。[8]AndrewKoenig.C陷阱与缺陷[M]。人民邮电出版社,2008。基于C#与单片机串口通信的投票器李浩东20093101004周守悦20093101012作品的设计概述我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间.本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。作品的设计与分析主要功能与分析主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,B,C,D四个人投票的,这四个按键每按下一次就自动增1,记录这四个按键按下的总次数num1,num2,num3,num4,并把四个数按顺序不断循环通过串口发给PC机,PC机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在picturebox控件上面的柱形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。最后一个按键的作用是继续投票,如需继续投票,可按此键。其系统设计图如下:PC机PC机图像显示清零继续暂停ABCD单片机图像显示清零继续暂停ABCD单片机数据传输2.串口通信规则单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置:(1)数据的传输速率传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS—232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,要使得双方的数据读取正常,就要考虑到传输速率——波特率,其所代表的意义是每秒钟所能产生的最大电压状态改变率,或者说是每秒钟可以振荡的次数.原始信号经过不同的波特率取样后,所得的结果完全不一样。取样速度只有原来的一半时,信号被跳着取样,数据因此产生错误。因此通信双方获得相同的通信速度是首先要做的事情.(2)数据的发送单位一般串行通信端口所发送的数据是字符类型的,若用来传输文件,则会使用二进制的数据类型。当使用字符类型时,通常使用ASCII码,ASCII码中8个位形成一个字符.以实际的RS-232传输来看,由于大多数应用只是发送文字码,因此只要7个位就可以将ASCII码的0-127号字符表达出来,所有的可见字符都在这个范围内,所以只要7个数据位就足够了.不同的情况下,会使用到不同的发送单位,但使用多少个位合成一个字节必须先行确定.(3)起始位及停止位由于异步串行通信中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的发送,而当发送端准备要开始发送数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位。当发送端要开始发送数据时,便将传输在线的电位由低电位提升至高电位,而当发送结束后,再将电位降至低电位.接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据,并因停止位的通知(因电压维持在低电位)而确切数据的字符信号已经结束。(4)校验位的检查为了预防错误的产生,因此使用校验位作为检查的机制;校验位是用来检查所发送数据正确性的一种核对码,其中又分成奇校验位和偶校验位两种方式,分别是检查字符码中I的数目是奇数或偶数。以偶校验位为例,A的ASCII码01100001(二进制),其中1的数目是三个,因此校验位便是1,使1的数目保持偶数。同理,校验位是奇校验位时,A的校验位便是0,使1的数目保持奇数。串口通信协议由于本设计主要从单片机串口发送数据,所以因此有关串口通信的原理的介绍都是围绕单片机讲解的。80C51串行口的控制寄存器(1.1)特殊功能寄存器SCONSCON是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志,字节地址为98H.SCON寄存器的各位定义如表3-1所示。位76543210字节地址:98HSM0SM1SM2RENTB8RB8TIRISCON表3—1SCON寄存器SM0和SM1为工作方式选择位,可选择四种工作方式,如表3—2所示.SM0SM1方式说明波特率000移位寄存器fosc/1201110位异步收发器(8位数据)可变10211位异步收发器(9位数据)fosc/64或fosc/3211311位异步收发器(9位数据)可变表3-2串口通信4种工作方式SM2为多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0.在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。REN为允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。TB8用在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位(在方式0和方式1中,该位未用).RB8用在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。TI,发送中断标志位.在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请[7]。(1.2)特殊功能寄存器PCONPCON的字节地址为87H,它的第7位SMOD是与串口通信波特率的设置有关的选择位。SMOD(PCON.7)为波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍.复位时,SMOD=0。(2)80C51单片机串行口的工作方式(2.1)方式0设置SCON寄存器的SM0、SM1=00时,串行口工作于方式0。此时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。其中fosc为时钟频率.(2.2)方式1设置SCON寄存器的SM0、SM1=01时,串行口工作于方式1.方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断.方式一的输入输出图如图3—8、3—9所示。图3-8方式1输入图3-9方式1输出(2.3)方式2和方式3设置SCON寄存器的SM0、SM1=10时,串行口工作于方式2,当SM0、SM1=11时,串行口工作于方式3。方式2或方式3为11位数据的异步通信口.TXD为数据发送引脚,RXD为数据接收引脚。方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位.方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。方式2和方式3输出:发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出.第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位,左边都移入0.当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断。发送时序图如下图3—10所示。图3-10方式2或方式3的发送时序图方式2和方式3输入:接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。接收时序图如图3-11所示。图3--11方式2或方式3的接收时序图(3)波特率的计算在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定.串行口的四种工作方式对应三种波特率.由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。方式0的波特率=fosc/12方式2的波特率=(2SMOD/64)·fosc方式1的波特率=(2SMOD/32)·(T1溢出率)方式3的波特率=(2SMOD/32)·(T1溢出率)当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。计算公式如3—1所示:T1溢出率=fosc/{12×[256-(TH1)]}(3-1)在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。本设计根据要求选用工作方式1。4。单片机的设计硬件设计主要有单片机,七个按键,开关,以及一个与PC机相连接的USB串口,其硬件图像如下图:软件部分开始其单片机C语言程序框图如下:开始继续不发数据暂停结束发送数据Num1,num2,num3,nun4全为零清零Num1++Num4++Num3++Num2++C?A?D?B?判断是否有按键按下初始化(串口设置)继续不发数据暂停结束发送数据Num1,num2,num3,nun4全为零清零Num1++Num4++Num3++Num2++C?A?D?B?判断是否有按键按下初始化(串口设置)5.C#的程序设计串口通信的串行端口类SerialPort(1.1)SerialPort的主要属性属性说明BaudRate获取或设置串行波特率。BytesToRead获取接收缓冲区中数据的字节数。BytesToWrite获取发送缓冲区中数据的字节数。DataBits获取或设置每个字节的标准数据位长度.Encoding获取或设置传输前后文本转换的字节编码。IsOpen获取一个值,该值指示SerialPort对象的打开或关闭状态.NewLine获取或设置用于解释ReadLine和WriteLine方法调用结束的值。Parity获取或设置奇偶校验检查协议。PortName获取或设置通信端口,包括但不限于所有可用的COM端口。ReadBufferSize获取或设置SerialPort输入缓冲区的大小。ReadTimeout获取或设置读取操作未完成时发生超时之前的毫秒数。ReceivedBytesThreshold获取或设置DataReceived事件发生前内部输入缓冲区中的字节数。Site获取或设置Component的ISite。(从Component继承。)StopBits获取或设置每个字节的标准停止位数。WriteBufferSize获取或设置串行端口输出缓冲区的大小。WriteTimeout获取或设置写入操作未完成时发生超时之前的毫秒数.(1.2)SerialPort的主要方法方法说明Close关闭端口连接,将IsOpen属性设置为false,并释放内部Stream对象.Dispose已重载。释放SerialPort对象使用的非托管资源.Equals已重载。确定两个Object实例是否相等。(从Object继承。)GetPortNames获取当前计算机的串行端口名称数组。Open打开一个新的串行端口连接.Read已重载。从SerialPort输入缓冲区中读取。ReadByte从SerialPort输入缓冲区中同步读取一个字节。ReadChar从SerialPort输入缓冲区中同步读取一个字符。ReadExisting在编码的基础上,读取SerialPort对象的流和输入缓冲区中所有立即可用的字节.ReadLine一直读取到输入缓冲区中的NewLine值。ReadTo一直读取到输入缓冲区中的指定value的字符串.ToString返回包含Component的名称的String(如果有)。不应重写此方法。(从Component继承.)Write已重载。将数据写入串行端口输出缓冲区。WriteLine将指定的字符串和NewLine值写入输出缓冲区。(1.3)SerialPort的主要事件事件说明DataReceived表示将处理SerialPort对象的数据接收事件的方法。ErrorReceived表示处理SerialPort对象的错误事件的方法.C#界面串口设计开始C#程序框图开始串口初始化串口初始化不接收数据串口打开?显示图像Time事件触发接收数据不接收数据串口打开?显示图像Time事件触发接收数据三.功能显示以及结果(图1)投票结果显示(图2)投票结果动态显示四.结论本设计利用了单片机串口通信编程和C#串口通信编程,让单片机和PC机实现了通信。虽然是比较简单的C#与单片机之间的串口通信,但是也大大加深了自己对课堂知识的理解,同时大大提高了自己的动手设计能力。这次设计也让我充分认识到C#强大的功能,但也让我看到很多不足,界面完善不够好,程序编写较为简单,还没用到数据库等功能,这也大大的激发了我对C#兴趣。最后,非常感谢唐老师,他让复杂枯燥的C#变得生动有趣,上他的课非常有意思,大大提高了我对C#的兴趣,同时的加强了我的设计技能.参考文献张明锋.PIC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房地产中介加盟合同协议书
- 场地活动租赁合同
- 2025年武汉市某省属国企劳务外包制人才招聘14人笔试参考题库附带答案详解
- 2025山东威海智慧谷咨询服务有限公司司法辅助性服务人员招聘15人笔试参考题库附带答案详解
- 2025年上半年安徽阜阳兴泉发展限公司招聘10人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽池州市规划勘测设计总院招聘2人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年医疗消毒项目投资申请报告代可行性研究报告
- 2025年上半年安庆新能源投资发展限公司公开招聘工作人员2人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年宁波市公共交通集团限公司招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年宁波宁海县部分事业单位招考紧缺人才易考易错模拟试题(共500题)试卷后附参考答案
- 桥梁钢筋制作安装施工方案
- 【课件】化学与人体健康课件九年级化学人教版下册+
- 2024年4月全国自考计算机应用基础试卷及答案
- 金融类竞聘主管
- 2024年3月天津第一次高考英语试卷真题答案解析(精校打印)
- 2024年688个高考英语高频词汇
- 《历史地理生物》课件
- 减少铝模砼剪力墙表面气泡
- 老旧小区电梯更换方案
- 商标合资经营合同
- 第六讲当前就业形势与实施就业优先战略-2024年形势与政策
评论
0/150
提交评论