版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Tc2.0編寫俄羅斯方塊游戲文章來源:互聯(lián)網(wǎng)很多編程愛好者都編寫過俄羅斯方塊的游戲程序。很久以前,我用Tc2.0也做過一個;最近有好些朋友看見我以前的俄羅斯方塊的程序后,問我是怎么做的。我一直想把這個程序的整個過程寫一份詳細的東西,與各位編程愛好者分享,一直沒空。正好現(xiàn)在放假了,而且離回家還有幾天。于是我就把這個程序重新寫了一遍,盡量使程序的結(jié)構(gòu)比較清晰好懂一些。同時寫了下面的這份東西。 俄羅斯方塊游戲的程序中用到了一些方法。為了比較容易理解這些方法,我在講述的同時寫了些專門針對這些方法的示例程序。這些示例程序力求短小,目的是用最小的代碼能夠清楚的示例所用的方法。這些示例程序都經(jīng)過tc2.0測
2、試。最后還附了完整的俄羅斯方塊游戲的源代碼,和最終的可執(zhí)行程序。如果你看了這份東東,有什么意見和想法,請發(fā)電子郵件告訴我。我將會繼續(xù)更新這分東東,最新的版本可以在我的個人主頁上下載。下面的問題是有關(guān)俄羅斯方塊程序的,其中有些是朋友問我的,有些是我認為可能會被問到的。我盡量按問題從易到難排列這些問題。 關(guān)于俄羅斯方塊程序的一些問題:*Tc2.0中怎么樣設(shè)置圖形顯示?Tc2.0中常用圖形函數(shù)的用法?怎樣獲取鍵盤輸入?怎樣控制方塊的移動?怎樣控制時間間隔(用于游戲中控制形狀的下落)?游戲中的各種形狀及整個游戲空間怎么用數(shù)據(jù)表示?游戲中怎么判斷左右及向下移動的可能性?游戲中怎么判斷某一形狀旋轉(zhuǎn)的可能性
3、?按向下方向鍵時加速某一形狀下落速度的處理?怎么判斷某一形狀已經(jīng)到底?怎么判斷某一已經(jīng)被填滿?怎么消去已經(jīng)被填滿的一行?怎么消去某一形狀落到底后能夠消去的所有的行?(如長條最多可以消去四行)怎樣修改游戲板的狀態(tài)?怎樣統(tǒng)計分數(shù)?怎樣處理升級后的加速問題?怎樣判斷游戲結(jié)束?關(guān)于計分板設(shè)計的問題。關(guān)于“下一個”形狀取法的問題。剩下的問題。*新的問題: 我想有一個最高記錄的顯示,應(yīng)該怎么做呀? 我想實現(xiàn)一個進度存儲功能,應(yīng)該怎么做呀?Tc2.0中怎么樣設(shè)置圖形顯示?Tc2.0中有兩種顯示模式,一種是我們所熟知的字符模式,另一種是圖形模式。在字符模式下只能顯式字符,如ASCII字符。一般是顯示25行,每
4、行80個字符。程序缺省的是字符模式。在字符模式下不能顯式圖形和進行繪圖操作。要想進行圖形顯示和繪圖操作,必須切換到圖形模式下。Tc2.0中用initgraph()函數(shù)可以切換到圖形模式,用closegraph()可以從圖形模式切換回字符模式。initgraph()和closegraph()都是圖形函數(shù),使用圖形函數(shù)必須包括頭文件"graphics.h"。void far initgraph(int far *graphdriver,int far *graphmode,char far *pathtodriver);graphdriver是上漲指向圖形驅(qū)動序號變量的指針;g
5、raphmode是在graphdriver選定后,指向圖形顯示模式序號變量的指針。pathtodriver表示存放圖形驅(qū)動文件的路徑。 Tc2.0中有多種圖形驅(qū)動,每種圖形驅(qū)動下又有幾種圖形顯示模式。在我的程序中圖形驅(qū)動序號為VGA,圖形顯示模式序號為VGAHI。這是一種分辨率為640*480(從左到右坐標依次為0-639,從上到下坐標依次為0-479),能夠顯示16種顏色的圖形模式。別的圖形驅(qū)動序號和圖形顯示模式序號,可以從手冊或聯(lián)機幫助中找到。 pathtodriver指示存放圖形驅(qū)動文件的路徑。圖形驅(qū)動序號不同,圖形驅(qū)動文件也不同。序號為VGA圖形驅(qū)動對應(yīng)"egavga.bgi
6、"這個圖形驅(qū)動文件。"egavga.bgi"一般在Tc目錄下。void far closegraph(void); 沒有參數(shù),從圖形模式直接返回字符模式。initgraph()和closegraph()的常用用法如下:int gdriver = VGA, gmode=VGAHI, errorcode;/* initialize graphics mode */initgraph(&gdriver, &gmode, "e:tc2");/* read result of initialization */errorcode = gr
7、aphresult();if (errorcode != grOk) /* an error occurred */printf("Graphics error: %sn", grapherrormsg(errorcode);printf("Press any key to halt:");getch();exit(1); /* return with error code */* return to text mode */closegraph();Tc2.0中常用圖形函數(shù)的用法?在這里講幾個游戲中用到的繪圖用的圖形函數(shù):setcolor();line
8、();rectangle();settextjustify();outtextxy();setfillstyle();bar();void far setcolor(int color); 設(shè)置畫線、畫框和在圖形模式下顯示文字的當(dāng)前顏色。這個函數(shù)將影響line()、rectangle()和outtextxy()函數(shù)繪圖的顏色。color可以取常的顏色常量:BLACK ? 0BLUE ? 1GREEN ? 2CYAN ? 3RED ? 4MAGENTA ? 5BROWN ? 6LIGHTGRAY ? 7DARKGRAY ? 8LIGHTBLUE ? 9LIGHTGREEN ?10LIGHTCYA
9、N ?11LIGHTRED ?12LIGHTMAGENTA ?13YELLOW ?14WHITE ?15void far line(int x1,int y1,int x2,int y2);用當(dāng)前顏色從(x1,y1)畫一條到(x2,y2)的線段。void far rectangle(int left,int top,int right,int bottom);用當(dāng)前顏色畫一個左上角為(left,top)、右下角為(right,bottom)的矩形框。void far settextjustify(int horz,int vert);設(shè)置圖形模式下文字輸出的對齊方式。主要影響outtextxy
10、()函數(shù)。horiz和vert可取如下枚舉常量:horiz ?LEFT_TEXT ? 0 ?Left-justify text?CENTER_TEXT ? 1 ?Center text?RIGHT_TEXT ? 2 ?Right-justify textvert ?BOTTOM_TEXT ? 0 ?Justify from bottom?CENTER_TEXT ? 1 ?Center text?TOP_TEXT ? 2 ?Justify from topvoid far outtextxy(int x,int y,char * textstring);在(x,y)處用當(dāng)前字體(缺省的字體是DE
11、FAULT_FONT)顯示字符串textstring,字符串的對齊方式由settextjustify()指定。void far setfillstyle(int pattern,int color);設(shè)置圖形的填充模式和填充顏色,主要影響bar()等函數(shù)。pattern一般取枚舉常量值SOLID_FILL,color的取值與setcolor(int color)中color的取值范圍相同。介紹完了前面兩個問題,現(xiàn)在來寫一個程序。這個程序演示前了面所介紹的幾個圖形函數(shù)。 程序prog1.c怎樣獲取鍵盤輸入?在Tc2.0中有一個處理鍵盤輸入的函數(shù)bioskey();int bioskey(int
12、cmd); 當(dāng)cmd為1時,bioskey()檢測是否有鍵按下。沒有鍵按下時返回0;有鍵按下時返回按鍵碼(任何按鍵碼都不為0),但此時并不將檢測到的按鍵碼從鍵盤緩沖隊列中清除。 當(dāng)cmd為0時,bioskey()返回鍵盤緩沖隊列中的按鍵碼,并將此按鍵碼從鍵盤緩沖隊列中清除。如果鍵盤緩沖隊列為空,則一直等到有鍵按下,才將得到的按鍵碼返回。Escape鍵的按鍵碼為0x11b,下面的小程序可以獲取按鍵的按鍵碼。for (;)key=bioskey(0); /* wait for a keystroke */printf("0x%xn",key);if (key=0x11b) br
13、eak; /* Escape */常用按鍵的按鍵碼如下:#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d 完整的程序請參見prog2.c、prog3.c。prog2.c獲取按鍵的按鍵碼,按Escape鍵退出程序。prog3.c根據(jù)不同的按鍵進行不同的操作
14、,按Escape鍵退出程序。怎樣控制方塊的移動? 方塊移動的實現(xiàn)很簡單,將方塊原來的位置用背景色畫一個同樣大小的方塊,將原來的方塊涂去。然后在新的位置上重新繪制方塊就可以了。這樣就實現(xiàn)了方塊的移動。完整的程序請參見prog4.c。這個用方向鍵控制一個黃色的小方塊在屏幕上上、下、左、右移動。這個程序用到了前面幾個問題講的內(nèi)容,如果你有點忘了,還要回頭看看哦。:)怎樣控制時間間隔(用于游戲中控制形狀的下落)? 解決這個問題要用到時鐘中斷。時鐘中斷大約每秒鐘發(fā)生18.2次。截獲正常的時鐘中斷后,在處理完正常的時鐘中斷后,將一個計時變量加1。這樣,每秒鐘計時變量約增加18。需要控控制時間的時候,只需要
15、看這個計時變量就行了。 截獲時鐘中斷要用到函數(shù)getvect()和setvect()。兩個函數(shù)的聲明如下:?void interrupt (*getvect(int interruptno)();?void setvect(int interruptno, void interrupt (*isr) ( );保留字interrupt指示函數(shù)是一個中斷處理函數(shù)。在調(diào)用中斷處理函數(shù)的時候,所有的寄存器將會被保存。中斷處理函數(shù)的返回時的指令是iret,而不是一般函數(shù)用到的ret指令。getvect()根據(jù)中斷號interruptno獲取中斷號為interruptno的中斷處理函數(shù)的入口地址。setv
16、ect()將中斷號為interruptno的中斷處理函數(shù)的入口地址改為isr()函數(shù)的入口地址。即中斷發(fā)生時,將調(diào)用isr()函數(shù)。 在程序開始的時候截獲時鐘中斷,并設(shè)置新的中斷處理。在程序結(jié)束的時候,一定要記著恢復(fù)時鐘中斷哦,不然系統(tǒng)的計時功能會出問題的。具體演示程序請參見prog5.c。由于中斷處理大家可能用的不多,所以我把prog5.c這個程序完整地貼在下面,并加上詳細的解釋。/* prog5.c */This is an interrupt service routine. You can NOT compile thisprogram with Test Stack Overflow
17、 turned on and get an executablefile which will operate correctly. */* 這個程序每隔1秒鐘輸出一個整數(shù),10秒鐘后結(jié)束程序。按escape鍵提前退出程序 。*/#include <stdio.h>#include <dos.h>#include <conio.h>/* Escape key */#define VK_ESC 0x11b #define TIMER 0x1c /* 時鐘中斷的中斷號 */* 中斷處理函數(shù)在C和C+中的表示略有不同。如果定義了_cplusplus則表示在C+環(huán)境
18、下,否則是在C環(huán)境下。 */#ifdef _cplusplus#define _CPPARGS .#else#define _CPPARGS#endifint TimerCounter=0; /* 計時變量,每秒鐘增加18。 */* 指向原來時鐘中斷處理過程入口的中斷處理函數(shù)指針(句柄) */void interrupt ( *oldhandler)(_CPPARGS);/* 新的時鐘中斷處理函數(shù) */void interrupt newhandler(_CPPARGS)/* increase the global counter */TimerCounter+;/* call the old
19、 routine */oldhandler();/* 設(shè)置新的時鐘中斷處理過程 */void SetTimer(void interrupt (*IntProc)(_CPPARGS)oldhandler=getvect(TIMER);disable(); /* 設(shè)置新的時鐘中斷處理過程時,禁止所有中斷 */setvect(TIMER,IntProc);enable(); /* 開啟中斷 */* 恢復(fù)原有的時鐘中斷處理過程 */void KillTimer()disable();setvect(TIMER,oldhandler);enable();void main(void)int key,t
20、ime=0;SetTimer(newhandler); /* 修改時鐘中斷 */for (;)if (bioskey(1)key=bioskey(0);if (key=VK_ESC) /* 按escape鍵提前退出程序 */printf("User cancel!n");break;if (TimerCounter>18) /* 1秒鐘處理一次 */* 恢復(fù)計時變量 */TimerCounter=0;time+;printf("%dn",time);if (time=10) /* 10秒鐘后結(jié)束程序 */printf("Program t
21、erminated normally!n");break;KillTimer(); /* 恢復(fù)時鐘中斷 */游戲中的各種形狀及整個游戲空間怎么用數(shù)據(jù)表示?以后我提到的形狀都是指下面七種形之一及它們旋轉(zhuǎn)后的變形體。 我定義了一個結(jié)構(gòu)來表示形狀。struct shapeint xy8;int color;int next;-1 0 1 2-3-2-10所有的各種形狀都可以放在4x4的格子里。假定第二列,第四行的格子坐標為(0,0)(如上圖中黑塊所示),則每個形狀的四個方塊都可以用4個數(shù)對來表示。坐標x從左向右依次增加,y從上到下依次增加。表示的時候,組成該形狀的四個方塊從左到右,從上到下
22、(不一定非要按這個順序)。如上面七種形狀的第一個用數(shù)對來表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。結(jié)構(gòu)shape中的xy就是用來表示這4個數(shù)對的。為了簡化程序,用一維數(shù)組xy8來表示。xy0、xy1表示第一個數(shù)對,xy2、xy3表示第二個數(shù)對,依次類推。 shape中的color表示形狀的顏色,不同的形狀有不同的顏色。七種形狀及它們旋轉(zhuǎn)后的變形體一共有19種形狀,用一個全局數(shù)組表示。假定旋轉(zhuǎn)的方向是逆時針方向(順時針方向道理一樣)。shape中的next就表示當(dāng)前形狀逆時針旋轉(zhuǎn)后的下一個形狀的序號。例如:第一種形狀及其旋轉(zhuǎn)變形的形狀用結(jié)構(gòu)表示如下。 struct shape
23、shapes19=/*x1,y1,x2,y2,x3,y3,x4,y4, color, next*/ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1, /* */-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2, /* # */ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3, /* # */-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0, /* # */游戲空間指的是整個游戲主要的界面(呵呵,這個定義我實在想不出更準確的,還請哪位大蝦指點)。實際上是一個寬10格子、高20格子的游戲板。用一個全局數(shù)組board1222表示。表示的
24、時候:boardxy為1時表示游戲板上(x,y)這個位置上已經(jīng)有方塊占著了,boardxy為0表示游戲板上這位置還空著。為了便于判斷形狀的移動是否到邊、到底,初始的時候在游戲板的兩邊各加一列,在游戲板的下面加一行,全部填上1,表示不能移出界。即board0y,board11y(其中y從0到21)初始都為1,boardx21(其中x從1到10)初始都為1。1 2 3 4 5 6 7 8 910123456789 1011121314151617181920prog6.c演示了用結(jié)構(gòu)表示各種形狀的方法。雖然程序稍長一些,但并不是特別復(fù)雜。其中游戲板初始化部分并沒有真正用到,但是后面的程序會用到的。
25、其中SIZE定義為16,這樣將整個屏幕的坐標系由原來的640×480轉(zhuǎn)換成40×30(640/16=40,480/16=30)。游戲中所有的坐標都是基于40×30的坐標系的,這樣有助于簡化程序。坐標的轉(zhuǎn)換在程序中由DrawBlock(int x,int y)來體現(xiàn)。新的坐標系如下圖所示:-8-7-6-5-4-3-2-1 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031-4-3-2-101234567891011121314151617181920212223242526新坐標中最主要的是
26、就是上面兩塊黑色的部分。左邊那塊大的就是游戲板(橫坐標從1到10,縱坐標從1到20),右邊那塊小的就是顯示“下一個”形狀的部分(橫坐標從14到17,縱坐標從3到6)。這個新的坐標系是整個游戲的基礎(chǔ),后面所有的移動、變形等的計算都是基于這個坐標系的。游戲中怎么判斷左右及向下移動的可能性?看懂了前面的各種形狀和游戲板等的表示,接下來的東西就都好辦多了。先來看一下某個形狀如何顯示在游戲板當(dāng)中。假設(shè)要在游戲板中顯示第一個形狀。第一個形狀在結(jié)構(gòu)中的表示如下:struct shape shapes19=/*x1,y1,x2,y2,x3,y3,x4,y4, color, next*/ 0,-2, 0,-1,
27、 0, 0, 1, 0, CYAN, 1, 那么這個組成形狀四個方塊的坐標表示為(0,-2)、(0,-1)、(0,0)和(1,0)。這實際上是相對坐標。假形狀的實際坐標指的是4x4方塊中的第二列、第三行的方塊的位置,設(shè)這個位置為(x,y)。那么組成這個形狀的四個小方塊的實際坐標(以第一個形狀為例)就是(x+0,y-2)、(x+0,y-1)、(x+0,y+0)和(x+1,y+0)。由于所有的形狀都可以在4x4的方塊陣列中表示,這樣就找到了一種統(tǒng)一的方法來表示所有的形狀了。-1 0 1 2-3 相對坐標-2 -1 組成第一種形狀的四個方塊的相對坐標為(0,-2)、(0,-1)、(0,0)和(1,0
28、)。0 讓我們看看形狀是如何顯示在游戲板中的(以第一個形狀為例)。1 2 3 4 5 6 7 8 9101 形狀的坐標為(2,3)。組成形狀的四個方塊的坐標由形狀的2 坐標加上這四個小方塊各自的相對坐標得出。它們分別是:3 (2+0,3-2)、(2+0,3-1)、(2+0,3-0)和(2+1,3-0)。即:4 (2,1)、(2,2)、(2,3)和(3,3)。如左圖所示。567 形狀的坐標為(1,9)。組成形狀的四個方塊的坐標分別是:8 (1+0,9-2)、(1+0,9-1)、(1+0,9-0)和(1+1,9-0)。即:9 (1,7)、(1,8)、(1,9)和(2,9)。如左圖所示。101112
29、131415161718 形狀的坐標為(9,20)。組成形狀的四個方塊的坐標分別是:19 (9+0,20-2)、(9+0,20-1)、(9+0,20-0)和(9+1,20-0)。即:20 (9,18)、(9,19)、(9,20)和(10,20)。如左圖所示。從現(xiàn)在起,我不再舉別的示例程序了。從現(xiàn)在開始所有的示例代碼均來自于我寫的"Russia.c"。為了記錄游戲板的狀態(tài),用了一個全局數(shù)組board1222。boardxy(其中x從0到11,y從1到21)等于1表示(x,y)這個位置已經(jīng)被填充了,組成形狀的四個方塊的坐標都不能為(x,y),否則將發(fā)生沖突。boardxy(其中
30、x從1到10,y從1到20)等于表示(x,y)這個位置還沒有被填充。游戲板初始化時,給board0y,board11y(其中y從1到21)都賦為1,給boardx21(其中x從1到10)都賦為1。這相當(dāng)于一開始就給游戲板左右和下方加了個“邊”。所有的形狀都不能夠移入這個“邊”,否則將發(fā)生沖突?,F(xiàn)在我們可以開始討論如何判斷一個形狀向左、向右和向下移動的可能性了。先說個概念,“當(dāng)前形狀”是指那個正在下落還沒有落到底的那個形狀。如果當(dāng)前形狀向左移動,不與游戲板現(xiàn)有狀態(tài)發(fā)生沖突,則可以向左移動。具體做法是:先假設(shè)當(dāng)前形狀已經(jīng)向左移動了,判斷此時是否與游戲板現(xiàn)有狀態(tài)發(fā)生沖突。如果不發(fā)生沖突,則可以向左移
31、動。否則,不可以向左移動。判斷索引號為ShapeIndex的形狀在坐標(x,y)是否與游戲板當(dāng)前狀態(tài)發(fā)生沖突的代碼如下。我把詳細的說明加在這段代碼中。enum bool Confilict(int ShapeIndex,int x,int y)int i;/* 對組成索引號為ShapeIndex的形狀的四個方塊依次判斷 */for (i=0;i<=7;i+,i+) /* i分別取0,2,4,6 */* 如果四個方塊中有任何一個方塊的x坐標小于1或大于10,表示超出左邊界或右邊界。此時,發(fā)生沖突。 */if (shapesShapeIndex.xyi+x<1 |shapesShape
32、Index.xyi+x>10) return True;/* 如果四個方塊中某個方塊的y坐標小于1,表示整個形狀還沒有完全落入游戲板中。此時,沒有必要對這個方塊進行判斷。*/if (shapesShapeIndex.xyi+1+y<1) continue;/* 如果四個方塊中有任何一個方塊與游戲板當(dāng)前狀態(tài)發(fā)生沖突,則整個形狀在(x,y)處與游戲板當(dāng)前狀態(tài)沖突 */if (boardshapesShapeIndex.xyi+xshapesShapeIndex.xyi+1+y)return True;/* 四個方塊中沒有任何一個方塊與游戲板當(dāng)前狀態(tài)發(fā)生沖突,則整個形狀在(x,y)處沒有
33、與游戲板當(dāng)前狀態(tài)沖突 */return False;對以上代碼附加說明如下: shapesShapeIndex.xyi(其中i等于0,2,4,6)表示組成索引號為ShapeIndex的形狀的某個方塊的x相對坐標。(i等于0時,表示第1個方塊的x相對坐標;i等于2時,表示第2個方塊的x相對坐標;i等于4時,表示第3個方塊的x相對坐標;i等于6時,表示第4個方塊的x相對坐標。)shapesShapeIndex.xyi(其中i等于1,3,5,7)表示組成索引號為ShapeIndex的形狀的某個方塊的y相對坐標。(i等于1時,表示第1個方塊的y相對坐標;i等于3時,表示第2個方塊的y相對坐標;i等于5時,表示第3個方塊的y相對坐標;i等于7時,表示第4個方塊的y相對坐標。)shapesShapeIndex.xyi+x(其中i等于0,2,4,6)表示索引號為ShapeIndex的形狀的坐標為(x,y)時,組成該形狀的某個方塊的x實際坐標。(i等于0時,表示第1個方塊的x實際坐標;i等于2時,表示第2個方塊的x實際坐標;i等于4時,表示第3個方塊的x實際坐標;i等于6時,表示第4個方塊的x實際坐標。)shape
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防火阻燃材料的應(yīng)用與測評
- 電子商務(wù)平臺銷售合同
- 寄賣合同范本模板
- 泥工勞務(wù)分包合同
- 沙石材料運輸合同范本
- 物業(yè)管理中的環(huán)境保護措施
- 房地產(chǎn)開發(fā)投資合同
- 輸尿管鏡項目可行性研究報告
- 平頭式塔式起重機臂架輕量化設(shè)計研究
- 委托合同中的利益沖突及其救濟
- 三年級上冊豎式計算練習(xí)300題及答案
- 點亮生命-大學(xué)生職業(yè)生涯發(fā)展與就業(yè)指導(dǎo)全套教學(xué)課件
- 旅居管家策劃方案
- 車間消防安全知識培訓(xùn)課件
- 華為經(jīng)營管理-華為的研發(fā)管理(6版)
- 鋰離子電池生產(chǎn)工藝流程圖
- 平衡計分卡-化戰(zhàn)略為行動
- 幼兒園小班下學(xué)期期末家長會PPT模板
- 礦山安全培訓(xùn)課件-地下礦山開采安全技術(shù)
- GB/T 6417.1-2005金屬熔化焊接頭缺欠分類及說明
- 《社會主義市場經(jīng)濟理論(第三版)》第七章社會主義市場經(jīng)濟規(guī)則論
評論
0/150
提交評論