贪吃蛇

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

贪吃蛇熟悉编程环境分析键盘的代码添加键盘按下处理事件双击获取按下的键privatevoidForm1_KeyDown(objectsender,KeyEventArgse){Keysk=e.KeyCode;}将鼠标点击要打断点的行,然后按f9(如果取消断点则再次按f9)运行程序•按f5以调试方式运行用调试获取按键的值2点击该处3在名称一列输入要观察的变量e1在之前运行程序窗体上按左箭头键,程序在断点处停止点击变量e的加号,观察其成员注意该值为37即左箭头键为37继续试验其它的键•按f5继续运行程序,我们又看到窗体,再如上点击上,右,下箭头键,得知e.KeyValue为38,39,40.•只要我们判断e.KeyValue为37~40,则代表用户点击了这4个键只要我们判断e.KeyValue为37~40,则代表用户点击了这4个键•privatevoidForm1_KeyDown(objectsender,KeyEventArgse)•{•switch(e.KeyValue)•{•case37:MessageBox.Show(左键);•break;•case38:MessageBox.Show(上键);•break;•case39:MessageBox.Show(右键);•break;•case40:MessageBox.Show(下键);•break;•}•}试验画点如图button控件,并点击窗体,将按钮放到窗体上,通过按住鼠标左键,我们还可拖动按钮到自己希望的位置•双击窗体上的按钮,自动生成鼠标点击响应事件函数,我在这当中写入画点的代码privatevoidbutton1_Click(objectsender,EventArgse){}privatevoidbutton1_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//生成图形对象try{Penp=newPen(Color.Black,3);//生成画笔对象try{g.DrawLine(p,0,0,15,15);//画线,x1,y1,x2,y2}finally//不论出现什么问题,释放对象p{p.Dispose();//释放对象}}finally{g.Dispose();//释放对象g。}}绘制效果将线不断延长•我们增加一个按钮,绘制一个垂直的线,每按一次,将线整体垂直下移•拖拽一个按钮,将其文字改为move•双击按钮,增加响应代码privateintm_currentY1=0;privateintm_currentY2=10;privatevoidbutton2_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();try{Penp=newPen(Color.Black,3);try{g.DrawLine(p,4,m_currentY1,4,m_currentY2);m_currentY1+=2;m_currentY2+=2;}finally{p.Dispose();}}finally{g.Dispose();}}每点一次将两个点的Y坐标增加2,这样就延长了线定义两个成员变量记录当前的y坐标问题:并非垂直下移,而似乎是将线不断延长了。问题出在哪里?•问题是,之前画了的没有搽掉,就像黑板,除了画新的部分,要搽掉老的部分g.DrawLine(p,4,m_currentY1,4,m_currentY2);•如何搽掉老的部分呢?就是用底色重画一次线就可以了嘛。如何获取底色呢?窗体对象form1的属性BackColor就可获取。•如何修改线的颜色,就是那个pen对象的属性ColorPenp=newPen(Color.Black,3);try{p.Color=this.BackColor;g.DrawLine(p,4,m_oldY1,4,m_oldY2);•再用新的坐标和黑色画出新线即可p.Color=this.BackColor;g.DrawLine(p,4,m_oldY1,4,m_oldY2);p.Color=Color.Black;g.DrawLine(p,4,m_currentY1,4,m_currentY2);m_oldY1=m_currentY1;m_oldY2=m_currentY2;m_currentY1+=2;m_currentY2+=2;存储本次的y坐标,下次画时就是用于搽除的老坐标privateintm_oldY1=0;privateintm_oldY2=10;为了存储老坐标,所以再定义两个成员变量•下面,实验自动移动线条,并通过按键改变线移动的方向。我们只响应上和下箭头键,将刚才的线段上下移动。•为了不影响之前的实验,我们创建一个新工程在解决方案中在解决方案中再建立新项目1鼠标右键点击解决方案图标,激活弹出菜单2点击新建项目菜单将工程设定为启动工程•因为目前方案中有两个工程,为了调试运行,必须指定哪个是现在的启动工程鼠标点击要设定的项目图标右键激活弹出菜单,选择“设定启动项目“菜单•添加start按钮,让线条不断下移。privatevoidbutton1_Click(objectsender,EventArgse){while(true){向下画线System.Threading.Thread.Sleep(500);//停止运行500毫秒}}•添加keydown事件,响应上下箭头键privatevoidForm1_KeyDown(objectsender,KeyEventArgse){switch(e.KeyValue){case37:break;case38:像上画线;break;case39:break;case40:向下画线;break;}}我们发现画线的代码非常重复,除了向上和向下仅有两行代码不同。如果拷贝非常不爽消除重复,我们用函数•定义voiddrawline(boolisUp)。上页代码修改如下privatevoidbutton1_Click(objectsender,EventArgse){while(true){DrawLine(false);//向下画线System.Threading.Thread.Sleep(500);//停止运行500毫秒}}privatevoidForm1_KeyDown(objectsender,KeyEventArgse){switch(e.KeyValue){case37:break;case38:DrawLine(true);//像上画线;break;case39:break;case40:DrawLine(false);//向下画线;break;}}privatevoidDrawLine(boolisUp){Graphicsg=this.CreateGraphics();try{Penp=newPen(Color.Black,3);try{p.Color=this.BackColor;g.DrawLine(p,4,m_oldY1,4,m_oldY2);p.Color=Color.Black;g.DrawLine(p,4,m_currentY1,4,m_currentY2);m_oldY1=m_currentY1;m_oldY2=m_currentY2;if(isUp){m_currentY1-=2;m_currentY2-=2;}else{m_currentY1+=2;m_currentY2+=2;}}finally{p.Dispose();}}finally{g.Dispose();}}根据上下选择的不同做出不同绘制策略•实验结果发现,按了start按钮后,不仅上下箭头没有响应,整个界面都不响应鼠标了。为什么Windows消息循环while(GetMessage(….)){TranslateMessage…;DispatchMessage..;}privatevoidbutton1_Click(objectsender,EventArgse){while(true){DrawLine(false);//向下画线System.Threading.Thread.Sleep(500);}}这里产生死循环不退出那么,就不会调用GetMessage就不会处理下一个消息最终调用解决办法•消除死循环,用计时器,每隔一定时间触发一次,移动一下线条,这样在定时器触发间,就可接收键盘下按等消息。从工具箱中选择Timer组件,双击该图标,放到项目中隔500毫秒触发一次Enabled属性控制是否启用定时器,否则不会触发事件鼠标点击闪电按钮,设置控件事件属性双击Tick事件的该空白处自动生成定时器触发响应事件privatevoidtimer1_Tick(objectsender,EventArgse){//移动一次线,这样相当于每隔500毫秒画一次线}privatevoidtimer1_Tick(objectsender,EventArgse){DrawLine(m_isUp);}privatevoidbutton2_Click(objectsender,EventArgse){DrawLine(false);m_isUp=false;this.timer1.Enabled=true;}privatevoidForm1_KeyDown(objectsender,KeyEventArgse){switch(e.KeyValue){case37:break;case38:DrawLine(true);m_isUp=true;break;case39:break;case40:DrawLine(false);m_isUp=false;break;}}定时器触发按当前方向画线增加一个成员变量表示当前方向开始程序,设定当前方向为向下,画线并激活定时器根据按键不同改变绘制方向,为了响应迅速(本身要500ms后才响应),所以先画线再改变方向标志m_isUp•问题发生了,按start2按钮,开始程序后,按方向键依然无效。是之前的原因吗?•聚焦控件解决办法•将所有窗体上的控件溢出,添加一个菜单控件实验一下。•增加新工程,movepoint2•添加菜单,双击鼠标点击menuStrip1对象然后用右键点击该控件激活弹出菜单选择“编辑项”子菜单鼠标选中母菜单然后点击添加按钮在所选母菜单中增加一个新的子菜单修改新增子菜单的Text属性,改为start然后按确定按钮退出双击start按钮,产生start点击响应事件函数,然后将之前movepoint工程的start2按钮的代码拷贝到其中privatevoidtoolStripMenuItem1_Click(objectsender,EventArgse){DrawLine(false);m_isUp=false;this.timer1.Enabled=true;}然后添加timer组件,添加定时器事件,并将Movepoint工程中的相关代码全部拷贝过来。开始程序,设定当前方向为向下,画线并激活定时器privatevoidtimer1_Tick(objectsender,EventArgse){DrawLine(m_isUp);}privatevoidForm1_KeyDown(objectsender,KeyEventArgse){switch(e.KeyValue){case37:break;case38:DrawLine(true);m_isUp=true;break;case39:break;case40:DrawLine(false);m_isUp=false;break;}}定时器触发按当前方向画线增加一个成员变量表示当前方向根据按键不同改变绘制方向,为了响应迅速(本身要500ms后才响应),所以先画线再改变方向标志m_isUp•Ok,成功了,可是,线一闪一闪的。为什么•创建一个新的工程movepoint3•其它代码同movepoi

1 / 51
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功