




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、手把手教“MFC版贪吃蛇教程” 写在前而得话 本次贪吃蛇教程主要知识点包括以下几个方而 1 CView类中得消息响应 2控件得消息响应 3基于CView类内得具体游戏实现 4数组 5游戏图形得实现用CDC类实现。 本版游戏得具体实现就是在CViewl类中实现,所以苴她类不用添加任何代码。 由于此次贪吃蛇需要MFC得开发环境,所以打开VisualC+新建一个MFC AppWizard单文档 工程,随意取爼一个工程名称。 科韦- H奇冈-SS _ llclATLCOMAPPW!-殴l-i金Hr辰 sHHsi 匕 本次贪吃蛇基本流程与大体思想 1定义蛇类与食物类,初始化贪吃蛇各项成员变量,包括图像得
2、岀现在屏幕得初始位置,长度, 以及蛇得行龙方向。食物类得定义包括出现得初始位苣,以及食物就是否被吃掉得判断。 2用数组初始化长度为3得贪吃蛇,并且默认食物未岀现 3在CView类上运用MFC提供得Windows消息中WM_TIMER消息,运用OnTimcr()函数 让系统提供一个时钟节拍,更新游戏 4具体游戏实现,包括蛇撞到自己与国墙都将使游戏结朿,判断吃豆等,其中还包括根据蛇得 长度来进行游戏难度得改变。 5具体键盘游戏操作运用到Windows消息响应中得WM.KEYDOWN.ffl OnKcyDownO来响 应玩家得实际操作。 / 第一部分 首先在已有工程下得“ClassSew中右键CVi
3、ew类添加以下Windows信息 1 WM_KEYDOWN 2 WM.RBUTTONDOWN 3 WM.TIMER 再右键 CView 类选择 “ADD Virtual Funciton选 OnIniiialUpdatc() -SNAK.E 七! CAboutDIg * CMalnFrame * : CSNAKEApp * : CSNAKEDoc MCSNAKEVkw 二| Globals OWS an an 新Windows消息/事件: WM WM WM WM WM VZM WM CANCELMODE CAPTURECHAMGED CHAR CONTEXTMENU COPYDATA CREA
4、TE UtSIHVY 己存在的消息厚件句柄o WM KtYDOWN WM RBUTTONDOWN WM_TIMEH WM ERASEBKGND WM WM WM WM WM I WMJ WM VAI I WMJ WM I WM WMJ WM WMJ WM : 确定 Add Handler Add and Edit Edit Existing HELPINFO HSCROLL KE YUP KILLFOCUS LBUnONDBLCLK LBUnONDOWN L6UTTONUP MOUSEMOVE MOUSEWHEEL MOVE PAIMT RBUTTONDBLCLK HBUnONUP SETCU
5、RSOR SETFOCUS CSMAKEView ID APR ABOUT ID APR EXIT ID EDIT COPY ID EDITCUT MBVMV (y Class or object to handle: Filter for messages available to Child Window* WM_DROPFILES: Indicates when a file is dropped tsir OnInitialUpdate()得功能如下: 视图窗口完全建立后第一个被框架调用得函数。框架在第一次调用OnDraw前会调用 OnInitialUpdate,此OnlnitialU
6、pdate就是设置滾动视图得逻辑尺寸与映射模式得最合适 得地方 时间上,两者先后顺序不同,构造函数生成本类得对象,但没有产生窗口,OnCreate后窗口产生, 然后才就是视图得OnlnitialUpDatc,般在这里对视图得显示做初始化。简单点,就就是 ONCREATE只就是产生VIEW得基本结构与变量而在OnInitialUpDatc()中,主要初始化视图 中控件等。对各个变量进行初始化操作 所以我们要用这个函数来进行贪吃蛇得初始化工作 再者还要添加一个成员函数oninitO 进行贪吃蛇外观得初始化 控件得设计 再者就是设讣游戏得一些控件来控制“游戏开始游戏结朿与“游戏暂停“。 我们可以点击
7、“工作空间”得R亡SourceView “进行控件得具体设计,这里我们在Menu文件夹中 把TDR MAINFRAME中默认得控件全部删除 ISL u 自文件Q SH)16AO) IISV 担連IS) mil)旨口Q) WtoQi) | |A-I: ii rrnhfs. | 门 创3 E03口 IE 習 iH|cndl 二M 蔔遡总乙冈q 念虫也 SNMCf Wi22 Debug 1 o, 9 f I 0 1 o - 9 - 9 9 f 僉虫i! U 1 1 1 1 I 11 1 I | 11 -SNAKC resources _j Accelerator * j Dialog “Icon M
8、enu S IDRi.MMNrRAME* * j Siring Tnble Q Toolbar -_J Version 右键其中得标题栏,点击属性,会得到一个菜单栏标题,我们分别建立I个菜单栏标题。这里我 们分别建“游戏二 翻樹入工程(D迢建工貝B 口 QD COQSnakcVlcw J| |AII class mcfnbcrslj| *A$sertVlld 八 d m 茴MO人賂 固君喰ndl s Sii.:h込q七虫厨 m r)0 Snke Win32 Dnbun 创尊蛰层!创J| fflftOO兔于曲弋计厂 3 DO Srikc reaurcs Accelera1O4 二I Bitmap
9、 .J Dialog _jlcon 卜 tJMcnu Sj IDRMAJNb RAMb _J String Table _j Toolbar I Version 点击并且在已有控件中得列表中点击属性,进行菜单项目属性得设置我们本别建立得属 性“标明与对应得ID有 游戏开始IDM.START 游戏暂停IDM PAUSE 游戏继续IDM_CONTINUE 游戏退出IDM.EXIT 此处控件得设讣就是“可见即可得得控件操作 游渕 帮助01)关于此次设计 成功设置ID之后我们分别右键 各项属性进行消息响应处理函数得生成 具体方法操作例子如下 1右键“游戏开始 2点击“类向导建立“ 3在Message
10、Maps页而,在要进行消息响应得控件ID列表Object IDs中上选择对应得ID.这 里我们选择IDM.START,具体实现得环境就是CVievv类,所以我们必须把弋lassnanE得默 认YMamFnime改为CView类,并且在“Messages啖型设宜中,用“MANET设置为其为命令 消息。其余各项也按照同理进行设置。 Message Maps Member Variables Automalion | ActiveX Events | Class Info | Class name: 3 f DAMFCDQ_SnakeDQ_S nakeView.k D:t ADO_SnakeVi e
11、w.cpp Object IDs: idfileZsave ID_NEXf PANE ID_PRE#?ANE IDM CONTINUE IDM EXIT IDM PAUSE Project: DO_Snake CDQ SnakeView Messages: UPDATE COMMAND Ul Add Function Delete Function Edit Code W W V W 25 OnStart ON IDM START:COMMAND Member functions: OnKeyDownON_WM_KEYDOWN OnPauseON JD M_PAUSE:COMMAND OnPr
12、eparePrlnting OnRButtonDown ON WM RBUTTONDOWN 取消 Description: Handle a command (from menu, accel emd button 确定 FC Classiizard Message Maps Member Variables | Automation | ActiveX Events | Class Info | Project:Class name: SNAKE|cSNAKView” D:MFCS NAKESNAKView.h. D :IMFCS MAKESN AKE View, cpp Object ID
13、s:Messages: Add Class. Add Function. Delete Function Descfiption:Handle a command (from menuz accel cmd button Edit Code PSAVindows消息得分类有3种,标准消息,命令消息,通告消息 1标准消息除MAND之外,所以开头都就是标准消息 2命令消息就就是MAND 3通告消息由控件产生得消息,这类信息也能以WM.MAND类型出现 最后我们回到原来得ClassView去瞧瞧我们一共添加得函数 超 SNAKE da:On!iraer / fObO: A void CSHAKEUl
14、e: : OnRftut torvbown (UI HIr CPoin-t poi h ) Jf TODO: Pdd Hour nc号lin-dlpr code horo n; ubid CSHAKEUlw: : Ohl nit iiLUpcid2() CUiew:Bnlnlt ialUptf; Jf TODO: ftdd your sprcidl izrrt codr hrrr .ind/or call the iMsr 门刖 void CSHAKFUie:OnStart 匚舉 SNAKE classes 审七 CAboutDIg 厚 弋 CMainFrame i CSMAKEApp 由七
15、CS NAKED oc 白 FcsnakevT AssertValidQ % CSNAKEViewO Q TSNAKEViewQ Dump(CDumpContext int len; int direct; Snake50; simaFood ini x; iEy; in 二 sfood 一 )Food; SNAKEfi.1黑益 s * .CAbQ22g *J:CMdhFy! Assertva-ido f rQzAk Fwimfl 、./ SNQKEUieccpp “ imple 杲nrarrio?O+Hbe cszQKEUiesCLass z include 5rddfxh inpd:SHA
16、Km HifwJLude SHAKEDOC 7 include SNnKEUieEh= OCM4G JCSN 矣 Evig DumpnDump Context 8 GiDocufnena onBcgFprF亍 g-CDC ; 05no5K3CQS onDraMCDCmq 貿 oflEodprs-Hng-CDC FonEXs enins Ordn 三w-upd Snakeflh y=10; Snake2h x=12; Snake2 y=10; Snake0h direct=3; SnakefOh len=3; Food、isfood=l; / TODO: Add your specialized
17、 code here and/or call the base class void CSHAKEUiew:OnInitialUpdate() CUiew:OnInitialUpdate(); Snake0.x=10; SnakeQ.y=10; Snake1 .x=11; Snake1.y=16; Snake2.x=12; Snake2.y=1B; Snake0.direct=3; Snake0.len=3; Food.isFood=1; / TODO: Add your specialized code here and/or c 代码说明: 初始化贪吃蛇起初有3个盯点,长度为3,起始坐标;
18、 食物默认为I无0有当然我更加喜欢0无I有 Step 2对OnKcyDownOH体添加代码 void CSNAKEView:OnKeyDown(UINT nChar. UINT nRcpCnt. UINT nFlags) / TODO: Add your message handler code here and/or call default switch(nChar) case VK_UP:if(SnakeOx direct!=2)Snake0 direct=l;break; case VK_DOWN:if(Snake0 direct!=l)SnakeO direct=2;break; c
19、ase VK_LEFT:if(SnakeOx direct!=4)Snake0. direct=3;break: case VK_RIGHT:if(SnakeOx direct!=3)Snake0 dircct=4;break; CView:OnKcyDown(nChar, nRepCnt, nFlags); CView:OnKcyDovn(nChar, nRcpCnt, nFlags); void CSHMKEVtew: :OnKeyDatn(UINT nCItdr, WINT nRepCnt t lllHT M ldg w-ssage handLer code here ana/or ca
20、ll n TODO: Add switch(iiCh2:bre-ilt: 当址头不的 淇. case UKLEU :F(Snake|a.di-e:t f*)Snake|O.direcL-3;br4ilc; 当妁头木冏|右购尺 俟. Cist UK_R16HI:i f (Siiakr 0. Jirec 23$Mke町山吿蛇头木商左騎E族, CUiw: :0hKc9Down( nrh.n . iKe|Cnl 9 i ):; CUiew: :OnKryOaMri( nCfua- v nHepCfil F nF Lag ); OnKeyDown函数得第一个参数UINT nChar就是接收用尸键入得信息
21、,然后我们用switch 进行选择判断 代码说明: SnakeO)代表得就是蛇头,我们对蛇头得方向SnakcO、direct进行判断。 case VK_UP:if(SnakeOx SelectOb ject ( for (int i=0;iRectangle(snake.il、x*20, snakei、y*20, (snakeix+1)*20, (snakei、y+l)*20); pDC-SelectObject(DrawBrush); void CSNAKEUiew;oninit() Selectabject(CcDraupBrush); for(int i=8;iRectangle(Sna
22、kelSnakef i.y*20f(Snakei.x1)*2C(Snakei-y1)20) pDC-SelectObject(DrauBrush; 代码说明: 利用Windows给我们提供得CDC类来进行画图,我们首先用一个指向CDC类得指针去接受与 该窗口相关联得DC句柄,然后用定义画刷一个DrawBrush对象,并且用RGB(100, 100, 100)来 给画刷初始化颜色。并且用SelectObject (函数把对象画刷选入到设备描述表 中,用for循环依次把贪吃蛇得3个节点画岀来。 void far rectangle(int left, int top, int right, int
23、 bottom); 这个函数得得功能根据 函数功能:该函数画一个矩形,用半前得画笔画矩形轮屎,用当前画刷进行填充、 Step 5控件添加代码 void CSNAKEView:OiiStart() / TODO: Add vour mand handler code here SetTimer(l,3000,NULL); AfxMessageBox(n3 秒后开始游戏!”); void CSNAKEView:OnPause() / TODO: Add vour mand handler code here KillTimer(l); AfxMessageBox(ng停游戏、.”); void C
24、SNAKEView:OnExit() / TODO: Add vour mand handler code here AfxMessageBox(n退出游戏、H); exit 0; void CSNAKEView:OnContinue() / TODO: Add vour maud handler code here SetTimer(iaO,NULL); uoid CSNAKEUiew:QnStart() ; uoid CSNAKEUiew:OnExit() / TODO: Add your command handler code here AfxMessageBox(iB 游戏结東 ex
25、it 9; uoid CSNAKEUievi: :OnContinue() / TODO: Add your command handler code here SetTimer(1,10,NULL); 代码说明: 由于之前我们设左了 WM_TIMER消息,我们能运用汁时器功能 用WM_TIMER来设宜怎时器 先请瞧SetTimer这个API函数得原型 UINT.PTR SetTimer( HWND hWnd, / 窗口句柄 UINT.PTR nIDEvent. /左时器ID.多个定时器时,可以通过该ID判断就是哪个左时器 UINT uElapse. 时间间隔,单位为亳秒 TIMERPROC
26、IpTimcrFunc / 回调函数 ); SetTimer(m_hWnd. L1000.NULL); / 一个 1 秒触发一次得左时器 在MFC程序中SetTimer被封装在CWnd类中,调用就不用指左窗口句柄了 所以我们这里可以只去后3个参数写成SetTimer( 1,10,NULL); 100()为1秒 关于afxMessageBox得研究在本博客中有写有,这里就不在赘述 Step 6对OnDrawO得添加代码 OnDrawO函数众所周知视图类中得输岀、视图类得输岀基本上都就是在视图类得OnDraw函 数中处理得,系统会准备好入参,然后调用OnDraw函数 本人也没有过多得去研究过次函数
27、,仅知道一些皮毛。不过这里有个知识点那便就是 OnPaint 0 与 OnDrawO 得区别,OnPaint ()派生于 CWnd 类,响应 WM_PAINT 消息。OnDraw 就是 CVi类得成员函数,并且没有消息响应功能,这就就是为什么视图类没有只有OnDraw()而 没有OnPaint ()得原因。OnDraw 0维护视图客户区(例如通过试表在视图中画图),而 OnPaint 0维护窗口得客户区 void CSNAKEView:OnDraw(CDC* pDC) CSNAKEDoc* pDoc 二 GetDocument(); ASSERT3rALID(pDoc); / TODO: ad
28、d draw code for native data here CBrush backBrush(RGB(100,100,0); CBrush* pOldBrush = pDC-SelectObject ( CRect rect; pDC-GetClipBox(firect); pDC-PatBlt (rect x left, rect. top, rectx WidthO, rect Height 0, PATCOPY); pDC-SelectObject(pOldBrush); pDC-Rectangle( 19,19,501,501): oninit(); 代码说明: 此处就是用画刷画
29、一个背景,并且画出3个矩形区域 函数原型:int GetClipBox(HDC hdc. LPRECT lprc); 该函数得到一个能够完包含当前可见区域得最小矩形得大小。 函数原型:im nYLeft, int nWidth, int nHcight, DWORD dwRop); 该函数使用当前选入指怎设备环境中得刷子绘制给定得矩形区域。 Step 7对OnTime 0得添加代码 void CSNAKEView: :0nTimer (UINT nIDEvent) / TODO: Add your message handler code here and/or call default CD
30、C *pDC=GetDC(); CString soure; 辻(Snake 0 len=2) SetTimer (1, 370, NULL); 辻(Snake Oh len=3) SetTimer (1, 270, NULL); if (Snake 0、len=6) SetTimer (1, 200, NULL); if (Snake 0、len=9)SetTimer (1, 100, NULL); soure. Format C得分:%d!*, (Snake 0 % len-3) *10); 撞界判断 if(Snake0、 x*20=37|Snake0, y*20=462|Snake0 y
31、*20=462) KillTimer(l); AfxMessagcBox(soure); / s=0; 蛇身相撞判断 辻(Snake0lcn3) for(int sn=Snake0、 len-l;sn0;sn) if (Snake 0 x*20=Snakesn x*20 AfxMessageBox (soure); / s=0; / pDC-SelectStockObject(WHITE_PEN); pDC-Rectangle (Snake Snake Oh lenTh x*20, Snake Snake 0. len-1 % y*20, (SnakeSnake0len-1 x+1)*20,
32、(SnakeSnake0len-1% y+1)*20); for (int i=Snake0 len-1;i0;i) Snake in x=SnakeiT、x; Snakei、y=SnakeiT、y; 行走方向判断 辻(Snake Oh direct=l) Snake 0、y一; if (Snake Oh direct=2) Snake 0、y+; if(Snake0 direct=3)Snake0 x; if (Snake 0 direct=4) Snake 0 x+; pDC-SelectStockObject(BLACK.PEN); CBrush Drarush=(RGB(100, 10
33、0, 100); CBrush 和rawbrush=pDC-SelectObject( pDC-Rectangle (Snake 0 x x*20, Snake Oh y*20, (Snake 0 % x+1) *20, (Snake 0 y+l)*20); pDC-SelectObject(DrawBrush); 判断吃豆得条件,撞到就吃 if (Snake 0 x*20=Food x*20 Food- isfood=l; SnakeSnake0s len-1s x二SnakeSnake0、 len-2s x; SnakeSnake0 len-1x y=SnakeSnake0len-2、 y
34、; 如果食物被吃了就生成 if (Food. isfood=l) srand(unsigned)time(NULL); do for (int isfo=Snake0% len-1;isfo=0;isfo) if(Snake0 x*20=Snakeisfox x*20 Food、y=rand()%; whilc(Food、x*20430IIFood、y*20430); pDC-Rectangle(Foodx*20、Food、y*20,(Food x+l)*20.(Food、y+1)*20); Food、isfood=0; CView:OnTimer(nIDEvent); ) uoid CSNf
35、iKEUiew:OnTimpr(UrHT nIDEvent) J J TODO: Add your nessagp handler code here and/or call default CDC *pDC=GetDC(); CString soure; if(Snake0.len=2)SetTinier(1 ,370,NULL) ;/*Q速*/ ifSnake0.len=3)SetTiner(1,270,NULL); if(Snake0.lpn=6)SetTiner(1,200,NULL); lf(Snake0.len=9)SetTiiner(1,100,NULL); soure F你得到
36、了 :d?e(Snake 9 .len-3)*1 0); 撞界判断 lf(SnakeO.x*20=37|Snake0.y*20=H62|Snake0y*20462) KillTlner(l); AfxMessageBox(SGure; 方蛇身相撞判断 if(Snal3) for0;sn) ; fifxMessageBox(soure); / pDC-SelectStockObjpct(UHITEMPEH); pDC-Rectangle(SnakpSnake8.len-1.x*20,SnakeSnake0-len-1.y20, (SnakeSnake0.len-1 .x* 1)*20,(Snak
37、eSnlSelectStockObject(WHITEPENJ; pPRectangle(Snakef SnakeOj.Een-1 .?*20wSnake$nake0.I en-1) .y*2f (SnakeSnale0.len-1 .x*1)28,(SnakeSriake0 .len-1 .y *1 )O;i-) 0 .dirrct1 )SnakeO .y; if (SnakeO) .direct2) SnakeOy; if(SnakeO .direct*3)Snake6.x一; if(SnakeO).direct=4)Snake0.*; pDC-SelectStockObject(BLAC
38、KPEN); CBrush DraiLiBruh(RCa(1 00.160.180); CBrush *Dravrt)rush=pDC*SelectObJect(tcDrawBrush); pDC-Rpctangle(Snake 0 .x*20Snake 0.y*2B(Sniakp6x*1)*2 0 (Snakp 0)20); pDC-SelectObject(DravBrush); 判断吃豆的条件,撞到就吃 iF(Snake9.x20s=Faod.x*20R6Snake0.y*26=Faod Snakef 0 .len*; Food-i sfood=1: SnakeSnakeQ.Len-1.
39、-SnakeSnakeO.Len-2.x; Snake$nakeO.i.pn-1 t|F=SnakeSndke4.len-2 j .y; 方如杲食物被吃了就生成 iF(Food.isfood1) srand(unsigned)tine(HULL); do LJ ( i nn/c、 iw(All class membersljJ OnTimer二虽 令 C5H v |4* void C5MAKEViex: .0nrinier ftfINT nlMvent) 一刁谋箕物栽生歳 if (Food.isf ooJ1) srand(unsigned)tirwNULL); do 0;isFo*-) if(
40、Snake0.x*28-Snakeisfo.x*20 Food.is F ood 0; CUiew: :OfiTiner len=2)SetTimer(l ,370,NULL); if(SnakeO len=3)SetTimer( 1,270,NULL); if(SnakeO len=6)SetTimer( 1,200,NULL); if(SnakeO len=9)SetTimer( 1,100,NULL); 此段代码得作用就是根据蛇得长度来进行SetTimerO函数得泄义,可以根据长度来进行游戏 难度得设定如上代码分别370ms 270ms 200ms lOOms进行一次新得移动。 撞界判断
41、 if(SnakeOh x*20=37IISnake0J. y*20=462IISnake(0. y*20=462) KillTimer(l); AfxMessageBox(soure); 这里为什么要乘以20呢?由于我们初始化得时候就是 SnakefO x=10; Snakc0| y=10; Snakeflx=l 1; Snakcl y=10; Snakc2 x=12; Snakc2 y=10; 所以只就是把贪吃蛇得起始位置,搬移“到20倍得位置当然可以等价于 Snakc0h x= 10*20 SnakefOh y=I0*20 Snakeflh x= 11*20 Snakcflh y= 10
42、*20 Snakc2h x= 12*20 Snake2x y= 10*20 蛇得一肖身体为一个矩形块,这样表示每个矩形块只需起点坐标x与y身体就是不断增长得, 所以用数组存放每一节得坐标 蛇身相撞判断 if(Snake0 len3) for(int sn=Snake0、lcn 1:sn0:sn-) if(SnakeO x*20=Snakcsn x*20 AfxMessageBox(soure); / s=0; 这段就是最好理解得了,由于判断蛇自己就是否咬到了自己,根据蛇长sn,进行sn次for sn-1次 循环 并且与Snakc0、x进行比较(之所以进行sn-1次那肯定就是不包括蛇头而且蛇得长
43、度也必 须大于3才会发生自己咬自己得情况) KillTimer(l):就是停止计时器;与之前得SetTime()对应而已 AfxMcssagcBox(sourc);这里不深究,总之就就是输出一个原样输出内容 pDC-SelectStockObject(WHITE_PEN)y/ft!白色得“PEN选入设备进行画图 pDCRectangle(SnakcSnakeO、len-1、x*20,SnakeSnake0, len-1 y*20. (SnakeSnakeOx lcn-1、x+1 )*20.(SnakeSnake0 lcn-1、y+l)*20)y/it它去画最后一个节 点 for(int i=Snake0. len-l;i0;i-)/贪吃蛇得蛇身移动 Snakci、x=Snakei-lx x: Sna
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 锂电池回收拆解再生利用项目初步设计(参考)
- 垃圾发电厂炉渣扩建项目初步设计(仅供参考)
- 河道生态修复工程实施方案(范文)
- 贵重金属循环利用项目实施方案(范文参考)
- 共享单车电子围栏实施方案
- 安全教育专题分享
- 苏教版剪枝的学问课件设计
- 浙江省宁波市五校联盟2023-2024学年高一上学期期中联考语文 含解析
- 广东省清远市四校联盟2023-2024学年高二上学期期中联考物理含解析
- 南昌医学院《行政组织学》2023-2024学年第二学期期末试卷
- 机械制造及其自动化专业毕业设计(1)解读
- 网红文化传媒有限公司制度
- 4.2依法履行义务 说课课件(共19张PPT)
- 老年血液透析患者特点和安全性评估方案
- a10c疣猪飞行控制器中文说明书
- 发货装箱单Detail Packing list
- 食品卫生微生物学检验阪崎肠杆菌
- 专业分包招标文件范本
- 换热站验收方案
- (完整word版)桩位偏差验收记录表
- 重介质旋流器单机检查
评论
0/150
提交评论