版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
信息科學與工程學院軟件實踐實訓報告實訓報告飛機大戰(zhàn)游戲設計與開發(fā)高學凱專業(yè)名稱:軟件工程班級:12級2班學號:1201050907信息科學與工程學院二零一四年十月目錄1.概述 32.相關(guān)技術(shù) 32.1文字顯示 32.2貼圖與透明特效 42.3排序貼圖實現(xiàn)爆炸動畫 42.4鍵盤消息響應 52.5定時器的使用 52.6雙緩沖技術(shù) 52.7碰撞檢測技術(shù) 62.8CObList類 72.8內(nèi)存釋放 73.需求分析 74.總體設計與詳細設計 84.1系統(tǒng)模塊劃分 84.2主要功能模塊 94.3擴展功能設計思路 104.4軟件結(jié)構(gòu)設計體會 105.編碼實現(xiàn) 105.1類對象的實現(xiàn): 105.2系統(tǒng)功能模塊的實現(xiàn) 235.3游戲規(guī)則模塊的實現(xiàn) 295.4計時器回調(diào)函數(shù) 436.測試情況說明。 447.實訓中遇到的主要問題及解決方法 448.實訓收獲與體會 451.概述本次實訓主要是做一個基于MFC的飛機大戰(zhàn)游戲,其實現(xiàn)的主要功能為:實現(xiàn)游戲?qū)ο蟮谋ㄌ匦?,文字提示功能和界面背景切換特效,其主要是遵循開發(fā)者規(guī)定的游戲規(guī)則進行游戲闖關(guān)。主要的游戲主要角色:戰(zhàn)機、敵機、戰(zhàn)機導彈、敵機子彈,戰(zhàn)機用方向鍵控制移動,有十點生命值,被擊中一次扣一點,有兩種不同的武器:子彈(“Z”鍵)和導彈(“X”鍵),子彈有三個等級,每個等級都有不同的發(fā)射效果,導彈只有一個等級但傷害高,武器有最大載彈量:500發(fā)子彈和若干發(fā)導彈,敵機有三種:普通敵機,中級敵機和Boss敵機,其中普通敵機包含上下兩個方向出現(xiàn)的情況,中級敵機只能在上方出現(xiàn)但是血量高,Boss在第一關(guān)出現(xiàn),有更加強大的火力。對敵方造成一點傷害便獲得一分,敵機的出現(xiàn)速度會根據(jù)得分的高低而發(fā)生變化,在游戲的過程中還會出現(xiàn)補給箱,可以增加子彈和導彈的彈藥并獲得一點生命值的獎勵,“P”鍵可以暫停游戲,戰(zhàn)機被擊毀則可以選擇退出或者重新開始。2.相關(guān)技術(shù)關(guān)鍵技術(shù):文字顯示、貼圖與透明特效、排序貼圖實現(xiàn)爆炸動畫、鍵盤消息響應、定時器的使用、雙緩沖技術(shù)、碰撞檢測技術(shù)、內(nèi)存釋放。2.1文字顯示在CView類中建立函數(shù)Showinfornation();用來顯示各項游戲信息;voidCtest1View::Showinformation(){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return;//獲取CDoc類里的文件; CClientDCDC(this);獲取當前DC; CRectrect; this->GetClientRect(&rect);//獲取屏幕大??; if(1) { CStringbuffer; MemDC.SetTextColor(RGB(255,0,0));//用來初始化文字格式; MemDC.SetBkMode(TRANSPARENT);//用來初始化文字顯示方式; buffer.Format(_T("得分:%d"),pDoc->plan1.score);//初始化文本內(nèi)容 MemDC.TextOutW(10,20,buffer);//輸出文字; //只列舉得分的現(xiàn)實; } DC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);//繪制到緩沖圖層;}2.2貼圖與透明特效intdraw(CDC*pDC){CDCmemDC;//定義一個兼容DC memDC.CreateCompatibleDC(pDC);//創(chuàng)建DC CBitmapbmpDraw;//創(chuàng)建位圖; bmpDraw.LoadBitmap(IDB_PLANEME);//裝入DDB CBitmap*pbmpOld=memDC.SelectObject(&bmpDraw);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-25,pos.y,50,60,&memDC,0,0,50,60,RGB(0,0,0));//使用該函數(shù) memDC.SelectObject(pbmpOld);//選入原DDB}2.3排序貼圖實現(xiàn)爆炸動畫以Cbaozha類為例,在Cbaozha類的頭文件Cbaozha.h中:定義靜態(tài)變量:staticCImageListimagelist;定義函數(shù):staticintloadimage();//用來裝載位圖;在cpp文件中:intCbaozha::loadimage(){ //CRectrect;// //GetClientRect(&rect);// CBitmapbmp; if(!bmp.LoadBitmap(IDB_Baozha1)) return0; if(!imagelist.Create(66,66,ILC_COLOR24|ILC_MASK,8,0))//裝載位圖; return0; imagelist.Add(&bmp,RGB(0,0,0)); return0;}建立draw函數(shù)來繪制爆炸效果;intCbaozha::draw(CDC*pDC){ if(exist) { imagelist.Draw(pDC,index,pos,ILD_TRANSPARENT);//其中index用來表示繪制CImageList對象imagelist中圖像鏈表中的第幾張圖片; index=(index+1)%8;//爆炸動畫共有8張圖,順序播放可實現(xiàn)動畫效果; } return0;}CImageList鏈表中的圖像顯示在pDC這個句柄中。ILD_TRANSPARENT表示是透明貼圖。其中主要就是CImageList圖像列表。它是相同大小圖像的一個集合,每個集合中均以0為圖像的索引序號基數(shù),圖像列表通常由大圖標或位圖構(gòu)成,其中包含透明位圖模式。2.4鍵盤消息響應用函數(shù)GetKeyState(VK_LEFT);可獲取方向鍵左鍵的按鍵信息,若GetKeyState(VK_LEFT)<0則表示該鍵被按下,VK_LEFT為鍵盤的虛擬鍵值,其余按鍵可查虛擬鍵值表可得;2.5定時器的使用定時器告訴WINDOWS一個時間間隔,然后WINDOWS以此時間間隔周期性觸發(fā)程序。通常有兩種方法來實現(xiàn):發(fā)送WM_TIMER消息和調(diào)用應用程序定義的回調(diào)函數(shù)。使用函數(shù)SetTimer(1,30,NULL);可設置一個定時器,代號為1,時間間隔為30毫秒。2.6雙緩沖技術(shù)先創(chuàng)建一個內(nèi)存DC,然后把畫圖都畫在內(nèi)存DC中,最后再一次性的將內(nèi)存DC輸出到窗口DC中,可以解決畫面閃爍的問題。首先在CView頭文件中定義:CDCMemDC;//定義一個顯示設備對象;(雙緩沖);CBitmapMemBitmap;//定義一個位圖對象;(雙緩沖);然后在cpp文件中初始化緩沖DC:if(MemDC.m_hDC==NULL){ MemDC.CreateCompatibleDC(NULL); CClientDCDC(this); CRectrect; this->GetClientRect(&rect); //建立一個與屏幕顯示兼容的位圖; MemBitmap.CreateCompatibleBitmap(&DC,rect.Width(),rect.Height()); MemDC.SelectObject(&MemBitmap); }從CView類添加消息WM_SIZE,在添加的OnSize函數(shù)中:if(MemDC.m_hDC!=NULL) { MemBitmap.DeleteObject(); MemDC.DeleteDC(); } MemDC.CreateCompatibleDC(NULL); CClientDCDC(this); CRectrect; this->GetClientRect(&rect); //建立一個與屏幕顯示兼容的位圖; MemBitmap.CreateCompatibleBitmap(&DC,rect.Width(),rect.Height()); MemDC.SelectObject(&MemBitmap);即可使緩沖DC適應窗口的大小改變;后續(xù)的對象在繪制的時候直接繪制到緩沖DC,如:pDC->TransparentBlt(pos.x-25,pos.y,50,60,&memDC,0,0,50,60,RGB(0,0,0));//其中memDC為緩沖圖層。最后通過DC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);繪制到屏幕;如果最后一個參數(shù)是SRCCOPY(Copiesthesourcebitmaptothedestinationbitmap)大概功能是位圖的移動用。它是將一幅位圖從一個設備場景復制到另一個,源和目標DC相互間必須兼容。2.7碰撞檢測技術(shù)對于每一個需要進行碰撞檢測的對象都建立CRect對象用來表示它的碰撞范圍,在繪制對象的時候用函數(shù)SetRect(rect,pos.x-25,pos.y,pos.x+25,pos.y+60);來確定碰撞范圍的大小,其中rect為對象的CRect對象,pos為對象的位置。然后建立函數(shù):boolCollisionDetection(CRectrect,CPointpoint)來判斷一個CRect對象和一個CPoint點是否有交集,是則返回true,否則返回false。重載函數(shù)boolCollisionDetectio(CRectrect1,CRectrect2)來判斷兩個CRect對象是否有交集,是則返回true,否則返回false。boolCollisionDetection(CRectrect,CPointpoint){ if(point.x>=rect.left&&point.y>=rect.top&&point.x<=rect.right&&point.y<=rect.bottom) returntrue; else returnfalse;}boolCollisionDetectio(CRectrect1,CRectrect2){ if((rect1&rect2).IsRectEmpty()) returnfalse; elsereturntrue;}2.8CObList類CObListm_ObjListball;//主要是定義一個CObList類的一個鏈表對象用于存儲所有的此種相關(guān)的對象,易于后續(xù)的添加刪除和提取數(shù)據(jù)。POSITIONposball=NULL,posball_t=NULL;//定義指針posball=pDoc->m_ObjListball.GetHeadPosition();//指針讀取頭結(jié)點pDoc->pball=(Cball*)pDoc->m_ObjListball.GetNext(posball);//指針讀取下一個結(jié)點2.8內(nèi)存釋放內(nèi)存釋放技術(shù)的實現(xiàn)主要是通過釋放各個滿足一定條件的對象和鏈表來實現(xiàn)的,pDoc->m_ObjListBomb.RemoveAt(mPos2);用于刪除指針 deletepDoc->Bomb;用于刪除對象3.需求分析3.1功能需求分析1、戰(zhàn)機數(shù)量為1,戰(zhàn)機的位置可通過鍵盤方向鍵進行控制??赏ㄟ^“Z”鍵控制戰(zhàn)機發(fā)射子彈,可通過“X”鍵控制戰(zhàn)機發(fā)射導彈,子彈有三個等級。載彈量為0時不能發(fā)射武器,可通過補給箱補給。同時有最大載彈量,不會超過一定數(shù)值。
2、敵機出現(xiàn)的時間和位置均為隨機,敵機發(fā)射子彈的時間也是隨機的,子彈的發(fā)射具有延時性。敵機有三種:普通敵機,中級敵機和Boss敵機,其中普通敵機包含上下兩個方向出現(xiàn)的情況,中級敵機只能在上方出現(xiàn)但是血量高,Boss在第一關(guān)出現(xiàn),有更加強大的火力。3、導彈和子彈及敵機碰撞爆炸同時銷毀碰撞的物體,戰(zhàn)機和子彈及敵機碰撞爆炸同時銷毀碰撞的子彈及敵機,戰(zhàn)機則判斷生命,為0時銷毀否則不銷毀。與此同時進行分數(shù)和生命的變化同時進行文本的顯示提示。
4、所有敵方物體和導彈進行越出游戲區(qū)域則進行銷毀,釋放內(nèi)存。
5、為游戲提供相關(guān)背景,不同關(guān)卡之間可實現(xiàn)不同界面背景的轉(zhuǎn)換。背景會隨著戰(zhàn)機的位置產(chǎn)生滾動效果。6、實現(xiàn)了兩個關(guān)卡的設計,第一關(guān)的Boss被擊毀后就會提示玩家是否進入下一關(guān)。實現(xiàn)了對戰(zhàn)機的生命的增減,戰(zhàn)機基本生命值為10,通過拾取屏幕上隨機出現(xiàn)的補給箱子來增加戰(zhàn)機生命值及彈藥量。7、實現(xiàn)了暫停游戲的功能,玩家可通過按“P”鍵進行暫停游戲。8、實現(xiàn)了游戲結(jié)束后重新開始功能,玩家可通過彈窗選擇重新開始游戲。9、實現(xiàn)了不同敵機的攻擊,在第二關(guān)的時候會產(chǎn)生兩種不同類型,兩個不同方向出現(xiàn)的敵機。
10、實現(xiàn)了雙緩沖技術(shù)進行解決刷屏時屏閃的問題。3.2數(shù)據(jù)需求分析數(shù)據(jù)方面主要是需要對游戲?qū)ο髷?shù)據(jù)的需求分析,主要包括:CgameObjectplan1;//玩家戰(zhàn)機 CObListbaozhalist;//爆炸鏈表 CObListbulletlist;//玩家子彈鏈表 CObListenemylist;//敵機鏈表 CObListenemybiulist;//敵機子彈鏈表 CObListBoxList;//補給箱鏈表 CBossBoss1;//第一關(guān)的Boss CBackGroundBK;//背景對象3.3行為需求分析戰(zhàn)機移動發(fā)射武器的行為:載彈量為0時不能發(fā)射武器,可通過補給箱補給。同時有最大載彈量,不會超過一定數(shù)值。分數(shù)和生命值行為:戰(zhàn)機造成一點傷害就得一分,根據(jù)每顆導彈的傷害值可獲得不同的分數(shù),戰(zhàn)機被攻擊一次就減一點生命值,為零時戰(zhàn)機被摧毀,游戲結(jié)束,彈出對話框。碰撞行為:玩家與敵機會產(chǎn)生碰撞,碰撞一次導致生命值減一點,玩家子彈和敵人會產(chǎn)生碰撞,并產(chǎn)生爆炸效果,扣去子彈傷害值數(shù)值的敵機生命值,敵機生命值為0時則敵機被摧毀。敵機子彈會與玩家飛機產(chǎn)生碰撞,導致玩家戰(zhàn)機生命值減少。3.4其他需求用戶界面的需求:包括全屏等窗口的切換——可以進行全屏和窗口的切換功能。 軟硬件環(huán)境需求:操作系統(tǒng):MicrosoftWindowsXP以上。產(chǎn)品質(zhì)量需求:正確性——保證游戲規(guī)則的準確性;健壯性——程序運行過程中對用戶的無效操作予以處理。4.總體設計與詳細設計(介紹游戲的功能模塊劃分,主要類圖、狀態(tài)圖、活動圖或順序圖)4.1系統(tǒng)模塊劃分功能模塊劃分為:系統(tǒng)功能模塊,游戲規(guī)則模塊和對象功能模塊;功能模塊之間的關(guān)系如圖:游戲規(guī)則模塊系統(tǒng)功能模塊對象功能模塊游戲規(guī)則模塊系統(tǒng)功能模塊對象功能模塊對象功能模塊依照游戲規(guī)則模塊的控制,在系統(tǒng)功能模塊中實現(xiàn),完成游戲的基本功能。系統(tǒng)功能模塊包含:對話框設置;準備工作;游戲窗口控制;釋放內(nèi)存;信息顯示;繪制對象;繪制背景。游戲規(guī)則模塊包含:戰(zhàn)機移動攻擊;隨機產(chǎn)生敵機;產(chǎn)生敵機子彈;隨機產(chǎn)生補給箱,碰撞檢測;越界判斷;關(guān)卡條件判斷;重新開始;對象功能模塊包含:子彈類,敵方子彈類,戰(zhàn)機類,敵方戰(zhàn)機類,補給箱類,Boss類,背景類,爆炸動畫類。對象功能通過類來實現(xiàn),主要類圖如下:4.2主要功能模塊對象功能模塊:負責各個對象的定義,屬性和特性的描述:對象的位置坐標,碰撞矩形或碰撞點,運動方式的算法,血量、類型等各種數(shù)值,對象是否存在的bool值。游戲規(guī)則模塊:玩家戰(zhàn)機的攻擊規(guī)則:方向鍵控制移動,z,x鍵分別發(fā)射子彈和導彈,子彈威力為1,導彈威力為10,在沒有載彈量的情況下不能發(fā)射子彈或?qū)?,子彈有三個等級,生命值最初為10,生命值耗盡則戰(zhàn)機被毀,游戲結(jié)束。分數(shù)規(guī)則:依據(jù)玩家武器擊中敵機的傷害值加相應的分數(shù)。隨機產(chǎn)生敵機規(guī)則:敵機產(chǎn)生的速度根據(jù)玩家的得分而產(chǎn)生變化,分數(shù)越高,產(chǎn)生越快,第一關(guān)只有從上而下的普通敵機,第二關(guān)開始有從上而下的普通敵機與中等敵機,和從下而上的普通敵機。敵機隨機產(chǎn)生子彈,中等敵機生命值較高,當敵機血量為0時被擊毀。補給箱規(guī)則:窗口上方隨機位置產(chǎn)生,分數(shù)越高產(chǎn)生的數(shù)量越少,補給箱會自動移動,當碰到屏幕邊緣時反彈運動。Boss規(guī)則:第一關(guān)到達一定時間時出現(xiàn),有兩種攻擊方式:連續(xù)發(fā)射并排的一行子彈和追蹤激光。當左翼或者右翼被擊中時會相應的減少向左或者向右的移動速度,Boss會上下晃動并且總是在一定高度上向玩家靠攏。碰撞規(guī)則:當戰(zhàn)機與敵機、子彈碰撞,HP減去1,武器等級減去1;當戰(zhàn)機子彈與敵機碰撞,敵機減去與子彈類型相應的傷害值,同時子彈消失;當戰(zhàn)機與補給箱碰撞,HP+1,武器等級+1,同時補給箱消失。關(guān)卡規(guī)則:Boss被擊毀進入第二關(guān),第二關(guān)堅持一定時間過關(guān)。系統(tǒng)功能模塊:窗口控制:初始化一個默認大小的窗口作為游戲的主界面,去除默認自帶的編輯欄。游戲開始時需要準備的工作:建立定時器,裝載靜態(tài)位圖。繪制:背景,對象,信息;對話框設置:可在工具欄中選擇設置按鈕進行游戲的相關(guān)設置。內(nèi)存釋放:在每一幀的結(jié)束清理不需要的對象以防止對象鏈表無限制增長。4.3擴展功能設計思路增加存檔功能,在游戲運行的過程當中可以隨時存檔,隨時讀檔,CDoc類中實現(xiàn)文件的寫入和讀取。增加雙人模式,可將對象功能模塊改寫,通過調(diào)用戰(zhàn)機對象的指針可以同時對多個戰(zhàn)機對象進行操作按照游戲規(guī)則模塊運行,而不必完全重寫游戲規(guī)則模塊。4.4軟件結(jié)構(gòu)設計體會關(guān)于類的結(jié)構(gòu),起初的想法是直接在過程中實現(xiàn)對象的游戲規(guī)則方法,但是后來法相這樣不利于后期功能的拓展,所以改變了思路,盡量將游戲規(guī)則的描述放到對象類中,比如,裝載位圖的函數(shù),繪制對象的函數(shù),確定碰撞區(qū)域的函數(shù),對象運動方式的函數(shù)等等,從而實現(xiàn)類對象的良好的可拓展性。對于對象的初始化函數(shù)也建立在類中,可以極大的方便對象出現(xiàn)的時候各種數(shù)據(jù)的設置,并且容易將其拓展,可通過對話框的設置在游戲過程中修改數(shù)據(jù)。把游戲規(guī)則方法全部歸納為一個一個的獨立函數(shù),可以極大的方便后期的管理維護和新功能的添加。5.編碼實現(xiàn)5.1類對象的實現(xiàn):1、玩家戰(zhàn)機類:CgameObjectCgameObject::CgameObject():exist(true),score(0),planetype(0),HP(10),Life(3),AmmoBullet(50),AmmoRocket(0),AmmoLaser(0),BulletLevel(0),RocketLevel(0),LaserLevel(0),tp(1){}CgameObject::~CgameObject(){}intCgameObject::draw(CDC*pDC){ /*CPenpen1; pen1.CreatePen(PS_DASH,3,RGB(255,0,0)); pDC->SelectObject(&pen1); pDC->Rectangle(pos.x-20,pos.y-25,pos.x+20,pos.y+25); pDC->Ellipse(pos.x-25,pos.y-20,pos.x+25,pos.y+20);*/ // // CDCmemDC;//定義一個兼容DC memDC.CreateCompatibleDC(pDC);//創(chuàng)建DC CBitmapbmpDraw; bmpDraw.LoadBitmap(IDB_PLANEME);//裝入DDB CBitmap*pbmpOld=memDC.SelectObject(&bmpDraw);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-25,pos.y,50,60,&memDC,0,0,50,60,RGB(0,0,0)); SetRect(rect,pos.x-25,pos.y,pos.x+25,pos.y+60); memDC.SelectObject(pbmpOld);//選入原DDB if(Life<=0)Life=0; if(HP<=0)HP=0; if(AmmoBullet<=0)AmmoBullet=0; if(AmmoRocket<=0)AmmoRocket=0; if(AmmoLaser<=0)AmmoLaser=0; if(AmmoBullet>=500)AmmoBullet=500; if(AmmoRocket>=200)AmmoRocket=200; if(AmmoLaser>=100)AmmoLaser=50; if(BulletLevel<=0)BulletLevel=0; if(BulletLevel>=2)BulletLevel=2; if(RocketLevel<=0)RocketLevel=0; if(RocketLevel>=2)RocketLevel=2; if(LaserLevel<=0)LaserLevel=0; if(LaserLevel>=2)LaserLevel=2; //pDC->BitBlt(0,0,20,20,&memDC,0,0,SRCCOPY);//將源DC中(0,0,20,20)復制到目的DC(0,0,20,20) //pDC->BitBlt(20,20,40,40,&memDC,0,0,SRCAND);//將源DC中(0,0,20,20)和目的DC(20,20,40,40)中區(qū)域進行AND操作 return0;}boolCgameObject::CollisionDetection(CRectrect,CPointpoint){ if(point.x>=rect.left&&point.y>=rect.top&&point.x<=rect.right&&point.y<=rect.bottom) returntrue; else returnfalse;}boolCgameObject::CollisionDetectio(CRectrect1,CRectrect2){ if((rect1&rect2).IsRectEmpty()) returnfalse; elsereturntrue;}voidCgameObject::SetMyplane(intplanetype){ exist=true; score=0; HP=10; Life=3; AmmoBullet=50; AmmoRocket=0; AmmoLaser=0; tp=1; BulletLevel=0; RocketLevel=0; LaserLevel=0;}2、敵機類:CEnemyCImageListCEnemy::ENEMY;CBitmapCEnemy::ENEMY1;CEnemy::CEnemy():exist(true),startpos(0)//0是上1是下;,HP(1),HP1(20),Enemytype(0){}CEnemy::~CEnemy(){}//CEnemy成員函數(shù)voidCEnemy::drawenemy(CDC*pDC,inttype){ if(type==0) { if(HP<=0) { exist=false; HP=0; } if(exist) { ENEMY.Draw(pDC,startpos,pos,ILD_TRANSPARENT); SetRect(rect,pos.x,pos.y,pos.x+35,pos.y+35); } } elseif(type==1) { if(HP1<=0) { exist=false; HP1=0; } if(exist) { CDCmemDC; memDC.CreateCompatibleDC(pDC); CBitmap*pbmpOld=memDC.SelectObject(&ENEMY1); pDC->TransparentBlt(pos.x-73,pos.y,146,86,&memDC,0,0,146,86,RGB(0,0,0)); memDC.SelectObject(pbmpOld); SetRect(rect,pos.x-44,pos.y,pos.x+44,pos.y+71); } }}intCEnemy::LoadEnemy(){ CBitmapbmp; if(!bmp.LoadBitmap(IDB_ENEMY1)) return0; if(!ENEMY.Create(35,35,ILC_COLOR24|ILC_MASK,2,0)) return0; ENEMY.Add(&bmp,RGB(0,0,0)); ENEMY1.LoadBitmapW(IDB_MEnemy); return0;}boolCEnemy::CollisionDetectio(CRectrect,CPointpoint){ if(point.x>=rect.left&&point.y>=rect.top&&point.x<=rect.right&&point.y<=rect.bottom) returntrue; else returnfalse;}boolCEnemy::CollisionDetectio(CRectrect1,CRectrect2){ if((rect1&rect2).IsRectEmpty()) returnfalse; elsereturntrue;}voidCEnemy::Movement(inttype,intspeed,intway,CPointtarget){ if(type==a) { if(way==0) pos.y+=2+speed*2; elseif(way==1) pos.y-=2+speed*2; } if(type==b) {} if(type==c) {}}3、子彈類://bulletCBitmapbullet::BULLET;bullet::bullet():pos(0),exist(true),bullettype(0),Rocketstate(UP),ways(0),Damage(1){}bullet::~bullet(){}//bullet成員函數(shù)intbullet::drawbullet(CDC*pDC,intbullettype){ if(exist) { CDCmemDC;//定義一個兼容DC memDC.CreateCompatibleDC(pDC);//創(chuàng)建DC //CBitmapbmpDraw; //bmpDraw.LoadBitmap(IDB_BITMAP1);//裝入DDB if(bullettype==Bullet) { Damage=1; CBitmap*pbmpOld=memDC.SelectObject(&BULLET);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-4,pos.y,8,8,&memDC,0,0,8,8,RGB(0,0,0)); memDC.SelectObject(pbmpOld);//選入原DDB }elseif(bullettype==Rocket) { Damage=4; CBitmap*pbmpOld=memDC.SelectObject(&ROCKETU);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-5,pos.y,10,20,&memDC,0,0,10,20,RGB(0,0,0)); memDC.SelectObject(pbmpOld);//選入原DDB } } return0;}voidbullet::LoadBullet(){ BULLET.LoadBitmap(IDB_BALL); ROCKETU.LoadBitmap(IDB_RocketU); ROCKETUR.LoadBitmap(IDB_RocketUR); ROCKETR.LoadBitmap(IDB_RocketR); ROCKETDR.LoadBitmap(IDB_RocketDR); ROCKETD.LoadBitmap(IDB_RocketD); ROCKETDL.LoadBitmap(IDB_RocketDL); ROCKETL.LoadBitmap(IDB_RocketL); ROCKETUL.LoadBitmap(IDB_RocketUL);}voidbullet::Movement(inttype,intspeed,intway,intlevel,CPointtarget){ if(type==Bullet) { if(level==0) { if(way==0){pos.y-=30+speed*2;pos.x+=(rand()%4-2);} if(way==1){pos.y-=30+speed*2;pos.x+=(rand()%4-2);} if(way==2){pos.y-=30+speed*2;pos.x+=(rand()%4-2);} }else if(level==1) { if(way==0){pos.y-=30+speed*2;pos.x+=(rand()%4-2);} if(way==1){pos.y-=30+speed*2;pos.x-=2+rand()%4;}//左邊 if(way==2){pos.y-=30+speed*2;pos.x+=2+rand()%4;}//右邊 }else if(level==2) { if(way==0){pos.y-=30+speed*2;pos.x+=(rand()%4-2);} if(way==1){pos.y-=30+speed*2;pos.x-=2+rand()%4;}//左邊 if(way==2){pos.y-=30+speed*2;pos.x+=2+rand()%4;}//右邊 //if(way==3){pos.y-=30+speed*2;pos.x-=5+rand()%4;}//左邊+1 //if(way==4){pos.y-=30+speed*2;pos.x+=5+rand()%4;}//右邊+1 } } else if(type==Rocket) { pos.y-=20+speed*2; } else if(type==Laser) { pos.y-=20+speed*2; pos.x=target.x; } return;}4、敵方子彈類:CEnemyBullet:CBitmapCEnemyBullet::EB1;CBitmapCEnemyBullet::EB2;CEnemyBullet::CEnemyBullet():ToporBu(0),Damage(1),exist(true),counter(0){}CEnemyBullet::~CEnemyBullet(){}intCEnemyBullet::drawbullet(CDC*pDC,intbullettype){ if(exist) { CDCmemDC; memDC.CreateCompatibleDC(pDC); if(bullettype==0) { CBitmap*pbmpOld=memDC.SelectObject(&EB1); pDC->TransparentBlt(pos.x-4,pos.y,8,8,&memDC,0,0,8,8,RGB(0,0,0)); memDC.SelectObject(pbmpOld); } elseif(bullettype==2) { CBitmap*pbmpOld=memDC.SelectObject(&EB2); pDC->TransparentBlt(pos.x-3,pos.y,5,18,&memDC,0,0,5,18,RGB(0,0,0)); memDC.SelectObject(pbmpOld); } } if(bullettype==0)Damage=1; if(bullettype==1)Damage=2; return0;}voidCEnemyBullet::LoadEnemyBullet(){ EB1.LoadBitmapW(IDB_ENEMYBALL); EB2.LoadBitmapW(IDB_BITMAP6);}voidCEnemyBullet::Movement(inttype,intspeed,intways,intToporBu,CPointtarget){ if(type==0) { if(ToporBu==0)//敵機子彈從上往下 { if(ways==0){pos.y+=30+speed*2;} if(ways==1){pos.y+=30+speed*2;pos.x-=5;}//向左偏 if(ways==2){pos.y+=30+speed*2;pos.x+=5;}//向右偏 } else if(ToporBu==1)//敵機子彈從下往上 { if(ways==0){pos.y-=30+speed*2;} if(ways==1){pos.y-=30+speed*2;} if(ways==2){pos.y-=30+speed*2;} } } else if(type==1) { pos.y-=20+speed*2; } else if(type==2) { if(ways==1) { pos.y+=10+speed*2; if(pos.x<=target.x-2) pos.x+=10; elseif(pos.x>target.x+2) pos.x-=10; } } return;}補給箱類:CBox//CBoxCBox::CBox():pos(0),BoxType(0),exist(true),BoxMoveSpeedX(5),BoxMoveSpeedY(5){}CBox::~CBox(){}//CBox成員函數(shù)voidCBox::LoadBox(){ Box0.LoadBitmapW(IDB_BBOX);}voidCBox::DrawBox(CDC*pDC,inttype){ if(exist) { CDCmemDC;//定義一個兼容DC memDC.CreateCompatibleDC(pDC);//創(chuàng)建DC //CBitmapbmpDraw; //bmpDraw.LoadBitmap(IDB_BITMAP1);//裝入DDB if(type==0) { CBitmap*pbmpOld=memDC.SelectObject(&Box0);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-10,pos.y-10,20,20,&memDC,0,0,20,20,RGB(0,0,0)); memDC.SelectObject(pbmpOld);//選入原DDB } }}voidCBox::Movement(CRectrect){ if(pos.x>rect.Width()) { BoxMoveSpeedX=-BoxMoveSpeedX; } if(pos.x<0) { BoxMoveSpeedX=-BoxMoveSpeedX; } if(pos.y>rect.Height()) { BoxMoveSpeedY=-BoxMoveSpeedY; } if(pos.y<0) { BoxMoveSpeedY=-BoxMoveSpeedY; } pos.x+=BoxMoveSpeedX; pos.y+=BoxMoveSpeedY;}Boss類:CBossCBitmapCBoss::BOSS1;CBoss::CBoss():BossType(0),HPofWingL(200),HPofWingR(200),HP(900),exist(false){}CBoss::~CBoss(){}voidCBoss::LoadBoss(){ BOSS1.LoadBitmap(IDB_Boss1);}voidCBoss::DrawBoss(CDC*pDC,intBossType){ if(exist) { CDCmemDC;//定義一個兼容DC memDC.CreateCompatibleDC(pDC);//創(chuàng)建DC //CBitmapbmpDraw; //bmpDraw.LoadBitmap(IDB_BITMAP1);//裝入DDB if(BossType==0) { CBitmap*pbmpOld=memDC.SelectObject(&BOSS1);//保存原有DDB,并選入新DDB入DC pDC->TransparentBlt(pos.x-96,pos.y,192,133,&memDC,0,0,192,133,RGB(0,0,0)); memDC.SelectObject(pbmpOld);//選入原DDB SetRect(rect,pos.x-26,pos.y,pos.x+26,pos.y+133-8); SetRect(RectWingL,pos.x+0-96,pos.y+54,pos.x+76-96,pos.y+85); SetRect(RectWingR,pos.x+116-96,pos.y+54,pos.x+192-96,pos.y+85); if(HPofWingR<=0)HPofWingR=0; if(HPofWingL<=0)HPofWingL=0; } elseif(BossType==1) {} if(HP<=0) { exist=false; HP=0; } } }voidCBoss::Movement(inttype,intspeed,intway,CPointtarget){ if(exist) { if(BossType==0) { if(way%3==0) pos.y=100*cos(sin((double)way)); if(pos.x<=target.x-5) pos.x+=2+speed*2+(HPofWingR/60); elseif(pos.x>target.x+5) pos.x-=2+speed*2+(HPofWingL/60); } if(BossType==1) { if(way%3==0) pos.y=100*cos(sin((double)way)); if(pos.x<=target.x-5) pos.x+=2+speed*2+(HPofWingR/60); elseif(pos.x>target.x+5) pos.x-=2+speed*2+(HPofWingL/60); } } return;}voidCBoss::SetBoss(intBossType){ if(BossType==0) { HPofWingL=200; HPofWingR=200; HP=900; exist=false; }}背景類:CBackGroundCBitmapCBackGround::BK1;CBitmapCBackGround::BK2;CBitmapCBackGround::BK3;CBackGround::CBackGround():BKtype(0){}CBackGround::~CBackGround(){}voidCBackGround::DrawBK(CDC*pDC,CRectrect,CPointpos,intBKtype){ CDCmemDC; memDC.CreateCompatibleDC(pDC); if(BKtype==0) { intx=(100*pos.x)/rect.Width(); inty=(100*pos.y)/rect.Height(); CBitmap*pbmpOld=memDC.SelectObject(&BK1); pDC->TransparentBlt(0,0,rect.Width(),rect.Height(),&memDC,100+x,100-y,rect.Width(),rect.Height(),RGB(0,0,0)); memDC.SelectObject(pbmpOld); } elseif(BKtype==1) { intx=(100*pos.x)/rect.Width(); staticinty=1200-rect.Height(); y-=1; if(y<0) { y=1200-rect.Height(); } CBitmap*pbmpOld=memDC.SelectObject(&BK2); pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,100+x,y,rect.Width(),rect.Height(),SRCCOPY); memDC.SelectObject(pbmpOld); }}voidCBackGround::LoadBK(){ BK1.LoadBitmapW(IDB_BK1); BK2.LoadBitmapW(IDB_BK2); /*BK3.LoadBitmapW(IDB_BK3);*/}爆炸效果類:CbaozhaCImageListCbaozha::imagelist;Cbaozha::Cbaozha():pos(0),index(0),exist(true){}Cbaozha::~Cbaozha(){}//Cbaozha成員函數(shù)intCbaozha::draw(CDC*pDC){ if(exist) { imagelist.Draw(pDC,index,pos,ILD_TRANSPARENT); index=(index+1)%8; } return0;}intCbaozha::loadimage(){ //CRectrect;// //GetClientRect(&rect);// CBitmapbmp; if(!bmp.LoadBitmap(IDB_Baozha1)) return0; if(!imagelist.Create(66,66,ILC_COLOR24|ILC_MASK,8,0)) return0; imagelist.Add(&bmp,RGB(0,0,0)); return0;}5.2系統(tǒng)功能模塊的實現(xiàn)1、對話框設置:BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE; //TODO:在此處通過修改 //CREATESTRUCTcs來修改窗口類或樣式 cs.dwExStyle&=~WS_EX_CLIENTEDGE; //cs.style&=~WS_MAXIMIZEBOX;//禁止窗口最大化 cs.style&=~WS_MINIMIZEBOX;//禁止窗口最小化 //cs.style&=~WS_SYSMENU;//取消Title上的按鈕取消關(guān)閉按鈕 //cs.style&=~WS_THICKFRAME;//使窗口不能用鼠標改變大小 cs.lpszClass=AfxRegisterWndClass(0); /*cs.cx=811; cs.cy=632;*/ returnTRUE;}2、準備工作:voidCtest1View::OnInitialUpdate(){intt=0;//產(chǎn)生敵機的速度//在F_Tseter();函數(shù)intf=0;//產(chǎn)生敵機的速度//在F_Tseter();函數(shù)intcounter=0;//使得Boss晃動intti=0;//Boss出現(xiàn)的時間intBossFire=0;//控制Boss開火//NewBulletofEnemy中調(diào)用intTpbox=0;//控制Box出現(xiàn)//在F_Tseter();函數(shù)intTimelater=0;//第二關(guān)堅持的時間 CView::OnInitialUpdate(); Cbaozha::loadimage(); bullet::LoadBullet(); CEnemy::LoadEnemy(); CBoss::LoadBoss(); CAirBus::LoadAirBus(); CBackGround::LoadBK(); CBox::LoadBox(); CEnemyBullet::LoadEnemyBullet(); //Cbaozha::loadimage(); SetTimer(1,50,NULL); //this->SetTimer(2,2000,NULL); //建立于屏幕顯示兼容的內(nèi)存顯示設備; if(MemDC.m_hDC==NULL){ MemDC.CreateCompatibleDC(NULL); CClientDCDC(this); CRectrect; this->GetClientRect(&rect); //建立一個與屏幕顯示兼容的位圖; MemBitmap.CreateCompatibleBitmap(&DC,rect.Width(),rect.Height()); MemDC.SelectObject(&MemBitmap); }}3、釋放內(nèi)存://清理鏈表;voidCtest1View::Cleaner(){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; for(POSITIONpos=pDoc->baozhalist.GetHeadPosition(),k=NULL;(k=pos)!=NULL;) { Cbaozha*temp=(Cbaozha*)pDoc->baozhalist.GetNext(pos); if(temp->exist==false) pDoc->baozhalist.RemoveAt(k); temp=NULL; } for(POSITIONpos=pDoc->bulletlist.GetHeadPosition(),k=NULL;(k=pos)!=NULL;) { bullet*temp=(bullet*)pDoc->bulletlist.GetNext(pos); if(temp->exist==false) pDoc->bulletlist.RemoveAt(k); temp=NULL; } for(POSITIONpos=pDoc->enemylist.GetHeadPosition(),k=NULL;(k=pos)!=NULL;) { CEnemy*temp=(CEnemy*)pDoc->enemylist.GetNext(pos); if(temp->exist==false) pDoc->enemylist.RemoveAt(k); temp=NULL; } for(POSITIONi=pDoc->enemybiulist.GetHeadPosition(),k=NULL;(k=i)!=NULL;) { CEnemyBullet*temp=(CEnemyBullet*)pDoc->enemybiulist.GetNext(i); if(temp->exist==false) pDoc->enemybiulist.RemoveAt(k); temp=NULL; }}4、信息顯示://顯示各項信息;voidCtest1View::Showinformation(){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CClientDCDC(this); CRectrect; this->GetClientRect(&rect); if(1) { CStringbuffer; MemDC.SetTextColor(RGB(255,0,0)); MemDC.SetBkMode(TRANSPARENT); buffer.Format(_T("得分:%d"),pDoc->plan1.score); MemDC.TextOutW(10,20,buffer); buffer.Format(_T("戰(zhàn)機HP:%d"),pDoc->plan1.HP); MemDC.TextOutW(10,40,buffer); buffer.Format(_T("子彈等級:%d"),pDoc->plan1.BulletLevel+1); MemDC.TextOutW(10,60,buffer); buffer.Format(_T("剩余子彈:%d"),pDoc->plan1.AmmoBullet); MemDC.TextOutW(10,80,buffer); buffer.Format(_T("剩余導彈:%d"),pDoc->plan1.AmmoRocket); MemDC.TextOutW(10,100,buffer); buffer.Format(_T("Boss生命值:%d"),pDoc->Boss1.HP); MemDC.TextOutW(100,20,buffer); if(MarkLevel==0) buffer.Format(_T("Boss出現(xiàn):%d"),ti/20); elseif(MarkLevel==1) buffer.Format(_T("堅持時間:%d"),Timelater/20); MemDC.TextOutW(300,20,buffer); buffer.Format(_T("當前關(guān)卡:%d"),MarkLevel+1); MemDC.TextOutW(rect.Width()/2,20,buffer); } DC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);}繪制對象;繪制背景://繪制背景;voidCtest1View::DrawBKinView(){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CClientDCDC(this); CRectrect; this->GetClientRect(&rect); if(MarkLevel==0) { pDoc->BK.DrawBK(&MemDC,rect,pDoc->plan1.pos,MarkLevel); } elseif(MarkLevel==1) { pDoc->BK.DrawBK(&MemDC,rect,pDoc->plan1.pos,MarkLevel); }}//打印各對象;&&對象的移動函數(shù);voidCtest1View::PaintObject(CDC*MemDC){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CClientDCDC(this); CRectrect; this->GetClientRect(&rect); //繪制CimageList隊列們中的對象; //GetHeadPosition返回的是鏈表頭元素的位置 //GetNext(pos)返回的是連標中pos所指的元素并將pos指向下一個元素 //調(diào)用GetNext后pos的值就改變了 for(POSITIONpos=pDoc->baozhalist.GetHeadPosition();pos!=NULL;) { POSITIONtpp=pos; Cbaozha*temp=(Cbaozha*)pDoc->baozhalist.GetNext(pos); temp->pos.y+=2+pDoc->Speed*2; if(temp->index==7) { temp->draw(MemDC); temp->exist=false; /*pDoc->baozhalist.RemoveAt(tpp);*/ } elsetemp->draw(MemDC); } //zidan for(POSITIONi=pDoc->bulletlist.GetHeadPosition();i!=NULL;) { bullet*temp=(bullet*)pDoc->bulletlist.GetNext(i); if(BordJudge(temp->pos,rect))temp->exist=false; else if(temp->exist) { if(temp->bullettype==0) { temp->Movement(temp->bullettype,pDoc->Speed,temp->ways,pDoc->plan1.BulletLevel,pDoc->plan1.pos); } else if(temp->bullettype==1) { temp->Movement(temp->bullettype,pDoc->Speed,temp->ways,pDoc->plan1.RocketLevel,pDoc->plan1.pos); } else if(temp->bullettype==2) { temp->Movement(temp->bullettype,pDoc->Speed,temp->ways,pDoc->plan1.LaserLevel,pDoc->plan1.pos); } temp->drawbullet(MemDC,temp->bullettype); } if(temp->pos.x) { } } for(POSITIONi=pDoc->enemybiulist.GetHeadPosition();i!=NULL;) { CEnemyBullet*temp=(CEnemyBullet*)pDoc->enemybiulist.GetNext(i); if(BordJudge(temp->pos,rect))temp->exist=false; else if(temp->exist) { temp->Movement(temp->bullettype,pDoc->Speed,temp->ways,temp->ToporBu,pDoc->plan1.pos); temp->drawbullet(MemDC,temp->bullettype); } } //diji for(POSITIONj=pDoc->enemylist.GetHeadPosition();j!=NULL;) { CEnemy*temp=(CEnemy*)pDoc->enemylist.GetNext(j); if(BordJudge(temp->pos,rect))temp->exist=false; else if(temp->exist) { temp->Movement(0,pDoc->Speed,temp->startpos,pDoc->plan1.pos); temp->drawenemy(MemDC,temp->Enemytype); } } //Box for(POSITIONp=pDoc->BoxList.GetHeadPosition();p!=NULL;) { CBox*temp=(CBox*)pDoc->BoxList.GetNext(p); if(BordJudge(temp->pos,rect))temp->exist=false; else if(temp->exist) { temp->Movement(rect); temp->DrawBox(MemDC,0); } } if(pDoc->plan1.tp==1){ pDoc->plan1.pos.x=rect.Width()/2-25; pDoc->plan1.pos.y=rect.Height()-60; } pDoc->plan1.draw(MemDC); pDoc->plan1.tp=0;}6、設置窗口對話框:voidCtest1View::Onspeed(){ CSetDialogsd;//創(chuàng)建窗口對象; Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; sd.speed=pDoc->Speed; sd.tiiiii=pDoc->NeedTime/20; sd.Boss1Time=pDoc->Boss1Time/20; if(sd.DoModal()==IDOK) { pDoc->NeedTime=sd.tiiiii*20; pDoc->Speed=sd.speed; pDoc->AddammoBullet=sd.amm; pDoc->Boss1Time=sd.Boss1Time*20; } }5.3游戲規(guī)則模塊的實現(xiàn)1、碰撞檢測:voidCtest1View::JCPZ(){ Ctest1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CClientDCDC(this); CRectrect; this->GetClientRect(&rect); //子彈和敵機\boss的碰撞; for(POSITIONj=pDoc->enemylist.GetHeadPosition();j!=NULL;) { POSITIONtpj=j; CEnemy*temp1=(CEnemy*)pDoc->enemylist.GetNext(j); if(temp1->exist) for(POSITIONi=pDoc->bulletlist.GetHeadPosition();i!=NULL;) { POSITIONtpi=i; bullet*temp2=(bullet*)pDoc->bulletlist.GetNext(i); if(temp2->exist) { if(temp1->CollisionDetectio(temp1->rect,temp2->pos)) { temp2->exist=false; if(temp2->bullettype==0) pDoc->plan1.score+=1; elseif(temp2->bullettype==1) pDoc->plan1.score+=10; if(temp1->Enemytype==0) { temp1->HP-=1; Cbaozha*baozhatemp=newCbaozha(); baozhatemp->pos.x=temp1->pos.x-15; baozhatemp->pos.y=temp1->pos.y-15; /*pDoc->bulletlist.RemoveAt(tpi); pDoc->enemylist.RemoveAt(tpj);*/ pDoc->baozhalist.AddHead(baozhatemp); } else if(temp1->Enemytype==1)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木質(zhì)衣柜采購合同范例
- 商丘工學院《數(shù)字電子技術(shù)路實驗》2023-2024學年第一學期期末試卷
- 商洛職業(yè)技術(shù)學院《傳遞過程原理》2023-2024學年第一學期期末試卷
- 工程蓋房合同范例
- 店出兌合同范例
- 橋臺護坡施工方案
- 陜西職業(yè)技術(shù)學院《納米材料與器件》2023-2024學年第一學期期末試卷
- 陜西藝術(shù)職業(yè)學院《園林建筑設計(1)》2023-2024學年第一學期期末試卷
- 2024至2030年花生豐產(chǎn)寶粉劑項目投資價值分析報告
- 2024至2030年直接大紅項目投資價值分析報告
- 電力建設“五新”推廣應用信息目錄(試行)
- 冬至活動的主持詞有哪些冬至活動主持詞開場白優(yōu)質(zhì)
- 2023年法律文書形成性考核冊答案
- 保密警示教育課
- QC成果提高疊合板安裝合格率
- 7漆洪波教授解讀:ACOG妊娠期高血壓和子癇前期指南2023年版
- 正庚烷-正辛烷連續(xù)精餾塔設計
- 2023年江蘇無錫市屆普通高中學業(yè)水平測試模擬考試地理試卷及答案
- 會計人員年終個人工作總結(jié)(4篇)
- 2023版思想道德與法治專題4 繼承優(yōu)良傳統(tǒng) 弘揚中國精神 第2講 做新時代的忠誠愛國者
- 南方黑芝麻集團有限責任公司swot分析
評論
0/150
提交評論