已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+程序设计课程设计 俄罗斯方块C+程序设计课程设计报告俄罗斯方块专业学生姓名 班级学号指导教师完成日期目 录一、课程设计目的及要求11.1课程设计的目的11.2课程设计的要求1二、课程总体设计22.1需求分析22.2界面设计32.3系统功能32.4系统流程42.5功能模块5三、详细设计63.1界面框架63.2定时机制63.3定时处理83.4中断操作93.5旋转操作11四、调试与测试144.1未解决问题144.2调试过程14五、小结16六、参考文献17七、源程序清单187.1Game.h187.2Tool.h197.3BoxDlg.h197.4Game.cpp207.5BoxDlg.cpp29一、 课程设计目的及要求1.1 课程设计的目的俄罗斯方块是由阿列谢.帕基特诺发明的,Tetris游戏在一个m*n的矩形形框内进行的,矩形框的顶部会随机的出现一个有四个小方块组成的砖块,每过一段时间,就会下落一格,知道他碰到底部,然后再过一个时间下落另一个砖块,依次进行,砖块是随机出现的。当发现底部砖块是满的话,则消去它从而得到相应设置的分数,当砖块到达顶部的时候,游戏结束。选择俄罗斯方块进行C+面向对象程序设计课程设计主要是在学习C+这门面向对象语言的基础上,在完成C+面向对象程序设计各部分实验的基础上,通过学习MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C+面向对象程序设计语言特点的认识与理解。同时,可以提高运用C+编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。1.2 课程设计的要求要求用VC+设计与实现俄罗斯方块游戏。要求系统包括以下内容:(1) 系统的需求分析(2) 系统总框图及每个模块的设计分析(3) MFC应用程序架构(4) 框架的扩展(5) 算法的设计与实现(6) 游戏的内部实现(7) 游戏区域绘图的实现(8) 系统存在的问题及错误处理(9) 列出所有定义的函数及说明(10) 程序源代码。二、 课程总体设计1、2.1 需求分析最原始的俄罗斯方块由七个不同形状的碎块组成,而每个碎块又是由四个大小相同的方块构成,随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)。在落地之前,玩家需要通过旋转方块使方块以最合适的形态下落,用它们拼成没有空隙的行列,如此便完成消行,使得游戏有更大的空间可以继续下去。若在游戏中各形状堆积的高度超过了给定区域,为输者,游戏结束。游戏界面具有良好的视觉效果,将方块与背景颜色清晰的区分开来。高度与宽度适中,整体界面要具有一定的美感。(1) 游戏需求随着给出不同形状的(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满便消掉,若在游戏中填满了给定区域,为输者,弹出相应提示。(2) 游戏界面需求良好的用户界面,有关信息显示(如操作方法、等级等)。让方块在一定的区域内运动和变形,该区域用一种颜色表示,即用一种颜色作为背景,本游戏的颜色作为黑色。还需用另外一种颜色把黑色围起来,宽度适中,要实现美感。而不同的方块用不同的着色表示,使游戏界面更加清晰、有条理。消层时采用一定的时间延迟,增加视觉消行的感官效果。(3) 游戏方块需求良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或者逆时针变形,一般为逆时针。为体现游戏的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用类似的方法增加。(4) 游戏控制需求游戏控分为多各方面,包括画面控制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和削层以及计分等。对各个命令的合理处理和综合控制十分重要,一旦出错可能导致整个程序去崩溃,因此需要小心设计。2.2 界面设计在本系统中,简洁大方的界面设计能够有效提高用户体验。通过左右布局区分主游戏窗口与其他功能,右侧是开始/重新开始按钮、暂停按钮、积分/等级显示、下一个方块预览功能。游戏主体以灰为主色调,搭配窗口阴影设计,极大提高用户的游戏热情。2.3 系统功能俄罗斯方块虽是一款大家都熟知的小游戏,但仍需要对功能模块进行细致划分。遵循软件工程“自顶向下,由粗到细”的原则,保证系统的完备与高可玩性。俄罗斯方块游戏具有以下功能:(1) 方块预览功能当游戏运行后,并在顶部出现一个游戏方块时,必须在预览界面中出现下一个方块,这样便于玩家提前准备进行控制处理。(2) 方块控制功能游戏玩家可以对出现的方块进行移动处理,分别实现左移、右移、快速下移、自由下落和行满自动消除等功能的效果。(3) 更新显示功能当游戏进行方块移动处理时,要清除先前的游戏方块,用新坐标重绘游戏方块。(4) 分数更新功能能够实时显示玩家所得的分数与等级。每当玩家消除一行方块时计得100分,满1000分升一级。(5) 开始暂停功能玩家可以通过按钮暂停游戏,再次点击时继续游戏。再次点击开始按钮时重新开始新的游戏。2.4 系统流程俄罗斯方块游戏的执行过程是在当前方块为落到底部之前,可以对方块进行旋转、左右移动以及快速下落操作。方块堆积满一行则消去,如果接触到底部方块堆积碰触到游戏窗口顶端,则视为死亡(游戏结束),未死亡则生成新的方块。执行流程如下图:2.5 功能模块遵循自顶向下设计,将2.3中系统功能拆分成具体的功能模块逐个实现,能够提高开发效率并且有效减少错误率。(1) 定时机制MFC提供了计时器功能,实现建立计时器后,根据参数定义的时间步长触发定时处理时间,直到杀死计时器为止。俄罗斯方块的核心内容可以通过计时器实现,每隔固定时间,进行方块下落操作。当游戏结束或暂停时杀死计时器。(2) 定时处理在计时器操作事件中实现方块下落以及在下落过程中的方块操作。(3) 边界判断因为方格并不是规则的矩形,在左右移动以及积木堆积时需要根据形状判断是否可以进行当前操作,这是俄罗斯方块游戏的中最重要的部分。(4) 中断操作由于玩家的键盘操作是在计时器执行过程中触发,则使用键盘映射将上下左右四个按键映射为不同的四种操作(左移、右移、旋转和快速下落)。按键按下时执行中断,优先处理操作功能。(5) 旋转操作与左右移动快速下落不同,旋转需要对方块所在的4*4矩阵进行旋转操作,在这里使用先转置后水平对置操作实现。(6) 绘图实现随着计时器的触发,方块下落需要实时显示,所以通过重新绘图来实现动态显示方块情况以及分数功能。三、 详细设计2、33.1 界面框架界面使用灰色作为主色调,简单大方且能够清晰分辨方块位置。根据原型设计图制作出的游戏窗口如下图:3.2 定时机制围绕计时器为核心的俄罗斯方块,所以将单步下落执行操作写在OnTimer()中覆盖父类的方法,每次触发计时器则进行单步下落,具体实现方法见3.4定时处理。(1) 开始游戏并建立计时器代码void CBoxDlg:OnBnClickedButtonStart()game-Start();CString sData; / 显示级别和得分sData.Format(_T(%d), game-Level);GetDlgItem(IDC_STATIC_LEVEL)-SetWindowText(sData);sData.Format(_T(%d), game-Score);GetDlgItem(IDC_STATIC_Score)-SetWindowText(sData);SetTimer(1,game-TIME_STEP,NULL);(2) 暂停/继续操作代码void CBoxDlg:OnBnClickedButtonHalt()game-HaltOrContinue();if(game-GetState()=HALT)KillTimer(1);if(game-GetState()=GO)SetTimer(1,game-TIME_STEP,NULL);(3) 计时器触发操作代码void CBoxDlg:OnTimer(UINT_PTR nIDEvent)if(!game-Go()KillTimer(1);TCHAR *msg = _T(Game Over!);MessageBox(msg);CString sLevel,sScore; / 显示级别和得分sLevel.Format(_T(%d), game-Level);GetDlgItem(IDC_STATIC_LEVEL)-SetWindowText(sLevel);sScore.Format(_T(%d), game-Score);GetDlgItem(IDC_STATIC_Score)-SetWindowText(sScore);Invalidate(true);/ 重绘画面暂停与游戏结束的区别在于是否重置得分、等级与方块信息,在触发暂停按钮时通过杀死计时器但不重置数据来实现暂停,再次点击暂停按钮时重新建立计时器。3.3 定时处理MFC官方提供了OnTimer方法的处理操作,在这里自定义OnTimer方法覆盖父类方法。在OnTimer方法中操作Go()方块单步下落,并判定是否到达底端等。单步下落后判定是否死亡,死亡则杀死计时器并弹框提示“Game Over!”,未死亡则更新分数和等级并重新绘制画面进入新的循环。单步下落操作代码bool Game:Go()if(CanMoveDown()MoveDown();return true;elseAddTool(this-BigNet);RemoveLines();if(IsDead()state = STOP;return false;elseNextTool();return true;定时处理流程如下图所示:3.4 中断操作键盘映射“上下左右”四个按键来供玩家操作,对应功能分别是:旋转、左移、右移、快速下落。在执行操作前通过bool函数判断是否可以操作。开始/重新开始按钮与暂停/继续按钮触发计时器操作,当按下暂停时会杀死计时器,继续游戏时重新建立新的计时器。(1) 中断操作执行void CBoxDlg:OnKeyDown(UINT nChar)game-Input(nChar);Invalidate(true);/ 重绘画面(2) 按键映射代码BOOL CBoxDlg:PreTranslateMessage(MSG* pMsg)if(pMsg-message=WM_KEYDOWN)OnKeyDown(UINT)pMsg-wParam);return false;(3) 按键功能映射代码void Game:Input(UINT nChar) switch(nChar) case VK_UP : if(CanRoll() Roll() ;break; case VK_DOWN : if(CanMoveDown() MoveDown() ;break; case VK_LEFT : if(CanMoveLeft() MoveLeft() ;break; case VK_RIGHT: if(CanMoveRight() MoveRight();break; (4) 开始按键代码void CBoxDlg:OnBnClickedButtonStart()game-Start();CString sData; / 显示级别和得分sData.Format(_T(%d), game-Level);GetDlgItem(IDC_STATIC_LEVEL)-SetWindowText(sData);sData.Format(_T(%d), game-Score);GetDlgItem(IDC_STATIC_Score)-SetWindowText(sData);SetTimer(1,game-TIME_STEP,NULL);(5) 暂停按键代码void CBoxDlg:OnBnClickedButtonHalt()game-HaltOrContinue();if(game-GetState()=HALT)KillTimer(1);if(game-GetState()=GO)SetTimer(1,game-TIME_STEP,NULL);3.5 旋转操作因为方块定义的时4*4的二维数组,在进行旋转操作时需要先进行转置操作,再进行水平对置,能够保证所有的形状不会变形且稳定旋转。旋转前:旋转后:旋转操作代码:void Tool:Roll() / 滚动int tmp44;for(int i=0;i4;i+)for(int j=0;j4;j+)tmpij = _dataij;for(int i=0;i4;i+)for (int j = 0; j 4; j+) _dataij = tmpj3 - i;四、 调试与测试44.1 未解决问题在按住键盘“Down键”使方块快速下落时,窗口中的按钮会闪烁显示。经过查阅资料后得到一种解决方案:使用双缓冲机制。原理是建立一个缓存DC,将要画的图像先画在内存中,等画完之后再与前台内容交换,这样就能有效的消除图像闪烁。因为接触MFC时间太短,暂时没有掌握双缓冲机制的使用技巧,所以程序中未能解决该问题,希望在之后的时间里能够进一步完善该程序。4.2 调试过程调试工具Visual Studio 2017控制台:下断点调试:成功运行:五、 小结通过这段时间的课程设计,我的收获很大。尤其是在C+的实践操作这一方面,我相比之前有了很大的进步。这次的C+课程设计我被分到的题目是俄罗斯方块,拿到这个题目的时候感觉很熟悉,因为这个游戏在小的时候就玩过也很爱玩,但是在真正开始做起来的时候还是没有头绪。对于它的如何开发,如何变形以及它的其他具体功能实现,都不够那么了解。但是通过和同学之间的讨论以及向老师的请教,我慢慢的开始步入正轨,虽然后续也遇到很多大大小小的问题,但也成功克服了。这段时间的课程设计,也让我明白和感受到了很多,希望这次的经历能让我在以后的学习和生活中激励我不断进步。六、 参考文献1Ben Sawyer.游戏软件设计与开发指南M. 人民邮电出版社,1998.82钦科技. Visual C+游戏设计M. 科海电子出版社,2003.13坂本千寻. Visual C+专业游戏程序设计M. 中国铁道出版社,20044张德慧.周元哲.C+面向对象程序设计.科学出版社.2005 5刘长明. Visual C+实践与提高-多媒体篇.中国铁道出版社.2005 6宇鹏.王晓峰. Visual C+实践与提高-ActiveX篇.中国铁道出版社.2005 七、 源程序清单3、4、5、6、5677.1 Game.h#pragma once#include Tool.henum GAME_STATEHALT,/暂停GO, /工作STOP /停止;class Gameprivate:int *BigNet;int *SmallNet;GAME_STATE state; / 当前游戏状态:暂停/工作/停止Tool *tool; / 结构体指针Tool *nextTool;/ 积木位置,以4x4方格的左上角定义位置int Loc_X;int Loc_Y;public:static const int TIME_STEP = 500; / 下落速度static const int NET_WIDTH = 15; / 宽度static const int NET_HEIGHT = 20; / 高度private: void AddTool(int *net); / 将方块添加到堆中void NextTool();/ 引出下一个积木bool IsDead(); / 是否game overbool CanMoveDown(); / 是否可以下落bool CanMoveLeft(); / 是否可以左移bool CanMoveRight(); / 是否可以右移bool CanRoll(); / 是否可以旋转void Roll(); / 旋转操作void MoveDown(); / 下落操作void MoveLeft(); / 左移操作void MoveRight(); / 右移操作void RemoveLines(); / 多行消除(遍历执行RemoveLine(int index)void RemoveLine(int index); / 消除bool CanRemoveLine(int index); / 是否可以消除public:int Height; int Width;public:Game(int height,int width);Game(void);int* GetBigNet();int* GetSmallNet() ; GAME_STATE GetState();void Start(); / 开始bool Go(); / 运行一步,游戏结束时返回false void HaltOrContinue(); / 暂停或继续void Input(UINT nChar);7.2 Tool.h#pragma onceclass Toolprotected:int _data44; / 二维数组定义图形int _type; / 图形类型private:void Make_1();/-void Make_2();/ void Make_3();/ pvoid Make_4();/ qvoid Make_5();/ Zvoid Make_6();/ op_zpublic:Tool(int type);Tool(void);int GetType(); / 获取积木类型int *GetData(); / 获取积木数据void Roll(); / 旋转操作int* GetRollData(); / 获得旋转后的数据;7.3 BoxDlg.h/ BoxDlg.h : 头文件#pragma once#include Game.h/ CBoxDlg 对话框class CBoxDlg : public CDialogExprivate:/ 游戏,后台控制Game *game;/ 构造public:CBoxDlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_BOX_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV 支持/ 实现protected:HICON m_hIcon;/ 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()/-事件 -public:afx_msg void OnBnClickedButtonHalt();afx_msg void OnBnClickedButtonStart();afx_msg void OnTimer(UINT_PTR nIDEvent);/ 覆盖 父类方法virtual BOOL PreTranslateMessage(MSG* pMsg); / 键盘触发事件/-功能函数区-private:void DrawNet(); / 合并调用DrawBigNet()和DrawSmallNet()void DrawBigNet(); / 画大窗口void DrawSmallNet(); / 画小窗口void OnKeyDown(UINT nChar);7.4 Game.cpp#include StdAfx.h#include Game.h#include Resource.h#include Game:Game(int height,int width) / 构造函数初始化Width = width;Height = height;BigNet = NULL;SmallNet = NULL;tool = NULL;nextTool = NULL;state = STOP;Game:Game(void)delete(BigNet); / 析构函数,释放方格空间delete(SmallNet);int* Game:GetBigNet() / 获取大方格,返回内存空间int *result = (int *)malloc(sizeof(int)*Height*Width);AddTool(result);return result;int* Game:GetSmallNet()return this-SmallNet;GAME_STATE Game:GetState()return state;/ 开始void Game:Start()tool = NULL;nextTool = NULL;state = GO;Level = 1;Score = 0;TIME_STEP = 600;BigNet = (int *)malloc(sizeof(int)*Height*Width); / 开辟大窗口SmallNet = (int *)malloc(sizeof(int)*4*4); / 开辟小窗口for(int i=0;iHeight;i+)for(int j=0;jBigNet);RemoveLines();if(IsDead()state = STOP;return false;elseNextTool();return true;void Game:Input(UINT nChar)switch(nChar)case VK_UP : if(CanRoll() Roll() ;break;case VK_DOWN : if(CanMoveDown() MoveDown() ;break;case VK_LEFT : if(CanMoveLeft() MoveLeft() ;break;case VK_RIGHT: if(CanMoveRight() MoveRight();break;void Game:AddTool(int *net) / 创建一个新的积木if(net!=NULL & tool!=NULL & BigNet!=NULL)if(net!=BigNet)for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)neti*Width+j = BigNeti*Width+j;for(int i=0;i4;i+)for(int j=0;j=0 &i+Loc_Y=0 &j+Loc_XGetData()i*4+j)net(i+Loc_Y)*Width+j+Loc_X = 1;void Game:NextTool()/ 小窗口积木出场,更换新的积木,设置出场位置Loc_Y = 0;Loc_X = (Width-4)/2;tool = nextTool;/更新小窗口信息srand(unsigned int) time(0); / 初始化随机数种子nextTool = new Tool(rand()%6+1); / 生成下一个积木(类型随机传入)SmallNet = nextTool-GetData();bool Game:IsDead()int cnt1 = 4,cnt2=0,x = (Width-4)/2,y = 0;int *tmp = (int *)malloc(sizeof(int)*Height*Width);/ 复制一个副本,统计原有方块数+tool中的块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)tmpi*Width+j = BigNeti*Width+j;cnt1 += tmpi*Width+j;/ 假设发生变换for(int i=0;i4;i+)for(int j=0;j=0 &i+y=0 &j+xGetData()i*4+j)tmp(i+y)*Width+j+x = 1;/ 统计变换后方块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)cnt2 += tmpi*Width+j;delete(tmp);return cnt2!=cnt1;bool Game:CanMoveDown()int cnt1 = 4,cnt2=0,x = Loc_X,y = Loc_Y+1;int *tmp = (int *)malloc(sizeof(int)*Height*Width);/ 复制一个副本,统计原有方块数+tool中的块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)tmpi*Width+j = BigNeti*Width+j;cnt1 += tmpi*Width+j;/ 假设发生变换for(int i=0;i4;i+)for(int j=0;j=0 &i+y=0 &j+xGetData()i*4+j)tmp(i+y)*Width+j+x = 1;/ 统计变换后方块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)cnt2 += tmpi*Width+j;delete(tmp);return cnt2=cnt1;bool Game:CanMoveLeft()int cnt1 = 4,cnt2=0,x = Loc_X-1,y = Loc_Y;int *tmp = (int *)malloc(sizeof(int)*Height*Width);/ 复制一个副本,统计原有方块数+tool中的块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)tmpi*Width+j = BigNeti*Width+j;cnt1 += tmpi*Width+j;/ 假设发生变换for(int i=0;i4;i+)for(int j=0;j=0 &i+y=0 &j+xGetData()i*4+j)tmp(i+y)*Width+j+x = 1;/ 统计变换后方块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)cnt2 += tmpi*Width+j;delete(tmp);return cnt2=cnt1;bool Game:CanMoveRight()int cnt1 = 4,cnt2=0,x = Loc_X+1,y = Loc_Y;int *tmp = (int *)malloc(sizeof(int)*Height*Width);/ 复制一个副本,统计原有方块数+tool中的块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)tmpi*Width+j = BigNeti*Width+j;cnt1 += tmpi*Width+j;/ 假设发生变换for(int i=0;i4;i+)for(int j=0;j=0 &i+y=0 &j+xGetData()i*4+j)tmp(i+y)*Width+j+x = 1;/ 统计变换后方块数for(int i=0;iHeight;i+)for(int j=0;jGetRollData();/ 复制一个副本,统计原有方块数+tool中的块数for(int i=0;iHeight;i+)for(int j=0;jWidth;j+)tmpi*Width+j = BigNeti*Width+j;cnt1 += tmpi*Width+j;/ 假设发生变换for(int i=0;i4;i+)for(int j=0;j=0 &i+y=0 &j+xWidth &rollDatai*4+j)tmp(i+y)*Width+j+x = 1;/ 统计变换后方块数for(int i=0;iHeight;i+)for(int j=0;j0;i-)while(CanRemoveLine(i)RemoveLine(i);void Game:RemoveLine(int index)for(int i=index;i0;i-) / 要消除的行上面的所有行都向下移动1for(int j=0;jWidth;j+)BigNeti*Width+j = BigNet(i-1)*Width+j;for(int j=0;jWidth;j+) / 新出现的一行赋初始化0BigNetj = 0;Score = Score + 100;if (Score % 1000 = 0) Level+;/AllocConsole();/_cprintf(%d,%d,Level,Score);/FreeConsole();bool Game:CanRemoveLine(int index) / 遍历所有行,如果当前行中1的个数等于宽度(即整行都是1) 则消除int count = 0;for(int i=0;iRoll();void Game:MoveDown()Loc_Y+;void Game:MoveLeft()Loc_X-;void Game:MoveRight()Loc_X+;7.5 BoxDlg.cpp/ 继续与暂停按钮点击void CBoxDlg:OnBnClickedButtonHalt()game-HaltOrContinue();if(game-GetState()=HALT)KillTimer(1);if(game-GetState()=GO)SetTimer(1,game-TIME_STEP,NULL);/ 开始和重新开始按钮点击void CBoxDlg:OnBnClickedButtonStart()game-Start();CString sData; / 显示级别和得分sData.Format(_T(%d), game-Level);GetDlgItem(IDC_STATIC_LEVEL)-SetWindowText(sData);sData.Format(_T(%d), game-Score);GetDlgItem(IDC_STATIC_Score)-SetWindowText(sData);SetTimer(1,game-TIME_STEP,NULL);BOOL CBoxDlg:PreTranslateMessage(MSG* pMsg)/ TODO: 在此添加专用代码和/或调用基类if(pMsg-message=WM_KEYDOWN)OnKeyDown(UINT)pMsg-wParam);return false;/ 实现这个方法 定时器void CBoxDlg:OnTimer(UINT_PTR nIDEvent)if(!game-Go()KillTimer(1);TCHAR *msg = _T(Game Over!);MessageBox(msg);CString sLevel,sScore; / 显示级别和得分sLevel.Format(_T(%d), game-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030智慧农业种植行业市场供需情况投资评估竞争分析分析报告
- 2025-2030智慧农业物联网行业供需调研及行业创新规划分析报告
- 2025-2030智慧农业植物生长监测系统研究及遥感技术集成与环境胁迫模型分析报告
- 规模化供水工程管网延伸项目投标书
- 供水一体化项目申请报告
- 三年级生命安全教育测试题及答案解析
- 安全教育平台题库未加载及答案解析
- 货物从业资格证考试题库及答案解析
- 社区护理选择题库及答案解析
- 电力安全生产知识题库及答案解析
- 保安资格模拟考试100题
- 电力公司安全生产监督制度
- 2025广东深圳市特区建工招聘考前自测高频考点模拟试题及1套参考答案详解
- 中建三方协议书岗位
- 2025年及未来5年中国等离子手术刀行业市场调查研究及发展战略规划报告
- 保税区培训知识课件
- 2025危险化学品经营单位安全管理人员考试试题及答案
- 2025年河北省石家庄市公安辅警招聘知识考试题(含答案)
- 2025年介入心脏病学临床技能考核答案及解析
- 了凡四训-(课堂PPT)课件(PPT 33页)
- 工作分析(第二版)付亚和
评论
0/150
提交评论