




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
常州工學院學士學位設計PAGEPAGE23目錄第一部分設計任務…………………3一·設計目標……………3二·設計內(nèi)容……………3三·技術要求……………3四·與本課題相關的資料………………4第二部分設計說明…………………6一·設計分析……………6二·設計步驟……………7第三部分設計成果…………………10一·產(chǎn)品圖片……………10二·設計代碼……………11三·類的代碼……………14第四部分結(jié)束語……………………21一·畢業(yè)設計的歸納和總結(jié)……………21第五部分致謝…………23第六部分參考文獻…………………24
第一部分設計任務一.設計目標:此項目是模仿PopCapGames公司開發(fā)的一款同名游戲《植物大戰(zhàn)僵尸》而開發(fā)的,是一款益智策略類單機游戲,玩家通過武裝多種植物切換不同的功能,快速有效地把僵尸阻擋在入侵的道路上。不同的敵人,不同的玩法,游戲的內(nèi)容就是:玩家控制植物,抵御僵尸的進攻,保護主人的屋子。此游戲?qū)ν婕业囊笠彩谴竽X的智慧和小腦的反應,玩家可以從游戲中獲得成就感和戰(zhàn)略思維。特點:1、冒險模式。2、有不同的敵人和可使用道具,使游戲更具挑戰(zhàn)性。3、無限次重玩,不會經(jīng)歷兩次同樣的事件。二.設計內(nèi)容:通過玩家對不同植物的選擇,例如向日葵可快速產(chǎn)生陽光,豌豆射手可攻擊敵人等等,來操作游戲,后臺通過調(diào)整時間和參數(shù)達到前端界面游戲的可玩性。功能類別子功能前端游戲界面主界面模式選擇進入游戲確定關卡退出后臺代碼設計選擇、放置植物陽光生產(chǎn)時間收集陽光產(chǎn)生僵尸攻擊、殺死僵尸三.技術要求:前端:Javascript后臺:Servlet 開發(fā)工具:MyEclipse服務器:Tomcat6.0四·與本課題相關的資料1、豌豆射手耐久:300臨界點:0攻擊:20射程:正前方一整行射擊間隔:1.4秒價格:100陽光冷卻時間:7.5秒2、向日葵耐久:300臨界點:0生產(chǎn)間隔:24秒價格:50陽光冷卻時間:7.5秒3、土豆衛(wèi)士耐久:4000臨界點:0價格:50陽光冷卻時間:30秒4、寒冰射手耐久:300臨界點:0攻擊:20射程:正前方一整行射擊間隔:1.4秒價格:175陽光冷卻時間:7.5秒5.僵尸最普通最常見的僵尸,生命力低,移動速度慢,最多能挨十下豌豆的攻擊攻擊力100/s速度:約4.7s走完一格(此為僵尸普遍速度)
第二部分設計說明一·設計分析1游戲背景自古以來就有人類與僵尸之間的斗爭,為了奪取生存空間,一有機會,僵尸就向人類發(fā)起攻擊。當然人類也不會束手就擒,他們培養(yǎng)出的植物可以傷害僵尸,植物就是人類防備僵尸進攻的武器2游戲邏輯(1)僵尸是攻擊方,為了攻擊,防御僵尸,人類通過栽種培植出的各種植物來抵御進攻型僵尸的攻擊。植物需要相應的陽光值成長。(2)在作戰(zhàn)地點,玩家需要通過種植各種攻擊植物來消滅僵尸,也可以通過種防御植物來阻擋僵尸,還需要太陽花來產(chǎn)生種植需要的陽光。3僵尸作戰(zhàn)單位(1)普通僵尸。速度(1幀),血限3,毀掉植物需要3s。4植物作戰(zhàn)單位(1)太陽花。種植需陽光值50,作用:生產(chǎn)種植所需的陽光值,每隔10s生產(chǎn)50點陽光值,不具備攻擊力。(2)碗豆射手。種植需陽光值100,作用:5s發(fā)射一顆炮彈,戰(zhàn)斗值1。(3)寒冰射手。種植需陽光值175,作用:5s發(fā)射一顆炮彈,戰(zhàn)斗值1.(4)土豆衛(wèi)士。種植需陽光值50,作用:抵擋各種僵尸3s,主要用來防御,沒有任何戰(zhàn)斗力。等共5種可供選擇種植的植物。關卡簡介:所有的僵尸都會參與攻擊,所有的植物也都會參與作戰(zhàn),每次只能選取5種植物參與作戰(zhàn)。5碰撞邏輯說明僵尸會在屏幕的右邊生成,然后緩慢向左邊屏幕移動,如果在僵尸移動的線路上有攻擊型植物,則發(fā)射炮彈。當種植的植物或炮彈與僵尸接觸,即當他們的坐標相同的時候,即為接觸,接觸大小的區(qū)域就是圖片的大小區(qū)域。當炮彈與僵尸碰撞之后,炮彈也就會立即消失,同時僵尸生命值的也隨之減少一點。若炮彈未擊中任何僵尸,越出屏幕后也將消失。二·設計的步驟1:首先了解植物大戰(zhàn)僵尸含有哪些元素,有陽光,有僵尸,有能種植植物的草坪,有植物。有子彈。我們這里只是進行設計簡單的實現(xiàn)游戲,植物有單發(fā)射手,寒冰射手,櫻桃炸彈。僵尸只有普通僵尸。2:先設計最簡單的陽光類Sun.java,陽光會從天空掉落和植物生成,從天空掉落的陽光會進行掉落運動,植物生成的陽光是禁止不動的,所以陽光有一個isStatic是否靜止不動的布爾型標識,然后陽光在不是禁止不動的時候y坐標要增加就是下落,然后停止。所以在構造函數(shù)中隨機一個目標y值,陽光非禁止不動狀態(tài)下y坐標不斷增加,當?shù)竭_目標y值時候就把狀態(tài)更改為禁止不動,其次陽光有一個消失標識,采用Vector動態(tài)數(shù)組存儲陽光對象,繪制時候繪制該動態(tài)數(shù)組的所有陽光對象,如果該陽光的消亡標識為真就把該陽光從容器里面進行移除,陽光的消亡標識有兩種情況下變成真,一是用戶點擊,二是到了一定時間消亡標識為真,所以陽光有一個計數(shù)器變量count,然后不斷的自加,當?shù)竭_陽光的消亡時間就讓消亡標識為真,其次是用戶點擊了陽光,判斷用戶點到了陽光可以使用java中的Rect對象的contains方法判斷點在矩形范圍內(nèi),用戶點擊屏幕觸摸坐標在陽光的矩形范圍就讓消亡標識為真。繪制的時候陽光要不斷旋轉(zhuǎn),聲明一個角度變量angle不斷自加然后以陽光的中心點為旋轉(zhuǎn)中心旋轉(zhuǎn)陽光即可。3:接著我們設計一個草坪類Grass.java,草坪類的作用是用來種植植物,總共有5x9塊草坪,橫9豎5總共45塊草坪,草坪的屬性相對較于簡單,就有一個是否可種植植物的布爾型標識,有植物在這塊草坪上就不能進行植物種植了,所以聲明一個5x9的二維草坪數(shù)組,然后把草坪坐標寬高傳進去,其次草坪要有一個編號用來傳遞給植物用于植物鏟除索引出該草坪改變它的是否可種植植物標識,草坪的編號對應0到44,草坪的繪制方法用草坪的編號值%2除以2的余數(shù)如果是0就繪制藍色草坪否則繪制綠色草坪,這里我就是直接繪制一個矩形,然后在View的繪制函數(shù)中for循環(huán)繪制所有草坪這樣我們就可以看到藍綠相間的草坪了,當然草坪的方法還沒寫先寫好其他類再接著寫。4:設計好了草坪我們設計一個僵尸類Jiangshi.java,僵尸有一個整形變量type代表僵尸的類型,0代表普通僵尸,其次僵尸有一個整形變量hp代表僵尸的血量,然后有一個isMove布爾型標識表示僵尸是否可移動,僵尸在碰到植物的時候讓僵尸停止移動即正在吃食物,僵尸與植物的碰撞檢測可用矩形碰撞檢測,java的Rect對象有一個intersect方法用來判斷兩個矩形是否交合用于矩形碰撞檢測。僵尸的移動就是x坐標減去一個速度值即可即向左邊移動,依舊使用一個Vector容器來進行存儲僵尸,如果僵尸血量為0就從該容器移除僵尸,創(chuàng)建僵尸的時候可以使用一個固定二維數(shù)組,這是一個二維數(shù)組,第一維長度為10代表10波僵尸第二維表示要創(chuàng)建的僵尸,0表示普通僵尸,當?shù)竭_一定的時間就循環(huán)該波數(shù)的數(shù)組長度創(chuàng)建僵尸,然后波數(shù)值增加,比如這里第一波是一個普通僵尸,第二波是兩個普通僵尸,雖然僵尸數(shù)據(jù)是固定的,但是對僵尸出現(xiàn)的位置也要進行一下隨機。5:然后設計子彈類Zidan.java,子彈依舊有一個整型變量type表示子彈的類型,0表示普通子彈,跟僵尸一樣采用Vector存儲子彈對象,依舊有一個是否消失的標識,當子彈碰撞到僵尸后或者子彈的x坐標大于屏幕右邊就讓消失標識為真從容器里面移除子彈,子彈的移動就是x坐標增加一個速度往右邊移動。子彈同僵尸一樣有一個列屬性表示該子彈在哪一列,所以子彈與僵尸的列屬性相等的碰撞才視為有效碰撞,碰撞以后取出該子彈類型不同的類型對僵尸造成不同的傷害。6:設計道具類Daoju.java,道具依舊有一個整形變量type表示道具的類型,0代表鐵鏟,1代表向日葵,2代表單發(fā)豌豆射手,3代表寒冰射手,道具有一個isSelect是否被選中的布爾型屬性,如果被選中就在該區(qū)間繪制一個紅色的邊框,除此道具有一個布爾型變量是否冷卻狀態(tài),表示該道具是否在冷卻中,如果在冷卻中該道具不可使用,另外還需有一個計時器count,如果在冷卻狀態(tài)不斷自加,當達到了該道具的冷卻時間以后把該道具的冷卻狀態(tài)改為假。如果為冷卻狀態(tài)就繪制一個半透明灰色矩形以count作為進度值繪制在道具上面。用一個整形變量表示使用該道具所要消耗的陽光,不同的道具消耗不同的陽光值。依舊使用一個Vector容器來存儲道具對象。7:設計植物類Zhiwu.java,植物也有一個類型type,如果為0代表向日葵,1代表單發(fā)豌豆射手,2代表寒冰射手,也使用一個Vector存儲植物對象,植物也有一個hp表示植物的血量,不同類型的植物有不同的血量,植物有一個編號標識表示是在哪塊草坪上,當植物hp為0或者鏟除植物時候從Vector進行移除該植物,并獲取該植物編號所對應的草坪設置可種植狀態(tài)為真,植物的邏輯處理在不同類型處理不同的邏輯,在陽光狀態(tài)每隔一定時間從陽光容器里面進行添加陽光對象,如果是單發(fā)子彈就從子彈容器添加一個子彈對象,如果是雙發(fā)射手就添加兩個子彈對象,可以發(fā)子彈的植物需要封裝一個是否可發(fā)射子彈的方法,每次都讓可發(fā)射子彈的標識為假,當有僵尸出現(xiàn)在植物的攻擊范圍就是矩形碰撞檢測就讓發(fā)射子彈標識為真,如果為真才從容器添加子彈。
第三部分設計成果一·產(chǎn)品的圖片二·設計代碼1.主界面代碼(部分代碼)publicclassController{ privateWinwin; privateGridgrid; privateIndexWinindexwin; privateintx; privateinty; privateintlength=28; privateStringplantType="00111"; privateTimertimer; privateintsunValue; privateintcorpseNum; privatebooleanuproot=false;//斷定能夠挖除植物0可以挖除 privateintoperation=0;//0添加植物1鏟除植物 privateMoneyEnoughThreadmoneyEnoughThread; privateMap<Integer,String>carRunList=newHashMap<Integer,String>(); privateMap<Integer,String>bulletList=newHashMap<Integer,String>(); privateSunAutoProduceThreadsunAutoProduceThread; privateMap<Integer,Plant>plantList=newHashMap<Integer,Plant>(); privateMap<Integer,CarThread>carList=newHashMap<Integer,CarThread>(); privateMap<String,CorpseMoveThread>corpseList=newHashMap<String,CorpseMoveThread>(); privateMap<Integer,ProduceBullet>produceBulletTimer=newHashMap<Integer,ProduceBullet>(); publicController(){ indexwin=newIndexWin(this); } publicvoidstart(){ SunAdd.stop=false; this.x=15; this.y=80; grid=newGrid(this.x,this.y); sunValue=50; win=Win.getWin(this); timer=newTimer(this); //grid.start(); indexwin.setVisible(false); sunAutoProduceThread=newSunAutoProduceThread(this); moneyEnoughThread=newMoneyEnoughThread(this); win.toShow(); putSunValue(0); timer.start(); sunAutoProduceThread.start(); moneyEnoughThread.start(); grid.getBoard()[1][0]="31111"; grid.getBoard()[4][0]="31111"; grid.getBoard()[7][0]="31111"; grid.getBoard()[10][0]="31111"; grid.getBoard()[13][0]="31111"; corpseNum=grid.getNum(); } publicvoidnewCorpseThread(){ for(inti=0;i<grid.getBoard().length;i++){ if("11,12,13,14".contains(grid.getBoard()[i][length-1].substring(0,2))&& corpseList.get(grid.getBoard()[i][length-1])==null){ corpseList.put(grid.getBoard()[i][length-1],newCorpseMoveThread(this,i,length-1)); corpseList.get(grid.getBoard()[i][length-1]).start(); } } } publicintmoveBullet(intx,inty){ if(y+1==length-1&&grid.getBoard()[x][y].equals("21bullet")){ grid.getBoard()[x][y]="00111"; return-1; } if("11,12,13,14".contains(grid.getBoard()[x][y].substring(0,2))){ return-1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("01,02,03,04,05".contains(grid.getBoard()[x][y+1].substring(0,2)))){ bulletList.put(100*x+y+1,"21bullet"); grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ grid.getBoard()[x][y+1]=bulletList.get(100*x+y); bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ grid.getBoard()[x][y+1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } grid.getBoard()[x][y]="00111"; returny+1; } return-1; } publicintmoveCorpse(intx,inty){ if(y==0&&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ fail(); return-1; } if(y-1!=-1 &&!("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ grid.getBoard()[x][y-1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny-1; } if(y-1!=-1 &&("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ plantList.get(x*100+y-1).setHp(plantList.get(x*100+y-1).getHp()-1); if(plantList.get(x*100+y-1).getHp()==0){ grid.getBoard()[x][y-1]="00111"; } returny; } return-1; }三·類的代碼植物類的代碼publicclassPlant{ privateintid; privateintpower;//戰(zhàn)斗力 privateinthp;//生命值 privateintprice;//價格 privateinttrainTime;//培養(yǎng)時間 privatebooleantrainFinish=true; privatebooleancanPlant=false; publicPlant(intid){ this.id=id; init(id); } privatevoidinit(intid){ switch(id){ case1:power=0;hp=4;price=50;trainTime=5;trainFinish=true;canPlant=false;break;//向日葵 case2:power=1000;hp=100;price=150;trainTime=27;trainFinish=true;canPlant=false;break;//炸彈 case3:power=25;hp=6;price=100;trainTime=17;trainFinish=true;canPlant=false;break;//豌豆 case4:power=0;hp=20;price=50;trainTime=13;trainFinish=true;canPlant=false;break;//土豆 case5:power=25;hp=6;price=175;trainTime=21;trainFinish=true;canPlant=false;break;//雪花豌豆 } } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicintgetPower(){ returnpower; } publicvoidsetPower(intpower){ this.power=power; } publicintgetHp(){ returnhp; } publicvoidsetHp(inthp){ this.hp=hp; } publicintgetPrice(){ returnprice; } publicvoidsetPrice(intprice){ this.price=price; } publicintgetTrainTime(){ returntrainTime; } publicvoidsetTrainTime(inttrainTime){ this.trainTime=trainTime; } publicbooleanisTrainFinish(){ returntrainFinish; } publicvoidsetTrainFinish(booleantrainFinish){ this.trainFinish=trainFinish; } publicbooleanisCanPlant(){ returncanPlant; } publicvoidsetCanPlant(booleancanPlant){ this.canPlant=canPlant; }}2.草坪類的代碼(部分代碼)publicclassCell{ privateintx; privateinty; publicCell(){ } publicCell(intx,inty){ this.x=x; this.y=y; } publicintgetX(){ returnx; } publicvoidsetX(intx){ this.x=x; } publicintgetY(){ returny; } publicvoidsetY(inty){ this.y=y; } @Override publicStringtoString(){ return"Cell[x="+x+",y="+y+"]"; } @Override publicinthashCode(){ finalintprime=31; intresult=1; result=prime*result+x; result=prime*result+y; returnresult; } @Override publicbooleanequals(Objectobj){ if(this==obj) returntrue; if(obj==null) returnfalse; if(getClass()!=obj.getClass()) returnfalse; Cellother=(Cell)obj; if(x!=other.x) returnfalse; if(y!=other.y) returnfalse; returntrue; }}3.僵尸類的代碼importjava.util.ArrayList;importjava.util.List;publicclassCorpse{privateintid;privateinthp;privateintisHit=0;publicstaticfinalList<String>CORPSES=newArrayList<String>();publicCorpse(intid){ this.id=id; init(id);}privatevoidinit(intid){ CORPSES.add("11111"); CORPSES.add("12111"); CORPSES.add("13111"); CORPSES.add("14111"); switch(id){ case11:hp=100;break; case12:hp=150;break; case13:hp=200;break; case14:hp=250;break; }}publicintgetId(){ returnid;}publicvoidsetId(intid){ this.id=id;}publicintgetHp(){ returnhp;}publicvoidsetHp(inthp){ this.hp=hp;}publicintgetIsHit(){ returnisHit;}publicvoidsetIsHit(intisHit){ this.isHit=isHit;}@OverridepublicinthashCode(){ returnid;}@Overridepublicbooleanequals(Objectobj){ if(this==obj) returntrue; if(obj==null) returnfalse; if(objinstanceofCorpse) returnthis.id==((Corpse)obj).id; returnfalse; }}
第四部分結(jié)束語一·畢業(yè)設計的歸納和總結(jié)在學院領導老師的帶領和安排下,我們在這個學期,在學校進行了為期30天的畢業(yè)設計。在畢業(yè)設計中,我們在專編程技能以及軟件開發(fā)的總體架構思想上都收獲頗豐。本次畢業(yè)設計我們分為兩個階段,前十五天為第一階段,我們進行了理論知識的學習,鞏固和深化了所學的編程知識。以下談一談個人的感受與體會一、理論知識的學習在畢業(yè)設計進行的前十五天,我們上的是java編程的理論課。負責上課的老師言語風趣幽默而不失嚴謹,在老師的引導和啟發(fā)下,我們鞏固了之前在學校所學的編程知識,并加以深化,澄清之前對編程技術認識的一些錯誤或模糊的概念。我們還在課上以java里GUI編程常用的swing框架和JAVA的容器體系作為切入點,框架作為這期間除了學習一般的編程的知識技巧。在全面的系統(tǒng)的認識了框架同時補充學習了泛型技術,以及框架中架構思想的知識。在企業(yè)的實際編碼過程中,一個個框架構成了軟件的基石,只有掌握了幾門框架知識,才能在實踐中高效開發(fā),讓自己的產(chǎn)品在市場上立于不敗之地。在理論課的學習過程中,我們也暴露了一些問題,比如在學校上課學習時,對所學知識只是知其然而不知其所以然,不太愿意深鉆,和超前學習一些知識。二、項目開發(fā)實戰(zhàn)練習在結(jié)束了理論知識的學習之后,后十五天我們進行了項目開發(fā)的實戰(zhàn)練習。項目的名稱是Java桌面游戲開發(fā)植物大戰(zhàn)僵尸,雖然有所精簡,但是其內(nèi)容對我們學習仍具有相當?shù)膬r值,對我們了解真實的軟件的設計規(guī)范,編碼規(guī)范,文檔規(guī)范以及客戶對軟件的需求很有參考價值。這無疑是對我們很好的一次歷練機會,同時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學生心理健康教育活動
- 未來展望中級經(jīng)濟師試題及答案
- 行政管理經(jīng)濟法新教材試題及答案
- 經(jīng)濟法概論考試大綱試題及答案
- 響應式Web開發(fā)項目教程(HTML5 CSS3 Bootstrap)(第3版) 課件 第2章 CSS頁面樣式美化
- 語文變色龍課件設計與實施
- 通訊設備銷售及技術支持合作協(xié)議
- 新能源技術研發(fā)與轉(zhuǎn)讓合同書
- 服裝設計及生產(chǎn)流程優(yōu)化指南
- 水利水電工程工作的實際案例解析試題及答案
- (三模)烏魯木齊地區(qū)2025年高三年級第三次質(zhì)量監(jiān)測理科綜合試卷(含答案)
- 玉盤二部合唱簡譜
- 授權委托書電子版下載
- 土壤分析技術規(guī)范(第二版)
- 論文答辯武漢大學論文答辯開題報告PPT模板
- 推進白洋淀景區(qū)運營機制改革實施方案
- 2021年卒中中心建設相關制度及流程匯編
- 機械故障診斷大作業(yè)滾動軸承
- 密封件定位套機械加工工藝過程卡片
- 產(chǎn)品銷售合同模板
- 中國漢字演變-課件
評論
0/150
提交評論