已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+课程设计报告组员专业班级学号 目录1.课程设计目的和要求. 1 1.1课程设计目的. 1 1.2课程设计要求. 1 2. 课程设计任务内容. 1 3.详细设计.1 3.1设计要求.1 3.2设计思想.2 3.2.1界面设计: . 2 3.2.2数据结构 . 2 3.3函数设计.4 3.3.1文件及函数组成. 4 3.3.2函数的详细设计. 5 4. 代码. 135.课程设计设计心得与体会. 17 参考文献. 191. 课程设计目的和要求本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计基础(C+)课程后进行的一次全面的综合设计。本课程设计的目的和任务:1.1课程设计目的 1. 巩固和加深学生对C+语言课程的基本知识的理解和掌握。 2. 掌握C+语言编程和程序调试的基本技能。 3. 利用C+语言进行基本的软件设计。 4. 掌握书写程序设计说明文档的能力。 5. 提高运用C+语言解决实际问题的能力。基本要求:1.2课程设计要求 1.分析课程设计题目的要求。 2.对系统功能模块进行分析,写出详细设计说明文档。 3.编写程序代码,代码量要求不少于300行。调试程序使其能正确运行。4.设计完成的软件要便于操作和使用。 5.设计完成后提交课程设计报告。2. 课程设计任务内容 程序要求游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)或者迟到毒果,则游戏结束。3. 详细设计3.1设计要求程序要求:游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被吃掉,这时蛇的身体加长一节,同时计分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)或者吃到毒果,则游戏结束。算法:通过随时读取键盘的按下状态调用蛇类的操作函数,实现对蛇类的运动方向调整,通过随时判断蛇头位置的状态(有食物,有毒物,有蛇身或没有)来判断蛇继续运动还是变长或者游戏结束。3.2设计思想3.2.1界面设计:这个程序的关键是表示蛇的图形以及蛇的移动。用一个小图形表示蛇的一节身体,身体每长一节,增加一个图形。移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有若干个静止不动的食物以及毒物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加,界面开始更新,蛇的身体增加一节,食物的位置变化一次,当蛇碰到墙或者咬自己或者吃到毒果时,游戏自动结束,显示用户最后的分数。3.2.2数据结构文件名类名函数名功能Snake.HCSnakeMove蛇移动ChangeDirect改变方向AddBody增加身长SetHeadPos设置蛇头GetStateArray蛇身体数组GetPos获取蛇位置IsHeadTouchBody判断蛇身是否碰到蛇尾GetLength获取蛇长度Initial初始化蛇类Table.hCtable InitialTable初始化场景AddBlock添加障碍物AddFood添加食物ClearFood被吃后清除食物GetSnake获取蛇位置GetData获取蛇身的数组数据SnakeMove蛇移动GetBoard获取墙位置ChangeSnakeDirect改变蛇方向Class CSnakestruct Snake_Struct/定义蛇体状态MoveState head; /头部MoveState *body; /身体MoveState tail; /尾部;private:int m_length; /蛇的长度Snake_Struct m_newSnake; /蛇的新态的所有节点运动状态Snake_Struct m_oldSnake; /蛇的原态的所有节点运动状态BitmapState *m_pStateArray; /蛇的所有节点显示位图的状态SPoint *m_pPos; /蛇体坐标private:BitmapState GetRightState(MoveState oldDirect,MoveState newDirect);public:void Move(void); void ChangeDirect(MoveState d);void AddBody(int n=1);void SetHeadPos(int x,int y);BitmapState* GetStateArray(void);SPoint* GetPos(void);bool IsHeadTouchBody(int x,int y);int GetLength( void );void Initial( void );public:CSnake(int x_pos=0,int y_pos=0,int len=1);CSnake();class CTableprivate:int m_width; /背景的宽度int m_height; /背景的高度int m_foodNumber; /食物的数目int m_blockNumber; /障碍物(的数目CSnake m_snake; /背景上的蛇int *m_board; /背景的墙public:CTable();CTable();/初始化背景面板void InitialTable(int w,int h);/食物的操作bool AddBlock(int x,int y);bool AddFood(int x,int y);bool ClearFood(int x,int y);/物件获取CSnake* GetSnake(void);int* GetBoard(void);int GetData(int x,int y);/蛇的操作void SnakeMove(void);bool ChangeSnakeDirect(MoveState d);3.3函数设计3.3.1文件及函数组成文件及函数的组成以及函数的功能如表所示。这些函数是由三个源文件组成,main.cpp,snake.cp,table.cpp。main.cpp是总控所有的函数,初始化数据,使得整个函数得以运行,snake.cpp的内容主要是蛇类的成员函数,table.h的内容主要是对游戏场景的搭建,包括障碍物,墙体等。 3.3.2函数的详细设计 1.Initial voidCsnake:Initial()。功能:初始化游戏界面,初始化蛇身,将方向上下左右分别用4个键表示。参数:无。返回值:无。工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作为一个数组2.ChangeDirect void CSnake:ChangeDirect(MoveState d)。功能:改变蛇的移动方向参数:MoveState d返回值:无。工作方式:根据命令,调用相应函数,改变蛇的方向参数。3.CSnake:Move void CSnake:Move() 功能:使蛇移动。参数:无。返回值:无。 工作方式:读取当前蛇类数据,固定时间移动一段距离。 4. CSnake:AddBody void CSnake:AddBody() 功能:增加蛇身长 参数:蛇身长返回值:无。工作方式:读取蛇身长度,判断吃到食物成功后,蛇身长增加一个单元格长度。 5. CSnake:IsHeadTouchBody Int CSnake:IsHeadTouchBody() 功能:判断蛇是否出现自咬情形 参数:(x,y)蛇头位置 返回值:0 or 1 工作方式:判断蛇头当前位置是否有蛇身单元格,若为空,则返回0,否则返回1. 6. StartGame void StartGame() 功能:开始游戏 参数:无。返回值:无。7. GameAreaDraw void GameAreaDraw()功能:画场景。参数:无。返回值:无。4.代码 #include snake.hCSnake:CSnake(int x_pos,int y_pos,int len)if(len1) len=1;int i;m_length=len; /蛇的身体体长/初始化蛇的坐标位置m_pPos=new SPointm_length+2;m_pPos0.x=x_pos;m_pPos0.y=y_pos;for(i=1;im_length+2;i+)m_pPosi.x=0;m_pPosi.y=0;/初始化蛇的运动状态m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveStatem_length;m_oldSnake.body=new MoveStatem_length;for(i=0;im_length;i+)m_newSnake.bodyi=S_NONE;m_newSnake.bodyi=S_NONE;m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;/初始化蛇的位图显示状态m_pStateArray=new BitmapStatem_length+2;for(i=0;im_length+2;i+)m_pStateArrayi=M_NONE;CSnake:CSnake()SAFE_DELETE_ARRAY(m_pStateArray);SAFE_DELETE_ARRAY(m_pPos);/根据新旧两个身体的运动情况,返回当前应当显示的身体状态/BitmapState CSnake:GetRightState(MoveState oldDirect,MoveState newDirect)BitmapState res;switch(oldDirect)case S_NONE:switch(newDirect)case S_NONE:res=M_NONE;break;case S_UP:res=M_UP_UP;break;case S_DOWN:res=M_DOWN_DOWN;break;case S_LEFT:res=M_LEFT_LEFT;break;case S_RIGHT:res=M_RIGHT_RIGHT;break;break;case S_UP:switch(newDirect)case S_UP:res=M_UP_UP;break;case S_LEFT:res=M_UP_LEFT;break;case S_RIGHT:res=M_UP_RIGHT;break;break;case S_DOWN:switch(newDirect)case S_DOWN:res=M_DOWN_DOWN;break;case S_LEFT:res=M_DOWN_LEFT;break;case S_RIGHT:res=M_DOWN_RIGHT;break;break;case S_LEFT:switch(newDirect)case S_LEFT:res=M_LEFT_LEFT;break;case S_UP:res=M_LEFT_UP;break;case S_DOWN:res=M_LEFT_DOWN;break;break;case S_RIGHT:switch(newDirect)case S_RIGHT:res=M_RIGHT_RIGHT;break;case S_UP:res=M_RIGHT_UP;break;case S_DOWN:res=M_RIGHT_DOWN;break;break;return res;/改变方向/void CSnake:ChangeDirect(MoveState d) / 改变方向的条件:非对立方向 / 只能为其左,前,右方switch(d)case S_NONE:m_newSnake.head=d;break;case S_UP:if(m_newSnake.head!=S_DOWN) m_newSnake.head=d;break;case S_DOWN:if(m_newSnake.head!=S_UP) m_newSnake.head=d;break;case S_LEFT:if(m_newSnake.head!=S_RIGHT) m_newSnake.head=d;break;case S_RIGHT:if(m_newSnake.head!=S_LEFT) m_newSnake.head=d;break;/蛇移动/void CSnake:Move(void)int i;/1.计算新状态各个节点的状态/保存蛇身体各个部位的形状for(i=0;i0;i-)m_newSnake.bodyi=m_newSnake.bodyi-1;m_newSnake.body0=m_newSnake.head;/根据新旧状态特性取正确的状态m_pStateArray0=GetRightState(m_oldSnake.head,m_newSnake.head);for(i=0;i0;i-)m_pPosi=m_pPosi-1;/蛇头的新位置根据蛇的运动方向判断做相应偏移switch(m_newSnake.head)case S_UP:m_pPos0.y-=SNAKE_MOVE;break;case S_DOWN:m_pPos0.y+=SNAKE_MOVE;break;case S_LEFT:m_pPos0.x-=SNAKE_MOVE;break;case S_RIGHT:m_pPos0.x+=SNAKE_MOVE;break;/蛇的身体增长/void CSnake:AddBody(int n)/ 蛇的各种数据状态int i;Snake_Struct saveOldSnake,saveNewSnake;BitmapState *savestateArray;SPoint *savePos;/保存蛇的位置信息 / possavePos=new SPointm_length+2;for(i=0;im_length+2;i+)savePosi=m_pPosi;/保存蛇的状态信息/ 1.oldSnake/ 2.newSnake/ 3.stateArray /1saveOldSnake.head=m_oldSnake.head;saveOldSnake.body=new MoveStatem_length;for(i=0;im_length;i+)saveOldSnake.bodyi=m_oldSnake.bodyi;saveOldSnake.tail=m_oldSnake.tail;/2saveNewSnake.head=m_newSnake.head;saveNewSnake.body=new MoveStatem_length;for(i=0;im_length;i+)saveNewSnake.bodyi=m_newSnake.bodyi;saveNewSnake.tail=m_newSnake.tail;/3savestateArray=new BitmapStatem_length+2;for(i=0;im_length+2;i+)savestateArrayi=m_pStateArrayi;/将长度增长m_length+=n;/释放所有蛇的身体存储数据空间delete m_oldSnake.body;m_oldSnake.body=NULL;delete m_newSnake.body;m_newSnake.body=NULL;delete m_pStateArray;m_pStateArray=NULL;delete m_pPos;m_pPos=NULL;/创建并初始化增长后的蛇的数组m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveStatem_length;m_oldSnake.body=new MoveStatem_length;for(i=0;im_length;i+)m_newSnake.bodyi=S_NONE;m_newSnake.bodyi=S_NONE;m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;m_pStateArray=new BitmapStatem_length+2;for(i=0;im_length+2;i+)m_pStateArrayi=M_NONE;m_pPos=new SPointm_length+2;for(i=0;im_length+2;i+)m_pPosi.x=0;m_pPosi.y=0;/恢复原来长度的数据/a. newSnake ,oldSnake状态/b. stateArray/c. pos/am_newSnake.head=saveNewSnake.head;m_oldSnake.head=saveOldSnake.head;for(i=0;im_length-n;i+)m_newSnake.bodyi=saveNewSnake.bodyi;m_oldSnake.bodyi=saveOldSnake.bodyi;m_newSnake.tail=saveNewSnake.tail;m_oldSnake.tail=saveOldSnake.tail;/bfor(i=0;im_length-n+2;i+)m_pStateArrayi=savestateArrayi;/cfor(i=0;im_length-n+2;i+)m_pPosi=savePosi;/设置蛇头的坐标/void CSnake:SetHeadPos(int x,int y)m_pPos0.x=x;m_pPos0.y=y;/取蛇的状态标识数组/BitmapState* CSnake:GetStateArray(void)return m_pStateArray;/取蛇的位置数组/SPoint* CSnake:GetPos(void)return m_pPos;/取蛇身的长度/int CSnake:GetLength(void)return m_length+2;/检测蛇头是否触碰到其身体/bool CSnake:IsHeadTouchBody(int x,int y)int i;for(i=1;im_length+2;i+)if(m_pPosi.x=x&m_pPosi.y=y) return true;return false;/初始化 游戏结束后重新开始/void CSnake:Initial(void )/释放以前的所有存储空间SAFE_DELETE_ARRAY(m_pStateArray);SAFE_DELETE_ARRAY(m_pPos);/创建蛇身长度为1的蛇,并做各种初始化int i;int x = 0;int y = 0;/初始化蛇的坐标位置m_length=1;m_pPos=new SPointm_length+2;m_pPos0.x=x;m_pPos0.y=y;for(i=1;im_length+2;i+)m_pPosi.x=0;m_pPosi.y=0;/初始化蛇的运动状态m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveStatem_length;m_oldSnake.body=new MoveStatem_length;for(i=0;im_length;i+)m_newSnake.bodyi=S_NONE;m_newSnake.bodyi=S_NONE;m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;/初始化蛇的位图显示状态m_pStateArray=new BitmapStatem_length+2;for(i=0;im_length+2;i+)m_pStateArrayi=M_NONE;#include table.hCTable:CTable()m_width=m_height=0;m_foodNumber=m_blockNumber=0;m_board=NULL;CTable:CTable()if(m_board != NULL)SAFE_DELETE_ARRAY(m_board);/ 初始化背景/void CTable:InitialTable(int w,int h)/初始化Tableint i,j;/重新设置背景的高度与宽度m_width=w;m_height=h;/其他成员变量的初始化m_snake.Initial();if(m_board != NULL)SAFE_DELETE_ARRAY(m_board);/根据高度和宽度创建一个新的背景m_board=new int*m_height;for(i=0;ih;i+)m_boardi=new intm_width;for(j=0;jw;j+)m_boardij=0;/将背景四周设置为墙/将顶部跟底部的边缘设置为障碍物墙的状态for(i=0;ih;i+)m_boardi0=TB_STATE_SBLOCK;m_boardim_width-1=TB_STATE_SBLOCK;/将左部和右部的边缘设置为障碍物墙的状态for(i=0;i=0)&(x=0)&(y=0)&(x=0)&(ym_height)&(m_boardyx=TB_STATE_OK) ) m_boardyx=TB_STATE_FOOD;+m_foodNumber;return true;elsereturn false;/ 清除某个位置的食物/bool CTable:ClearFood(int x,int y)m_boardyx=TB_STATE_OK;return true;/ 获取蛇类/CSnake* CTable:GetSnake(void)return &m_snake;/ 取场景类对象/int* CTable:GetBoard(void)return m_board;/ 取场景某个位置数据/int CTable:GetData(int x,int y)return m_boardyx;/ 蛇的移动/void CTable:SnakeMove(void)m_snake.Move();/ 改变蛇的方向 /bool CTable:ChangeSnakeDirect(MoveState d)m_snake.ChangeDirect(d);return true;#include#include #includesnaker.h#includetable.h/游戏状态定义#define GAME_STATE_WAIT 0 /游戏等待状态#define GAME_STATE_RUN 1 /游戏运行状态#define GAME_STATE_END 2 /游戏结束状态/界面相关物件尺寸定义#define WALL_WIDTH 80 /外墙从左部到游戏区的宽度#define WALL_HEIGHT 80 /外墙从顶部到游戏区的高度#define BMP_SCORE_BOARD_WIDTH 256 /分数位图板的宽度#define BMP_SCORE_BOARD_HEIGHT 55 /分数位图板的高度#define BMP_WALL_WIDTH 16 /墙位图的宽度#define BMP_WALL_HEIGHT 16 /墙位图的高度LRESULT CALLBACK WndProc(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam);void DrawGame(void);void ShellDraw( HDC hdc );void GameAreaDraw(HDC hdc);void OnTimer(UINT uTIMER_ID);void StartGame( void );void EndGame( void );/创建一个背景CTable table;int tableBlockWidth = 0; /背景的单元格的宽度int tableBlockHeight = 0; /背景的单元格的高度int iScores = 0; /游戏的得分UINT uGameState = GAME_STATE_WAIT; /当前游戏状态HDC windowDC = NULL; /windows屏幕设备HDC bufferDC = NULL; /缓冲设备环境HDC picDC = NULL; /snake图像内存设备HDC endDC = NULL; /游戏终结图像内存设备HDC scoreDC = NULL; /分数板内存设备HWND hAppWnd = NULL; HBITMAP picBMP = NULL; /snake图像位图HBITMAP bufferBMP = NULL; /缓冲位图HBITMAP endBMP = NULL; /游戏终结图像内存HBITMAP hbmpWall = NULL; /墙位图HBITMAP hbmpScore = NULL; /分数板位图HBRUSH hbrushWall = NULL; /定时器标识UINT uSnakeMoveTimer; /蛇的移动UINT uFoodAddTimer; /食物的产生/框架的位置数据定义RECT g_ClientRect;RECT g_GameValueRect;int g_iClientWidth;int g_iClientHeight;int WINAPI WinMain(HINSTANCE hCurrentInst,HINSTANCE hPrevInstance, PSTR lpszCmdLine,int nCmdShow)WNDCLASS wndClass;HWND hWnd;MSG msg;UINT width,height;/定义窗口wndClass.style=CS_HREDRAW | CS_VREDRAW;wndClass.lpfnWndProc=WndProc;wndClass.cbClsExtra=0;wndClass.cbWndExtra=0;wndClass.hInstance=hCurrentInst;wndClass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_MAIN);wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndClass.lpszMenuName=NULL;wndClass.lpszClassName=Snake_CLASS;RegisterClass(&wndClass);/取整个屏幕的尺寸width=GetSystemMetrics(SM_CXSCREEN);height=GetSystemMetrics(SM_CYSCREEN);/新建窗口hWnd=CreateWindow(Snake_CLASS,skyblue snake,WS_POPUP,0,0,width,height,NULL,NULL,hCurrentInst,NULL);hAppWnd = hWnd;/显示窗口ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd); /获取窗体大小GetClientRect(hAppWnd, &g_ClientRect);g_iClientWidth = g_ClientRect.right-g_ClientRect.left;g_iClientHeight = g_ClientRect.bottom-g_ClientRect.top;/将游戏区域分成纵,横均为20块的单元格/并计算每个单元的大小tableBlockWidth = (g_iClientWidth-2*WALL_WIDTH)/20;tableBlockHeight = (g_iClientHeight-2*WALL_HEIGHT)/20;windowDC=GetDC(NULL);bufferDC=CreateCompatibleDC(windowDC);picDC=CreateCompatibleDC(windowDC);endDC=CreateCompatibleDC(windowDC);scoreDC=CreateCompatibleDC(windowDC);/位图的初始化或载入位图bufferBMP=CreateCompatibleBitmap(windowDC,g_iClientWidth,g_iClientHeight);picBMP=(HBITMAP)LoadImage(NULL,snake.bmp,IMAGE_BITMAP,160,80,LR_LOADFROMFILE);hbmpWall=(HBITMAP)LoadImage(NULL,brick.bmp,IMAGE_BITMAP,16,16,LR_LOADFROMFILE);endBMP = (HBITMAP)LoadImage(NULL,end.bmp,IMAGE_BITMAP,369,300,LR_LOADFROMFILE);hbmpScore=(HBITMAP)LoadImage(NULL,scoreboard.bmp,IMAGE_BITMAP,265,55,LR_LOADFROMFILE);SelectObject(bufferDC,bufferBMP);SelectObject(picDC,picBMP);SelectObject(endDC,endBMP);SelectObject(scoreDC,hbmpScore);hbrushWall = CreatePatternBrush(hbmpWall);StartGame();while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;LRESULT CAL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ata初级入门5线性回归模型估计
- FX2N系列可编程控制器通讯技术
- DNA的分子结构和复制中
- DNA分子的结构和复制讲课用
- CB安装形式及布局要点
- F匝道桥现浇连续箱梁
- 2026苏教二上第一单元教案
- 2026年桥梁工程《设计》模拟试卷
- 幼儿健康早操活动设计
- 2026年计算机二级室外设计试卷
- 2026年通信工程师初级题库
- 计量服务行业发展现状与趋势专题研究报告
- 中国胃镜检查与治疗指南(2026版)
- 雨课堂学堂在线学堂云《医学研究生临床研究(山东)》单元测试考核答案
- 系列微机保护测控装置保护逻辑调试说明
- 标准手册桔子酒店品牌手册
- 2025年安徽马鞍山江东颐养有限责任公司招聘笔试历年参考题库附答案
- 成都子归人才发展有限公司公开招聘工作人员考试备考题库及答案解析
- 甘肃省民航机场集团有限公司招聘笔试题库2026
- GB/T 19889.1-2026声学建筑和建筑构件隔声的现场测量第1部分:房间之间空气声隔声
- 特殊食品监管培训课件
评论
0/150
提交评论