1、目录C+程序课程设计1第一章课题介绍31.1选题背景31.2关于编译软件41.3关于兼容性4第二章设计概要42.1程序功能简介42.2程序流程5第三章游戏实现53.1创建工程63.2游戏界面控制73.2.1墙、框体的绘制73.2.2蛇身的绘制83.2.3食物的绘制93.3游戏控制113.3.1蛇的移动113.3.2蛇死亡的判断133.3.3消息窗口的弹出133.3.3.1开始消息框143.3.3.2关卡消息框143.3.3.3结束消息框153.3.4游戏音效16第四章 结果与讨论174.1程序运行174.2对源程序的改进184.3错误调试与分析184.3.1关于窗口的重画问题184.3.2关于
2、双音轨的问题184.3.3程序的稳定性194.4课程设计心得与体会19附录21第一章 课题介绍1.1选题背景蛇-传说中的圣灵之物,仰头为神、俯首为魔。蛇是月亮国膜拜的神,月亮国的子民们都认为蛇是万能的主宰派来保护他们的守护者。蛇在这个岛屿就像空气一样自然的出现在各个角落,有些还成为居民的宠物, 陪伴孩子长大, 和年轻人一起去探险,守护着散步的老人。在善良的女娟神保佑下,人们的生活安宁平静。为了答谢女娟的庇佑,每年月亮国的国民都会举办一个守护蛇大赛,大家都会拿出自己最强、最炫、最快、最稀有的蛇来参加比赛, 获得第一名的人将得到国王的特别嘉奖。所以国民一生都在不断的培养更有威力、更长、更壮的蛇。
3、贪吃蛇 是一个产生于1970 年代中后期的计算机游戏,也叫蛇吃豆。该游戏在1990 年代由于一些手机将其引入而一时间再度流行起来。在游戏中,玩家操控一条细长的蛇爬行于一个带边界的平面之上,一路拾起触碰到之事物或其它类似的物件, 并要避免触碰到自身或者包围着游戏区的墙。每次贪吃蛇吃掉一件食物, 它的身体便增长一些,这让游戏的难度渐渐变大。操控贪吃蛇时,玩家操控贪吃蛇的头部的朝向(向上、向下、向左或向右)控制贪吃蛇的进行方向,贪吃蛇的身体将跟随着其头部行进。另外, 玩家不可在游戏中途停止贪吃蛇的进行。随着贪吃蛇的成功移植到手机系统,贪吃蛇的操作按键要求与手机按键的完美匹配,使贪吃蛇游戏风靡起来。贪
4、吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。1.2关于编译软件本程序采用Microsoft Visual C+6.0的中文版本进行编译。Visual C+6.0是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但
5、由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用Visual C+6.0进行应用系统的开发。1.3关于兼容性本程序经过调试,可以在XP系统下编译运行,也可以在Vista/Win 7下运行,界面稍有不同,但不影响运行结果。第二章 设计概要2.1程序功能简介据分析,贪吃蛇游戏一共要实现如下几个功能: 开始运行 蛇在上下左右键的操作下运动 闯关设置 游戏音效 游戏说明2.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程(图1)。贪吃蛇的内容主要包括: 开始游戏,随机出现食物,控制蛇的运动,吃食物,关卡处的消息询问,游戏音效的播放,分数的输出,游戏帮助的输出等等。
6、开始游戏出现食物蛇向右运动控制蛇的运动方向否是否否是是是是蛇身增长退出游戏蛇死亡判断蛇头与食物坐标是否重合开始下一关消息响应判断蛇头和蛇身以及墙坐标是否重合判断分数是否达到下一关图1.流程图第三章 游戏实现3.1创建工程本程序使用Win32 Application工程,编辑在Windows窗口中打开的应用程序。由于之前没有接触过这类工程,所以我在短短几天内笼统的学习了一些相关的基本知识。在程序的编写过程中,遇到了很多问题,通过查阅资料和请教别人,解决了很多问题,但是仍然有遗留的未解决的问题,所以本程序虽然实现了大部分功能,但不是很完善,需要在将来的学习过程中逐渐改进。 图2.创建Win32 A
7、pplication工程Win32 Application工程与Win32 Console Application工程有很大的不同(图2)。其主函数是WinMain()函数。创建一个经典的”Hello,World!”工程,就会有已经写好的WinMain()函数。WinMain()函数是整个程序的入口,虽然区区几行。不需要改动什么,但确实最主要的函数。函数定义如下:int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)在创建好的工程中,还有注册窗口函数和窗口过程函
8、数。ATOM MyRegisterClass(HINSTANCE hInstance)注册窗口函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)窗口过程函数实现贪吃蛇游戏的算法就写在窗口过程函数中。3.2游戏界面控制贪吃蛇游戏的游戏界面包括墙的绘制、蛇身体的绘制、蛇移动范围的绘制、食物的绘制、分数框和注释的绘制等等。其中贪吃蛇的身体的绘制,是本程序中的核心算法。3.2.1墙、框体的绘制在win32 application工程中,有很多绘制图形的函数。这里最多使用到的是Rectang
9、le()函数绘制矩形。通过坐标控制矩形的两对角点来确定矩形的长、宽、高,通过在窗口中添加画笔和画刷,使用不同的线条颜色和样式,画出所需的图框。如下是墙的绘制:hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建无色的画笔hbru=CreateSolidBrush(RGB(255,255,255);/创建无色的画刷hpenold=(HPEN)SelectObject(hdc,hpen);hbruold=(HBRUSH)SelectObject(hdc,hbru);Rectangle(hdc,rt.left,rt.top,rt.right,rt.bottom
10、);/绘制背景SelectObject(hdc,hpenold);/恢复笔SelectObject(hdc,hbruold);/恢复画刷hpen=CreatePen(PS_SOLID,1,RGB(255,100,0);/创建一支砖红色的笔hpenold=(HPEN)SelectObject(hdc,hpen);/把砖红色的笔选进画板Rectangle(hdc,45,35,615,465);hbru=CreateSolidBrush(RGB(255,100,0);/创建一支砖红色的画刷hbruold=(HBRUSH)SelectObject(hdc,hbru);/把砖红色的画刷选进画板hbruo
11、ld=(HBRUSH)SelectObject(hdc,hbru);/把砖红色的画刷选进画板for(i=50;i=600;i+=10)/画围墙Rectangle(hdc,i,40,i+10,49);/上边Rectangle(hdc,i,451,i+10,460);/下边for(i=40;i0;i-)/蛇的每个环节往前移动snake.xi=snake.xi-1;snake.yi=snake.yi-1;当蛇头的坐标和食物的坐标重合,就表明蛇吃到食物了,此时蛇要增长,将原来的食物用无色的笔“擦除”,node+1。如下:if(snake.x0=food.x&snake.y0=food.y)/吃到食物后
12、hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建一支无色的笔hpenold=(HPEN)SelectObject(hdc,hpen);/把无色的笔选进画板Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);/用无色的笔绘制食物以取消 /被吃掉的食物SelectObject(hdc,hpenold);/恢复有色笔在程序完成之后,我又添加了闯关模式的功能,其中每过一关,蛇的颜色就会改变,这是使用switch-case语句,每一关都改变绘制蛇的画笔和画刷来实现的。3.2.3食物的绘制确定用坐标绘制贪吃蛇蛇身以后
13、,贪吃蛇的食物如何达到随机出现,蛇吃完食物后再次出现的食物不与蛇身相重合,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。随机出现应采用rand()函数来实现,使食物随机出现在蛇可以运动的范围内;使用语句“food.x=rand()%400+60;food.y=rand()%350+60;”,让食物的坐标产生在墙内来;而食物与蛇头无偏差相接则用if语句判断生成的坐标是否可用最小网格的间距整除处理。使随机出现的点能够整除最小网格,也就是使食物与蛇头无偏差相接。for(i=2;isnake.node;i+)food.x=rand()%400+60;food.y=rand()%350+60
14、;if(food.x!=snake.xi)break;在游戏运行的过程中,经常会出现新出现的食物与蛇身重叠的情况,让玩家看不清食物到底在哪。经过认真的考虑,解决这个问题的办法就是,每次随机出现食物坐标时,用循环语句判断要出现的食物坐标是否与蛇身某一节的坐标重合,若是重合,重新生成一组随机数,再次判断,直到不重合时在画面上显示新食物。代码如下:再由食物坐标(food.x,food.y)与蛇头坐标是否相同判断蛇是否“吃”到了食物,设置判断标签food.yes,如果吃到了,food.yes为0,则再出现下一个食物,反之,如果没吃到,则不出现食物直到标签为0为止。代码如下:srand(unsigned
15、)time(NULL);/随机数发生器food.yes=1;/食物标记:1表示需要出现新食物,0表示已存在食物if(food.yes=1)/需要出现新食物food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/食物随机出现后必须让食物能在整格内,这样才能让蛇吃到food.x+;while(food.y%10!=0)food.y+;food.yes=0;/画面上有食物了hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建一只无色的笔hbru=CreateSolidBrush(RGB(0,0
16、,0);/创建一支黑色的画刷hpenold=(HPEN)SelectObject(hdc,hpen);/把无色的笔选进画板hbruold=(HBRUSH)SelectObject(hdc,hbru);/把黑色的画刷选进画板if(food.yes=0)/画面上有食物就显示Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);3.3游戏控制3.3.1蛇的移动开始游戏后的重点是如何用键盘来控制蛇的移动并传递到时间控制器中去判断蛇是否死亡。首先说明键盘与蛇的响应,设置一个方向控制变量snake.direction,设置其值为1、2、3、4分别表示左、右、前、
17、后,在窗口控制过程的WM_KEYDOWN中实现键盘消息的传递,按下不同的键盘按键,snake.direction会相应的改变,再利用if语句对坐标进行相应改变即可。如下:case WM_KEYDOWN:key=int(wParam);/接受按键if(key=VK_UP&snake.direction!=4)/判断是否往相反的方向移动snake.direction=3;else if(key=VK_RIGHT&snake.direction!=2)snake.direction=1;else if(key=VK_LEFT&snake.direction!=1)snake.direction=2;
18、else if(key=VK_DOWN&snake.direction!=3)snake.direction=4;在这里,需要注意的是,蛇在转向的时候,不可能转到前进方向的反方向,即向右运动时,蛇不可能转到屏幕的左边前进,需要用if语句进行筛选判断处理。蛇的移动速度是用SetTimer()函数和KillTimer()函数打开和关闭计时器来控制的。其中,SetTimer()函数中的参数控制蛇的速度,例如刚开始时为“SetTimer(hWnd,1,500,NULL);”,表示每500毫秒蛇向前移动一格,此时的速度很慢,玩家可以很方便的控制其位置。为了增加游戏难度,我使用switch-case语句,
19、改变每一关蛇的速度,越到后面速度越快,增加游戏的刺激性和趣味性,以激起玩家的兴趣。后来,为了完善游戏,我又在WM_KEYDOWN和WM_KEYUP中增添了模块,使玩家觉的蛇的运行速度过慢而不耐烦时,长按前进方向的方向键,就可以加快蛇的速度。当计算机接受到长按方向键的响应后,改变计时器的参数,加快蛇的移动速度,当长按键释放后,计算机接受释放按键的响应,恢复蛇原来的速度。case WM_KEYDOWN:if(Checkpoint4)/前三关可以通过长按键改变蛇的速度if(key=VK_LEFT&snake.direction=2)SetTimer(hWnd,1,200,NULL);else if(
20、key=VK_RIGHT&snake.direction=1)SetTimer(hWnd,1,200,NULL);else if(key=VK_UP&snake.direction=3)SetTimer(hWnd,1,200,NULL);else if(key=VK_DOWN&snake.direction=4)SetTimer(hWnd,1,200,NULL);break;case WM_KEYUP:key=int(wParam);switch(Checkpoint)/按键释放恢复蛇的速度/这里的代码省略模块代码如下:while(GetMessage(&msg, NULL, 0, 0) Tr
21、anslateMessage(&msg); if(msg.message = WM_KEYDOWN & !hold) hold = true; DispatchMessage(&msg); else if(msg.message = WM_KEYDOWN) ; / 忽略多余的按键 else if(msg.message = WM_KEYUP) hold = false; DispatchMessage(&msg); else DispatchMessage(&msg); 但是添加此模块运行时,长按键后蛇停止不动了,释放按键后蛇又开始以原来的速度运动,好像变成了所需功能的相反功能了。后来查阅资料
22、才明白,计时器的优先级是很低的,当长按方向键时,计算机只是接受了按键的响应,而无暇继续计时器的执行,导致蛇的运动停止,需要在WinMain函数中做一些改动,改变消息机制的处理,当长按键时,忽略之后多余的按键,是计时器响应,这样便很好的解决了这个问题。代码改变如下:while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg);DispatchMessage(&msg);3.3.2蛇死亡的判断其次来解释一下如何判断蛇的死亡,由于蛇的身
23、体是由点坐标数组构成的,因此判断蛇是否死亡其本质就是判断蛇头的坐标是否与游戏边框相同或者蛇头坐标是否与蛇自己的身体相同。该过程也在WM_TIMER中写入即可,设置一个判断死亡变量snake.life,如果snake.life为1,则说明蛇已经死亡,应当弹出对话框提示死亡,输出得分,结束游戏。在蛇死亡后,要使用无色的画刷将死亡的蛇身和画面中的食物“擦除”,获取蛇与食物的最终坐标利用循环结构便可做到。代码如下:if(snake.life=1)KillTimer(hWnd,1);/游戏结束,蛇和食物消失hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);hbru=C
24、reateSolidBrush(RGB(255,255,255);hpenold=(HPEN)SelectObject(hdc,hpen);hbruold=(HBRUSH)SelectObject(hdc,hbru);for(i=0;isnake.node;i+)/擦除蛇身Rectangle(hdc,snake.xi,snake.yi,snake.xi+10,snake.yi-10);Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);/擦除食物SelectObject(hdc,hpenold);SelectObject(hdc,hbruold);
25、 3.3.3消息窗口的弹出贪吃蛇游戏是一个计算机与用户交互的游戏,当然也就少不了稍息框的弹出设置了。这一部分需要考虑到消息框在什么时候弹出,弹出后根据不同的用户的选择,程序该怎么运行等问题。图53.3.3.1开始消息框当用户进入游戏后,便弹出该消息框(图5),选择“确定”按钮后,游戏开始,食物出现,蛇通过Sleep()函数延迟1秒后开始运动。代码如下:if(score=0)MessageBox(hWnd, 开始游戏!,贪吃蛇,MB_ICONINFORMATION);SetTimer(hWnd,1,500,NULL);Sleep(1000);3.3.3.2关卡消息框图6为了增加游戏的趣味性和游戏
26、难度,我给程序添加了关卡模块。每一关中需要吃的食物,蛇的颜色和蛇移动的速度都会不同。当玩家的分数到达下一关卡的标准时,弹出消息框供玩家选择是否开始下一关(图6)。当玩家选择“是”时,开始下一关,蛇变颜色,速度加快。当玩家选择“否”时,退出游戏。代码如下:if(score%50=0&score/50=1)KillTimer(hWnd,1);if(IDYES=MessageBox(hWnd, 开始第二关!,贪吃蛇,MB_YESNO|MB_ICONINFORMATION) )SetTimer(hWnd,1,400,NULL);Sleep(1000);elseReleaseDC(hWnd,hdc);S
27、endMessageW(hWnd,WM_DESTROY,NULL,NULL);3.3.3.3结束消息框当蛇碰到自身或者墙壁时,蛇死亡,snake.life=1,此时弹出消息框(图7),询问是否退出游戏,用户选择“是”,退出程序,用户选择“否”,则在画面上显示用户的最终得分,需要用户关闭窗口。图7代码如下:if(snake.life=1)KillTimer(hWnd,1);if(IDYES=MessageBox(hWnd, 你要退出游戏吗?,贪吃蛇,MB_YESNO|MB_ICONINFORMATION)ReleaseDC(hWnd,hdc);SendMessageW(hWnd,WM_DESTR
28、OY,NULL,NULL);elsehpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建一只无色的笔hpenold=(HPEN)SelectObject(hdc,hpen);/把无色的笔选进画板hbru=CreateSolidBrush(RGB(255,255,255);/创建一支无色的画刷hbruold=(HBRUSH)SelectObject(hdc,hbru);/把无色的画刷选进画板for(i=1;isnake.node;i+)Rectangle(hdc,snake.xi,snake.yi,snake.xi+10,snake.yi-10);/用无色
29、的笔绘制蛇Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);/用无色的笔绘制食物SelectObject(hdc,hpenold);SelectObject(hdc,hbruold);char chover20;sprintf(chover,您的分数是:%d,score);SetBkColor(hdc,RGB(255,255,255);TextOut(hdc,290,230,chover,strlen(chover);3.3.4游戏音效当开始游戏时,程序会自动播放进入游戏的欢迎音乐,当蛇吃到食物是,会发出吞咽的声音,当一关结束时,播放鼓掌祝贺的声
30、音,当下一关开始时,播放欢呼的声音,当蛇死亡时,播放蛇死亡呜咽的声音。#include mmsystem.h/导入声音头文件#pragma comment(lib,winmm.lib)/导入声音头文件库PlaySound(start.wav,NULL,SND_FILENAME|SND_ASYNC);/开始音效if(snake.x0=food.x&snake.y0=food.y)PlaySound(eat.wav,NULL,SND_FILENAME|SND_ASYNC);/吃到食物后的音效if(score%50=0&score/50=1)PlaySound(zhangsheng.wav,NULL
31、,SND_FILENAME|SND_ASYNC);/掌声音效KillTimer(hWnd,1);if(IDYES=MessageBox(hWnd, 开始第二关!,贪吃蛇,MB_YESNO|MB_ICONINFORMATION) )SetTimer(hWnd,1,400,NULL);PlaySound(koushao.wav,NULL,SND_FILENAME|SND_ASYNC);/欢呼音效Sleep(1000);这些声音的播放都是在合适的位置,使用包含在头文件mmsystem.h中的PlaySound函数。只要在合适的位置设定判断语句添加该函数,就能在需要的时刻播放需要的音效。代码如下:if
32、(snake.x0590|snake.y0450)/蛇碰到墙壁snake.life=1;/蛇死亡PlaySound(dead.wav,NULL,SND_FILENAME|SND_ASYNC);/蛇死亡音效for(i=3;isnake.node;i+)/从蛇的第四节开始判断蛇是否撞到自己了if(snake.xi=snake.x0&snake.yi=snake.y0)snake.life=1;PlaySound(dead.wav,NULL,SND_FILENAME|SND_ASYNC);/蛇死亡音效第四章 结果与讨论4.1程序运行程序开始运行后会进入游戏界面,弹出开始消息框,玩家点击确定后,游戏开
33、始。开始游戏了,小蛇在玩家的控制下运动,蛇每吃一个食物,出现音效,蛇身增长一节,分数相应的加10分,在右上角的分数框中显示得分。当分数达到下一关要求时,播放掌声,弹出下一关的消息框,玩家选择“是”后,播放欢呼声,蛇身和食物的颜色改变,蛇运动延迟一秒,然后开始运动,在得分的下面一行显示当前的关数。颜色的改变预示着游戏的难度加大。当贪吃蛇由于“贪吃”而死亡是,播放死亡音效,弹出退出游戏的消息框,玩家选择“是”则直接退出游戏界面,选择“否”则在窗口中间显示玩家的最终得分。如果不太会玩贪吃蛇这款游戏,那么可以参考窗口右下方的操作说明。4.2对源程序的改进 优化了界面的图像,使蛇身,墙面等更形象 加强了
34、消息的处理,便于用户的操作 增加了闯关功能,使游戏更具有趣味性 增添了游戏音效,试游戏更富有动感4.3错误调试与分析4.3.1关于窗口的重画问题在测试的过程中,我发现,在游戏运行时弹出消息框被移动后,原来的蛇消失,继续弹出很多开始消息框,游戏便重新开始,或者是当屏幕有其他除蛇,食物,分数和关卡以外的变动时,也会出现上述现象。我百思不得其解,费劲了功夫寻找其原因,通过查阅了无数的资料,才知道了窗口中图案的改变其实是频率很高的窗口重画。我编写的程序,当非程序编写的窗口图像变化时,窗口便不能重画,于是出现了上面的原因。但是因为没有系统的学习过Windows程序设计,而且只有一周的时间去完成这个程序,
35、我没有能有效的解决这个错误。但幸运的是,只要不去挪动窗口和消息框,屏幕也不会闪现其他的内容,那么游戏就可以在用户的操作下顺利的进行。4.3.2关于双音轨的问题在设计之初,我的想法是给游戏加上背景音乐,给玩家在玩游戏的过程中带来一些听觉上的享受,再加之以游戏的其他音效。但是若用PlaySound()函数,当其他音效播放的时候,背景音乐就会停止。我也尝试了用其他的方法来实现这个功能,但都以失败告终。资料和教程中说可以用双线程或者是使用一些控件来实现这个功能,但同样因为时间关系和我的编程能力有限,最终放弃了这一想法。4.3.3程序的稳定性若是除过第一个问题,总的来说,游戏还是稳定的,没有再出现什么意
36、外情况。经过多次的测试,我都可以顺利的通过所有关卡,这一点还是振奋人心的,毕竟花了这么多天的心血,能制作出一款儿时经常玩的游戏也让我心潮澎湃。4.4课程设计心得与体会通过理论与实践的完美结合,我的贪吃蛇游戏终于编制完成了,本次C+课程设计也可以画上句号了。像贪吃蛇这样的简单的游戏,就自然成了我们程序设计课程的首选。因为其界面简单,操作、玩法一目了然,所以编写起来就不会非常困难。虽然美中不足,程序有很多漏洞,但是值得骄傲的是,整个游戏的编写是通过大量的阅读资料,自己亲手,并且依靠自己的智慧独立完成的。在编写游戏过程中,遇到了许多难题,例如,蛇的头部与食物的检测问题, 蛇的移动与显示问题,蛇的转向
37、问题,食物的随机生成问题,关卡的设置问题等等,这些个难题摆在面前,让人实在有些招架不住。经过查阅大量的文献资料,阅读相关的书籍,最后就决定了采用分治算法的思想来对摆在面前的问题一一击破。在解决的是蛇的移动与显示问题的时候,通过大量的研究、实验与调试,试验过多种移动与显示的方式,最后选定了一种简单易用的算法。程序中会遇到使用之前没有遇见过功能的函数,我便使用强大的网络,并且通过查询微软的MSDN帮助文件,解决了不少问题。仿佛是拨了一层云,又见一层云,但是日光也越来越闪耀了,最终看到了太阳,取得了成功。虽然通过自己的努力,解决了很多从前没有遇到的问题,但依旧有无数的难题摆在我面前,重重叠叠的大山阻碍着我前进的道路。山高人为峰,我一定不会惧怕摆在前面的困难,不断努力奋斗,争取看到更多的阳光。这次的课程设计,让我受益匪浅。不仅为自己揭开了游戏程序神秘的面纱,而且在实际的程序编写与调试过程中,成长了不少,实战的能力提高了很多,也让我明白了自己还有很大的提高空间。虽然以后不再学习程序设计这门课了,但这次课程设计确实激发了我编程的兴趣,我以后一定还会努力钻研,争取往更深更透的方向发展。万丈高楼平地起,能够编写复杂的程序都是在编写过简单的程序的基础上演变过来的能力。目前的程序漏洞确实还