24點(diǎn)游戲的開(kāi)發(fā)和實(shí)現(xiàn)課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  24點(diǎn)游戲的開(kāi)發(fā)和實(shí)現(xiàn)</p><p>  摘 要:近年來(lái),隨著經(jīng)濟(jì)的日益發(fā)展,人們的生活水平不斷提高,生活質(zhì)量也在漸漸的改善。適當(dāng)?shù)膴蕵?lè)游戲?qū)θ藗兊臉I(yè)余生活是不可必缺的。說(shuō)到娛樂(lè)游戲,人們可能會(huì)想到網(wǎng)絡(luò)上許許多多讓人迷戀的網(wǎng)絡(luò)游戲,比如說(shuō),傳奇,奇跡,cs等等。是的,的確這些游戲給人們的業(yè)余生活添加了很多樂(lè)趣。借鑒網(wǎng)上的邊鋒游戲,我用vc++開(kāi)發(fā)設(shè)計(jì)了24點(diǎn)游戲的實(shí)現(xiàn)算法,并在window

2、s圖形環(huán)境下設(shè)計(jì)出一個(gè)人機(jī)交互的游戲系統(tǒng)(類似于紙牌游戲)。</p><p>  關(guān)鍵詞:窮舉法 棧 遞歸函數(shù)</p><p>  The development and realization of 24 pionts game</p><p>  Abstract:Recently,with the development of economic ,the pe

3、ople’s life becomes better and better,life condition also is improving more and more.Proper recreation is indispensable in the people’s pasttime life.Mentioned to the game,people may associate many fascinated online game

4、s,such as Legend,MU,CS and so on.Certainly,these games enrich people’s life with more and more joys.Using the wing game for reference ,I developed and designed the realization arithmetic of 24 points game.Next I designed

5、 a</p><p>  Keyword:enumerating method stack recursive function</p><p>  1 24點(diǎn)游戲算法實(shí)現(xiàn)</p><p>  1.1 24點(diǎn)游戲簡(jiǎn)介</p><p>  要開(kāi)發(fā)一個(gè)游戲不是那么容易的,哪怕是簡(jiǎn)單的算術(shù)游戲。要是沒(méi)有一定的專業(yè)知識(shí),沒(méi)有一定的思維能力是不行的

6、。24點(diǎn)游戲是一個(gè)傳統(tǒng)的算術(shù)游戲,其游戲之精髓就是考驗(yàn)人腦的反應(yīng)能力。所謂24點(diǎn)游戲,就是通過(guò)加,減,乘,除4則運(yùn)算,將給定的4個(gè)整數(shù)算出24。當(dāng)然,傳統(tǒng)的紙牌游戲其數(shù)字是有限定范圍的,一般是從1到13。經(jīng)統(tǒng)計(jì),當(dāng)算的目標(biāo)數(shù)把24改為2的時(shí)候,獨(dú)立解數(shù)更多,就是解的形式趣于集中化,大多數(shù)最后一步用減法(如:2*8-3*5)。游戲時(shí)會(huì)感到單調(diào)。由于24的因數(shù)多,解的形式就豐富,能充分發(fā)掘游戲者數(shù)學(xué)發(fā)散思維能力。要做好一個(gè)簡(jiǎn)單的24點(diǎn)游戲要

7、具備很多知識(shí)。其中最主要的思想就是,24點(diǎn)的表達(dá)式要怎樣行成,這是此游戲的關(guān)鍵。而要做一個(gè)完美的24點(diǎn)紙牌游戲,則需要的知識(shí)將會(huì)更多?,F(xiàn)今,網(wǎng)絡(luò)上的紙牌游戲數(shù)不甚數(shù),比較出名的有聯(lián)眾游戲,邊鋒游戲,qq游戲。當(dāng)然,他們的開(kāi)發(fā)隊(duì)伍龐大之極不是我們個(gè)人可以比及的。因此要一個(gè)人做好一個(gè)比較完美的游戲,是需要一定的游戲天分。以下我就開(kāi)發(fā)24點(diǎn)游戲的幾個(gè)關(guān)鍵算法和分析做詳細(xì)的剖析。</p><p>  1.2 24點(diǎn)游戲的

8、算法</p><p>  1.2.1 24點(diǎn)算法(1)</p><p>  24點(diǎn)游戲的算法,其中最主要的思想就是窮舉法。所謂窮舉法就是列出4個(gè)數(shù)字加減乘除的各種可能性,包括括號(hào)的算法。我們可以將表達(dá)式分成以下幾種:首先我們將4個(gè)數(shù)設(shè)為a,b,c,d,,其中算術(shù)符號(hào)有+,—,*,/,(,)。其中有效的表達(dá)式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表達(dá)式。其中我們用枚舉類型

9、將符號(hào)定義成數(shù)字常量,比如用1表示+,2表示-等。如下是我對(duì)窮舉法的一種編程語(yǔ)言。在編程的頭部要對(duì)變量做下定義。其中a,b,c,d的范圍是1到13。因?yàn)閭鹘y(tǒng)的24點(diǎn)游戲是紙牌游戲,而紙牌游戲的數(shù)字就是從1到13,其中a是1,K是13,Q是12,J是11,其他的就是牌面的數(shù)字。這就需要在定義變量的時(shí)候要有限制。在vc++中的MFC編程中,在定義控件的變量范圍可以直接填寫(xiě)變量的最大和最小,在此編程中的最大是13,最小是1。這就給編程寫(xiě)語(yǔ)句帶

10、來(lái)了方便(因?yàn)槠渥詣?dòng)會(huì)生成語(yǔ)句)。下面我介紹下窮舉法的主要實(shí)現(xiàn),我們知道要實(shí)現(xiàn)24點(diǎn)的算法,就是通過(guò)4個(gè)數(shù)字,4個(gè)運(yùn)算符號(hào)和2對(duì)括號(hào)(最多為2對(duì)),通過(guò)各種組合判斷其結(jié)果是否為24。我們用a,b,c,d代替4個(gè)數(shù)字。考慮每種可能,總的算法就有7</p><p>  2有括號(hào)的(形如(a * b) * c * d);3有括號(hào)的(形如(a * b * c) * d);4有括號(hào)的(形如a * (b * c) * d);

11、5有括號(hào)的(形如(a * b) * (c * d));6有括號(hào)的(形如((a * b) * c) * d);7有括號(hào)的(形如(a * (b * c)) * d)。接下來(lái)就是對(duì)每一種進(jìn)行分析判斷。我們拿2種情況做為例子,一種是沒(méi)括號(hào)的,一種有括號(hào)的。先拿沒(méi)括號(hào)的分析。我們知道沒(méi)括號(hào)的式子包括其運(yùn)算符和數(shù)字總共為7個(gè)(3個(gè)運(yùn)算符,4個(gè)數(shù)字),于是我們定義一個(gè)數(shù)組,用于存放運(yùn)算符和數(shù)字。運(yùn)算符我們可以用枚舉變量來(lái)定義,首先我們通過(guò)循環(huán)語(yǔ)句形成

12、一個(gè)表達(dá)式子(但這個(gè)表達(dá)式的運(yùn)算循序是亂的)。表達(dá)式子有很多種情況,利用循環(huán)語(yǔ)句我們可以一一將其寫(xiě)出,例如(a+b+c+d,a+b+c-d,a+b+c*d,a+b+c/d….等等)生成表達(dá)式子的后,接著就是判別運(yùn)算順序。在沒(méi)有括號(hào)存在的情況下,我們令其先運(yùn)算*,/。這個(gè)順序的選擇很輕松,我們可以定義一個(gè)bool類型的函數(shù),我們對(duì)數(shù)組進(jìn)行掃描,當(dāng)掃描到/,*,其返回真值,就直接進(jìn)行運(yùn)算。依次照樣進(jìn)行掃描,當(dāng)所</p><

13、;p>  1.2.2 24點(diǎn)游戲算法(2)</p><p>  24點(diǎn)游戲的算法各種各樣,各有千秋,現(xiàn)在讓我們來(lái)討論另一種24點(diǎn)游戲算法。此算法是在dos下實(shí)現(xiàn)的,但其思想明確,語(yǔ)句簡(jiǎn)短。其主要思想是簡(jiǎn)化算法,他將24點(diǎn)的算法排序分成如下幾種,如下我們用a,b來(lái)代替變量。他將其分成如下6種情況,分別是a+b,a-b,b-a,a*b,a/b,b/a這6種情況,我們知道a+b和b+a是一樣的,a*b和b*a是

14、一樣的。這樣就可以省去2種算法。提高系統(tǒng)的使用效率,內(nèi)存占用量小。還有其第2個(gè)思想是在判別24點(diǎn)正確與否的時(shí)候,采用了與24點(diǎn)相減絕對(duì)直在1E-6之外則判別其為正確,這就給運(yùn)算帶來(lái)了精確度,就如5 5 5 1等的數(shù)字也可以輕松算出,不會(huì)略過(guò)了。如下我們通過(guò)一段程序來(lái)看看其主程序段。</p><p>  bool Search(int n) </p><p><b>  { <

15、;/b></p><p>  if (n == 1) { </p><p>  if ( fabs(number[0] - NUMBER_TO_CAL) < PRECISION ) { </p><p>  cout << expression[0] << endl; </p><p>  return t

16、rue; </p><p><b>  } else { </b></p><p>  return false; </p><p><b>  } </b></p><p><b>  } </b></p><p>  for (int i = 0;

17、i < n; i++) { </p><p>  for (int j = i + 1; j < n; j++) { </p><p>  double a, b; </p><p>  string expa, expb; </p><p>  a = number[i]; </p><p>  b =

18、number[j]; </p><p>  number[j] = number[n - 1]; </p><p>  expa = expression[i]; </p><p>  expb = expression[j]; </p><p>  expression[j] = expression[n - 1]; </p>

19、<p>  expression[i] = '(' + expa + '+' + expb + ')'; </p><p>  number[i] = a + b; </p><p>  if ( Search(n - 1) ) return true; </p><p>  expression[i] =

20、 '(' + expa + '-' + expb + ')'; </p><p>  number[i] = a - b; </p><p>  if ( Search(n - 1) ) return true; </p><p>  expression[i] = '(' + expb + '

21、-' + expa + ')'; </p><p>  number[i] = b - a; </p><p>  if ( Search(n - 1) ) return true; </p><p>  expression[i] = '(' + expa + '*' + expb + ')'

22、; </p><p>  number[i] = a * b; </p><p>  if ( Search(n - 1) ) return true; </p><p>  if (b != 0) { </p><p>  expression[i] = '(' + expa + '/' + expb + &

23、#39;)'; </p><p>  number[i] = a / b; </p><p>  if ( Search(n - 1) ) return true; </p><p><b>  } </b></p><p>  if (a != 0) { </p><p>  expre

24、ssion[i] = '(' + expb + '/' + expa + ')'; </p><p>  number[i] = b / a; </p><p>  if ( Search(n - 1) ) return true; </p><p><b>  } </b></p>

25、<p>  number[i] = a; </p><p>  number[j] = b; </p><p>  expression[i] = expa; </p><p>  expression[j] = expb; </p><p><b>  } </b></p><p>

26、<b>  } </b></p><p>  return false; </p><p><b>  } </b></p><p>  我們簡(jiǎn)單分析下以上的程序,我們可以清楚看到,SEARCH函數(shù)一個(gè)遞歸函數(shù),其返回的是bool類型的值,其中number[0]為計(jì)算結(jié)果,假若其值和24相減為1E-6,則說(shuō)明算法正確。其主

27、要思想如下:首先我們?nèi)∏懊娴膬蓚€(gè)數(shù)a,b對(duì)其進(jìn)行相加,接著將兩個(gè)相加的數(shù)結(jié)果存放于number[i]中,于是第2次循環(huán)的運(yùn)算的時(shí)候,令其a= number[i];則a成了原先的a和b之和,接著再將其存放于number[i]中,接著我們看到了程序中的遞歸函數(shù)SEARCH(n-1)。當(dāng)調(diào)用遞歸函數(shù)的時(shí)候,我們可以看到其實(shí)現(xiàn)了所有數(shù)的相加,其中的n從原來(lái)的最大值4,經(jīng)過(guò)遞歸達(dá)到2,最后生成4個(gè)數(shù)之和。接著就是遞歸函數(shù)的調(diào)用,假如number[

28、i]其中i=0時(shí),如果number[i]與24相減為零,則可以算出24點(diǎn)。如果,其返回直為否,則說(shuō)明不能算出24點(diǎn)。則程序往下繼續(xù)執(zhí)行,接著是判斷其他運(yùn)算。同樣的道理可以得出其返回值的正假,由此判斷出24點(diǎn)的生成算法。注意假如我們只是簡(jiǎn)單的用計(jì)算結(jié)果和24相減為0則大錯(cuò)特錯(cuò)了,因?yàn)槠渲袪可媪说叫?shù)的問(wèn)題。假如在運(yùn)算中遇到了小數(shù)的式子不算,則此種判別是正確的,但24點(diǎn)游戲是</p><p>  我們可以舉個(gè)例子如5

29、 5 5 1 ,其中的運(yùn)算就牽涉到了小數(shù),其算法為(5-1/5)*5。只要我們的判別是如以上程序的,則此算式將輕易的解出。還有一點(diǎn)就是,簡(jiǎn)化式子的算法。形如a+b和b+a是一樣的,可以省略其中的一種。</p><p>  24點(diǎn)游戲的算法有多種多樣,以上我只是簡(jiǎn)單對(duì)2種不同思想的算法做了簡(jiǎn)短的介紹,當(dāng)然還有些算法也是大同小異,我們也不逐一列出了。介紹了24點(diǎn)算法后,接下來(lái)我們來(lái)探討一下,一個(gè)有著紙牌圖形界面的24

30、點(diǎn)游戲?qū)⒃鯓油瓿伞?lt;/p><p>  1.2.3 24點(diǎn)算法的多樣性(即多解的算法和優(yōu)化算法)的討論</p><p>  我們拿遞歸算法來(lái)分析其算法的多樣性。我們知道遞歸算法是通過(guò)調(diào)用一個(gè)遞歸函數(shù),將n值依次減1到最小值為止。并且在此遞歸的過(guò)程中實(shí)現(xiàn)了,表達(dá)式的4則運(yùn)算,然而在以上的遞歸函數(shù)中已經(jīng)考慮到了各種算法的可能性。其主要思想就是對(duì)4個(gè)數(shù)字的運(yùn)算順序和運(yùn)算符號(hào)通過(guò)遞歸逐一的算出各

31、種表達(dá)式。先重加法算起,依次算到除法(被除數(shù)不為零)為止。顯然,其中已經(jīng)包括了24點(diǎn)的所有算法,假如要輸出每種可能性進(jìn)性判別其優(yōu)化性,那就需要用到編譯原理的知識(shí)。通過(guò)逆波蘭式的判定,求出其最優(yōu)化的算法。我們拿a+b+c+d為例子,我們知道在有括號(hào)的情況下,(a+b)+(c+d)以及(a+b+c)+d這3種情況中,很明顯前一種是最簡(jiǎn)潔。那我們?cè)诔绦蛑幸绾卧O(shè)置其最簡(jiǎn)單的算法呢。這就需要對(duì)兩種算法進(jìn)行逆波蘭式的判別,我們將前者寫(xiě)成逆波蘭式,

32、則為ab+c+d+,第2種寫(xiě)成逆波蘭式為也為ab+c+d+。說(shuō)明兩者運(yùn)算的結(jié)果是一樣的。但是很明顯,前者簡(jiǎn)潔。因此,對(duì)于逆波蘭式相同,但實(shí)際程序中不同的程序,就可以判斷其優(yōu)化程度。假如我們將左右括號(hào)定義為枚舉變量,接著掃描每個(gè)字符,假如字符串最短的則為最優(yōu)化的算法。還有我們假定,在能用中間過(guò)程</p><p>  1.3 24點(diǎn)游戲輸入表達(dá)式的判別算法</p><p>  討論了24點(diǎn)游戲

33、的各種算法思想后,接著要考慮的是游戲的關(guān)鍵技術(shù),即是表達(dá)式的判別。表達(dá)式的判別是除了算法之后的首當(dāng)其沖也解決的問(wèn)題。何為表達(dá)式判別?所謂表達(dá)式的判別就是,你在對(duì)話框中輸入數(shù)字和字符的時(shí)候,是不是牌面所顯示的值,這是一個(gè)非常關(guān)鍵的重點(diǎn)。我們舉個(gè)例子說(shuō)明下,假設(shè)現(xiàn)在我們已經(jīng)開(kāi)始某一個(gè)24點(diǎn)紙牌游戲,然后按下開(kāi)始鍵。接著游戲截面顯示了,紅桃A,黑桃5,紅桃5和梅花5這4張牌,要求你算出24點(diǎn)。假設(shè)現(xiàn)在你要測(cè)試這個(gè)游戲的表達(dá)式判別怎么樣。那我們

34、可以輕松的試出其正確與否。我們可輸入1*2*3*4這個(gè)算式子。如果系統(tǒng)未提示任何錯(cuò)誤,反而彈出計(jì)算正確的提示。則說(shuō)明此游戲沒(méi)有做任何的表達(dá)式判別,至少?zèng)]有對(duì)輸入數(shù)字進(jìn)行控制。這就是所謂的表達(dá)式判別。然而要做到表達(dá)式真正的符和要求,其需要對(duì)其采取一定的措施。表達(dá)式判別有簡(jiǎn)單有復(fù)雜,我們的目的是力爭(zhēng)簡(jiǎn)潔但實(shí)用。要進(jìn)行表達(dá)式的判別,我們必須要用編譯原理。編譯原理是對(duì)計(jì)算機(jī)語(yǔ)言進(jìn)行文法分析,詞法分析的一種學(xué)科。特別是對(duì)表達(dá)式運(yùn)算順序和表達(dá)式輸入

35、正確與否能輕易的做出。我們將在文本中輸入的一段字符串,將其進(jìn)性文法分析和語(yǔ)法判斷。我們可以輕松的將其判斷</p><p>  我們拿上面最復(fù)雜的例子做分析,得出逆波蘭式子的思想。其實(shí),逆波蘭的思想是利用了棧的功能。我們看,我們將第一個(gè)字符a推入棧頂,接著推入第2字符,接著第3,4一直將推如棧中。假如,中間遇到了運(yùn)算符號(hào),就如在c后面遇到了*號(hào),則系統(tǒng)將離*號(hào)最近的兩個(gè)變量進(jìn)行乘運(yùn)算,得到一個(gè)結(jié)果。將b,c棧合并用

36、于存放結(jié)果。接著在往棧中推入b,d,我們看到在d后又出現(xiàn)了*號(hào),著將離*最近的兩個(gè)變量進(jìn)行想乘,并且合并棧,將結(jié)果存放于棧中。依著以上的思想進(jìn)行運(yùn)算,就可以實(shí)現(xiàn)語(yǔ)句a:=b*c+b*d。因此我們?cè)谂袛噍斎氡磉_(dá)式是否錯(cuò)誤的時(shí)候就可以利用此種思維方法。我們將每個(gè)輸入的字符推入棧中,并且對(duì)其進(jìn)行判別,假如遇到的字符是除了如(1—9,+,-,*,/,(,))等符號(hào)外的數(shù)據(jù),則說(shuō)明輸入有誤,此算法完成了語(yǔ)法錯(cuò)誤的判別。接著是判斷,輸入的數(shù)字和系統(tǒng)

37、給的直是否一樣,這也非常的簡(jiǎn)單。我們對(duì)每次推入棧的數(shù)字和系統(tǒng)的數(shù)字進(jìn)行比較,假如有不同的則報(bào)“數(shù)字和系統(tǒng)提供的不相同”的錯(cuò)誤。在判斷括號(hào)匹配的時(shí)候,我們可以定義一整形數(shù)組變量a[]和2個(gè)整形變量count1,count2另其初始值全為0,當(dāng)遇到左括號(hào)字符是另其變量a[0</p><p>  1.4 紙牌游戲界面的算法</p><p>  1.4.1 獲得紙牌界面的函數(shù)</p>

38、<p>  接下來(lái)是紙牌游戲的制作,要做紙牌游戲。首先必須要有紙牌的界面。界面需要通過(guò)截圖來(lái)獲得。將一副標(biāo)準(zhǔn)撲克牌的52張牌面截下來(lái),將其加入到vc++的res文件夾中,也就是資源文件夾。并且將其中的52張紙牌牌面進(jìn)行系統(tǒng)化的命名。比如,用a前綴代替紅桃,b前綴代替黑桃,c前綴代替梅花,d前綴代替方塊。這樣52張牌就對(duì)應(yīng)了52個(gè)圖形文件。做好了牌面的截圖后就是對(duì)其進(jìn)行發(fā)牌。發(fā)牌算發(fā)也是一個(gè)直的考慮是關(guān)鍵。我們將其中的52個(gè)數(shù)

39、設(shè)為數(shù)組行如:a[52] ,這樣每張牌就對(duì)應(yīng)了數(shù)組中的一個(gè)變量。我們先將每個(gè)數(shù)和數(shù)組相連接起來(lái)。接著我們用一個(gè)隨即函數(shù)令其隨即的產(chǎn)生4個(gè)數(shù),函數(shù)行如:</p><p>  b[1]=rand() b[2]=rand() b[3]=rand() b[4]=rand(),其函數(shù)的意思就是產(chǎn)生隨即數(shù)。但是這里產(chǎn)生的隨即數(shù)都是任意的,可能大于52。這樣我們需要對(duì)產(chǎn)生的隨即數(shù)進(jìn)行處理。在這里我們使用整除求余功能,如:b[1

40、]=rand()%52+1 這樣每次輸出隨即數(shù)就不會(huì)大于52了,達(dá)到了預(yù)期的效果。</p><p>  此程序的關(guān)鍵就是隨即搜索牌面的路徑,通過(guò)牌面的搜索和刷新,形成一組新的數(shù)字,根據(jù)此4個(gè)數(shù)字生成24點(diǎn)。其中最主要的函數(shù)就是一個(gè)隨即函數(shù)rand(),此函數(shù)是c++系統(tǒng)中自帶的函數(shù),存放于stblib.h頭文件中。此函數(shù)在使用之前,必須有個(gè)誘導(dǎo)函數(shù)srand()。通過(guò)調(diào)用Rand()函數(shù)就可以生成隨即數(shù)據(jù),但隨即

41、函數(shù)生成的數(shù)字是凌亂無(wú)序的,它范圍很大,因此必須對(duì)它加以限定范圍,這時(shí)我們用到了一個(gè)方法,就是用整除求余的方法。假如將52張牌標(biāo)記成0到51的數(shù)字,那么我們可以通過(guò)對(duì)隨即函數(shù)求余的方法,找到每張牌。其函數(shù)形式為rand()%52+1;其中形成的0到51個(gè)數(shù)將代表一副撲克牌中的52張。牌面在程序中將怎樣生成?首先我們要做的是截圖,所謂截圖就是從已有的紙牌游戲中截下相應(yīng)的52張牌(不包括大,小王)。將其中的52張牌存放為52個(gè)圖片文件。要注

42、意在文件命名的時(shí)候是有講究的,因?yàn)榇撕笠阉髋频穆窂?。因此給其中的牌面文件命名時(shí)要有統(tǒng)一性,又要有區(qū)別性。統(tǒng)一性就是我們可以將4種不同花色的牌分別命名以a,b,c,d開(kāi)頭,區(qū)分性就是我們用每張牌面的數(shù)值來(lái)區(qū)分其不同行。比如,我們命名黑桃k為a13,</p><p>  rectdate[0].originrect.top =rectdate[0].rect.top =50;</p><p

43、>  rectdate[0].originrect.bottom=rectdate[0].rect.bottom =rectdate[0].rect.top+height;</p><p>  rectdate[0].originrect.left =rectdate[0].rect.left =50;</p><p>  rectdate[0].originrect.right

44、=rectdate[0].rect.right =rectdate[0].rect.left+width;</p><p>  rectdate[0].firstrect =rectdate[0].originrect;</p><p>  4張紙牌對(duì)應(yīng)于其中的4個(gè)如上的函數(shù),其他三個(gè)同理可得。只是大小上有點(diǎn)差別,比如高度,左右位置等都應(yīng)該有相應(yīng)的變化。</p><p

45、>  存放位置編好了之后,接著就是在怎樣生成圖片了。在API中生成圖片我們用到了繪制圖片的功能和刷新功能。</p><p>  1.4.2不發(fā)重復(fù)牌的算法</p><p>  我們?cè)谕瓿杉埮朴螒蚪缑娴脑O(shè)計(jì)之后,接著要考慮的一個(gè)問(wèn)題就是:因?yàn)槟阌玫降氖且桓迸?,如何?shí)現(xiàn)每次發(fā)牌的時(shí)候不產(chǎn)生相同的牌面。這是游戲中的一個(gè)關(guān)鍵,也是程序成功與否的關(guān)鍵因素。其實(shí),要完成此功能也極為簡(jiǎn)單。既然我們

46、在做界面的時(shí)候已經(jīng)給52張牌給了命名,則我們只要對(duì)52張牌的花色進(jìn)行分類。就如上面所提到的,用52個(gè)有著相同點(diǎn)又有區(qū)別的圖形文件來(lái)區(qū)分其花色和大小。接著我們定義一個(gè)a[52],將52張牌按順序依次存放于數(shù)組中。其中花色一樣的牌為一樣的順序,例如紅桃花色的牌存放在a[0]-a[12]中,黑桃的牌存放在a[13]-a[25]中,梅花花色為a[26]-a[38]中,方塊為a[39]-a[51]中。這樣做的目的是為了有利于判別其花色。將花色進(jìn)行

47、了分類后,我們可以對(duì)其進(jìn)行選擇判斷了。比如我們要拿一張紅桃10,則具備兩個(gè)條件的數(shù)組值只有一個(gè)。首先我們找出大小為10的值,我們知道有4個(gè),接著我們要找到紅桃花色,這只要我們做簡(jiǎn)單的判斷,即數(shù)組的下標(biāo)(這里我們?cè)O(shè)它為i)0=<i<=12。通過(guò)以上的查找我們可以找到紅心10。我們知道一張牌有兩個(gè)要素組成,一個(gè)是大小,一個(gè)花色。大小我們可以對(duì)其很好的做</p><p>  1.4.3重新發(fā)牌的函數(shù)<

48、/p><p>  重新開(kāi)始游戲的算法簡(jiǎn)介。我們知道游戲中重新開(kāi)始是肯定要用到的,你不可能讓別人只算一次,這就失去了其實(shí)際意義,也得不到娛樂(lè)和益智的效果。因此,重新發(fā)牌也是其中很重要的算法。在API的編程中,我們使用了一個(gè)關(guān)鍵技術(shù),那就是刷新函數(shù)。刷新函數(shù)可以令原有的界面撤消,然后在重新繪制界面。</p><p>  如下讓我們看看此24游戲中,重新發(fā)牌的關(guān)鍵程序。</p><

49、;p>  void CWorkView::OnPaint() //重新繪制牌面的程序</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  CPaintDC dc(this); // device context for painting</p>

50、<p>  for(i=0;i<4;i++)</p><p><b>  {</b></p><p>  rectdate[i].hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),rec</p><p>  GetObject(rectdate[i].hBitmap, size

51、of BITMAP, &bm1);</p><p>  SelectObject(hSrcDC1, rectdate[i].hBitmap);</p><p>  ::SetStretchBltMode(hDesDC1,COLORONCOLOR); </p><p>  ::StretchBlt(hDesDC1, rectdate[i].rect

52、.left, rectdate[i].rect.top, width, height, hSrcDC1, 0, 0, bm1.bmWidth, bm1.bmHeight,+SRCCOPY);</p><p><b>  }</b></p><p>  通過(guò)以上的函數(shù),我們就可以得到下一輪游戲的牌面。</p><p>  以上是完成一個(gè)簡(jiǎn)單24點(diǎn)

53、游戲必要的程序設(shè)計(jì),接著我介紹下游戲中其他的一些控件。比如時(shí)間控制,開(kāi)始和結(jié)束控制等。</p><p>  1.5 其他一些控件的設(shè)置</p><p>  1.5.1 時(shí)鐘的設(shè)置</p><p>  時(shí)鐘是用來(lái)控制游戲速度,和提高的人的智力所必需的控件。也是為游戲增添樂(lè)趣,提供思索空間所必需的。時(shí)鐘的設(shè)置在vc++鐘也是比較簡(jiǎn)單的,其中用到的函數(shù)也非常簡(jiǎn)介,接著讓我

54、們來(lái)看看其簡(jiǎn)單的程序。</p><p>  void CWorkView::OnTimer(UINT nIDEvent) //定時(shí)器響應(yīng)程序</p><p>  {CString temp;</p><p>  UpdateData(true);</p><p>  temp=m_edit;</p><p>  t

55、imercount--;</p><p>  m_edit4=timercount;</p><p>  UpdateData(FALSE);}</p><p>  if(timercount<=0)</p><p>  {KillTimer(1) ;</p><p>  timercount=30;</p

56、><p>  (CButton*)CWnd::GetDlgItem(IDC_BUTTON5)->EnableWindow(TRUE);}</p><p>  查看如上函數(shù),我們看到的關(guān)鍵函數(shù)就只有一個(gè),那就是KillTimer函數(shù)。我們從他的拼寫(xiě)可以看到,其意思是消除時(shí)間。其中還用到了控制時(shí)間秒數(shù)的變量timercount,在如上函數(shù)中其最大直為30,則說(shuō)明游戲?qū)⒃?0秒內(nèi)結(jié)束。另外在時(shí)

57、間控制下,其他一些控件也要實(shí)行相應(yīng)的變化。在如上程序中,id為IDC-BUTTON5的空件在時(shí)間結(jié)束的時(shí)候要消除灰化。</p><p>  1.5.2 游戲的開(kāi)始和結(jié)束控制</p><p>  每個(gè)游戲都有其游戲的開(kāi)始控制和結(jié)束控制,當(dāng)然24點(diǎn)游戲也不例外。因此要控制游戲的開(kāi)始結(jié)束也是游戲中必要的控件。我們來(lái)看下其程序:</p><p>  void CWorkVi

58、ew::OnButton5()</p><p>  {if(istimer==false)</p><p>  {SetTimer(1,1000,NULL);</p><p>  (CButton*)CWnd::GetDlgItem(IDC_BUTTON5)->EnableWindow(FALSE);</p><p>  (CButto

59、n*)CWnd::GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);</p><p>  (CButton*)CWnd::GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);</p><p>  (CButton*)CWnd::GetDlgItem(IDC_BUTTON4)->EnableWin

60、dow(FALSE);}}</p><p>  其中在控件中我們添加了控件BUTTOM5,用于控制游戲的開(kāi)始。當(dāng)按下開(kāi)始按鈕時(shí),我們將控件BUTTTON3,2,4都灰化。這就實(shí)現(xiàn)了簡(jiǎn)單的游戲開(kāi)始控制。 </p><p>  結(jié)束按鈕和開(kāi)始按鈕大同小異,這里我們就不詳細(xì)介紹了。</p><p>  1.6 游戲的實(shí)現(xiàn)其具體的函數(shù)</p><p>

61、;  1.6.1 游戲?qū)崿F(xiàn)后的主要界面</p><p>  完成了以上4大節(jié)工作之后,一個(gè)簡(jiǎn)單的24點(diǎn)游戲程序就基本生成了。接著就是在程序上做簡(jiǎn)單的修改,查漏補(bǔ)缺。通過(guò)游戲的連接,編譯并運(yùn)行。運(yùn)行沒(méi)有出錯(cuò),程序就運(yùn)行如下。</p><p>  從界面中我們看到了其中的主要功能都具備了。有相應(yīng)的表達(dá)式輸入功能,查看結(jié)果功能,顯示正確答案功能,重新發(fā)牌,牌面設(shè)置以及定時(shí)控制。在菜單中有文件和幫

62、助兩個(gè)主菜單。其中文件菜單中有開(kāi)始和結(jié)束控制。</p><p>  如下分細(xì)節(jié)對(duì)系統(tǒng)實(shí)現(xiàn)進(jìn)行分析,首先我們來(lái)看下按下設(shè)置牌面產(chǎn)生的效果。</p><p>  我們看到,在按下了設(shè)置牌面的時(shí)候,彈出一個(gè)牌面設(shè)置的窗口。在請(qǐng)輸入牌面的輸入框中默認(rèn)了牌面數(shù)字全為1,當(dāng)然我么可以將其改寫(xiě),比如我們改為3 4 3 5 并按下確定,則彈出如下窗口。</p><p>  我們可以

63、看到按照如上的要求我們實(shí)現(xiàn)了牌面的自定義功能。接著我們來(lái)看看表達(dá)式輸時(shí)產(chǎn)生的一些錯(cuò)誤信息提示,包括語(yǔ)法錯(cuò)誤,括號(hào)匹配,數(shù)字匹配等。我在如下一一都顯示出來(lái)。</p><p>  其中的3個(gè)錯(cuò)誤我們可以清楚的看到,當(dāng)我們看到在第一個(gè)窗口中輸入了與紙牌數(shù)字不正確的數(shù)字之后,提示了“請(qǐng)注意輸入的數(shù)值是否正確”。在第二個(gè)窗口中輸入了左括號(hào)后直接點(diǎn)擊“單機(jī)查看結(jié)果”鍵時(shí)彈出“括號(hào)不匹配”的錯(cuò)誤提示。在第三個(gè)窗口中輸入“方法”

64、倆漢字的時(shí)候,我們看到了“輸入語(yǔ)法錯(cuò)誤”的提示。以上我將所有的錯(cuò)誤信息都做了很好的圖文說(shuō)明。</p><p>  以下是輸入正確表達(dá)式,并得出24點(diǎn)算法后的界面顯示。我們?cè)谂泼嬖O(shè)置的時(shí)候輸入5 5 5 1 4個(gè)數(shù)字的時(shí)候,顯示正確結(jié)果的截面如下。</p><p>  如上我們看到界面中彈出了“計(jì)算正確”的消息框,實(shí)現(xiàn)了24點(diǎn)游戲表達(dá)式的最后判別。</p><p> 

65、 1.6.2 24點(diǎn)算法的程序?qū)崿F(xiàn)</p><p>  //計(jì)算24點(diǎn)的答案程序</p><p>  BOOL Calc24(int iNum1, int iNum2, int iNum3, int iNum4, CString& strResult) // </p><p>  { //括號(hào)的幾種情況</p><p><b

66、>  //無(wú)括號(hào)</b></p><p>  //2 (a b) c d同a b (c d), 下省略</p><p>  //3 (a b c) d</p><p>  //4 a (b c)d</p><p>  //5 (a b) (c d)</p><p>  //6 ((a b) c) d

67、</p><p>  //7 (a (b c)) d</p><p>  int iNumArr[4];//定義一維數(shù)組 用于存放輸入的數(shù)值</p><p>  iNumArr[0] = iNum1;</p><p>  iNumArr[1] = iNum2;</p><p>  NumArr[2] = iNum3;&

68、lt;/p><p>  iNumArr[3] = iNum4;</p><p>  if (CalcArray1(iNumArr, strResult))//調(diào)用CalcArray1函數(shù)判斷其是否能算出24 </p><p><b>  {</b></p><p>  return TRUE;</p><

69、p><b>  }</b></p><p>  if (CalcArray2(iNumArr, strResult)) //調(diào)用CalcArray2函數(shù)判斷其是否能算出24 </p><p><b>  {</b></p><p>  return TRUE;</p><p><b>

70、;  }</b></p><p>  if (CalcArray3(iNumArr, strResult)) 調(diào)用CalcArray3函數(shù)判斷其是否能算出24</p><p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b>&l

71、t;/p><p>  if (CalcArray4iNumArr, strResult)) 調(diào)用CalcArray4函數(shù)判斷其是否能算出</p><p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>

72、  if (CalcArray6(iNumArr, strResult)) 調(diào)用CalcArray6函數(shù)判斷其是否能算出</p><p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  if (CalcArray7(i

73、NumArr, strResult)) 調(diào)用CalcArray7函數(shù)判斷其是否能算出</p><p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p>  return FALSE;</p><p>

74、<b>  }</b></p><p>  BOOL CalcArray1(int iNumInput[], CString& strResult)//沒(méi)有括號(hào)的一個(gè)函</p><p>  //數(shù),類似的函數(shù)還有6個(gè),這里不另外寫(xiě)上去了。</p><p><b>  {</b></p><p&g

75、t;  // a * b * c * d 7 number</p><p>  int iNumMaths[7][2];//其中包括數(shù)值變量和運(yùn)算符號(hào)有7個(gè)字符</p><p>  for(int i=0;i<4;i++)//循環(huán)語(yǔ)句判斷輸入的4個(gè)數(shù)字</p><p><b>  {</b></p><p>

76、;  for(int j=0;j<4;j++) </p><p><b>  {</b></p><p><b>  if(j==i)</b></p><p><b>  {</b></p><p><b>  continue;</b><

77、;/p><p><b>  }</b></p><p>  for(int k=0;k<4;k++)</p><p><b>  {</b></p><p>  if(k==i||k==j)</p><p><b>  {</b></p>

78、<p><b>  continue;</b></p><p><b>  }</b></p><p>  for(int l=0;l<4;l++)</p><p><b>  {</b></p><p>  if(l==i||l==j||l==k)</

79、p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  iNumMaths[0][0]=iNumInput[i];//將數(shù)值存入數(shù)組中</p><p>  iNu

80、mMaths[2][0]=iNumInput[j];</p><p>  iNumMaths[4][0]=iNumInput[k];</p><p>  iNumMaths[6][0]=iNumInput[l];</p><p>  iNumMaths[0][1]=eNumber;//將此字符代表數(shù)值還是運(yùn)算符號(hào)的值存入數(shù)組</p><p>

81、  iNumMaths[2][1]=eNumber;</p><p>  iNumMaths[4][1]=eNumber;</p><p>  iNumMaths[6][1]=eNumber;</p><p>  for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)//通過(guò)循環(huán)語(yǔ)句實(shí)現(xiàn)運(yùn)算順序</p>&l

82、t;p>  for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)</p><p>  for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)</p><p><b>  {</b></p><p>  iNumMaths[1][0] = oneOP;//

83、通過(guò)循環(huán)得到第一個(gè)字符的運(yùn)算符號(hào)先/,*后+ ,-</p><p>  iNumMaths[1][1] = eOperator;//表明第一個(gè)輸入的字符為變量還是運(yùn)算符號(hào)</p><p>  iNumMaths[3][0] = twoOP;</p><p>  iNumMaths[3][1] = eOperator;</p><p>  iN

84、umMaths[5][0] = threeOP;</p><p>  iNumMaths[5][1] = eOperator;</p><p>  double dRes = CalcOneExpress(iNumMaths, 7);</p><p>  if(Equal24(dRes))</p><p>  CombineResult(iN

85、umMaths, 7, strResult);//合并結(jié)果</p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  }//e

86、nd for (int oneOP</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return

87、FALSE;</p><p><b>  }</b></p><p>  1.6.3 24點(diǎn)算法表達(dá)式的判別程序</p><p>  int temp=0;//用于控制if語(yǔ)句的判斷</p><p>  int total;//用于判斷輸入數(shù)字和牌面數(shù)字是否匹配</p><p>  rrorNum

88、=3;//3種錯(cuò)誤判斷和一種正確結(jié)果的變量</p><p>  CString s;//用于在輸入框中輸入字符的變量</p><p>  UpdateData(true);</p><p><b>  s=m_edit;</b></p><p>  int length=s.GetLength();</p>

89、<p><b>  int dd;</b></p><p>  UpdateData(FALSE);</p><p>  int nLength=m_edit.GetLength();</p><p>  har * sz=new char[nLength];</p><p>  sz=m_edit.GetB

90、uffer(0);</p><p>  UpdateData(true);</p><p>  dd=eval_exp(sz);</p><p>  m_edit3=dd;</p><p>  if(errorNum==0)// errorNum有4個(gè)值,分別用以判斷出錯(cuò)信息和正確消息</p><p><b>

91、;  {</b></p><p>  MessageBox("輸入語(yǔ)法錯(cuò)誤");</p><p><b>  }</b></p><p>  else if(errorNum==1)</p><p>  { MessageBox("輸入括號(hào)不匹配"

92、;)</p><p><b>  }</b></p><p>  else if(errorNum==2)</p><p><b>  {</b></p><p>  MessageBox("表達(dá)式不存在");</p><p><b>  }&l

93、t;/b></p><p>  else if(errorNum==3)//假如errorNum為3則判斷其表達(dá)式的長(zhǎng)度</p><p><b>  {</b></p><p>  for(j=0;j<length-1;j++)</p><p><b>  { </b></p&

94、gt;<p>  int getatq=s.GetAt(j); </p><p>  int getath=s.GetAt(j+1);</p><p>  if((getatq=='1')&&(getath=='0'))</p><p><b>  {</b></p>

95、<p>  s.SetAt(j,'a');</p><p>  s.Delete(j+1,1);</p><p>  length=s.GetLength();</p><p><b>  }</b></p><p>  if((getatq=='1')&&(ge

96、tath=='1'))</p><p><b>  {</b></p><p>  s.SetAt(j,'b');</p><p>  s.Delete(j+1,1);</p><p>  length=s.GetLength();</p><p><b>

97、;  }</b></p><p>  if((getatq=='1')&&(getath=='2'))</p><p><b>  {</b></p><p>  s.SetAt(j,'c');</p><p>  s.Delete(j+1,1)

98、;</p><p>  length=s.GetLength();</p><p><b>  }</b></p><p>  if((getatq=='1')&&(getath=='3'))</p><p><b>  {</b></p>

99、<p>  s.SetAt(j,'d');</p><p>  s.Delete(j+1,1);</p><p>  length=s.GetLength();</p><p><b>  }</b></p><p><b>  }</b></p><

100、;p>  for(i=1;i<14;i++)//循環(huán)語(yǔ)句判斷輸入值和牌面給定的牌是否匹配</p><p><b>  {</b></p><p>  temp=0;start=0;</p><p>  while(temp!=(-1))</p><p><b>  {</b></p

101、><p>  temp=s.Find(d[i],start);</p><p>  start=temp+1;</p><p>  f(temp!=(-1))</p><p><b>  {</b></p><p><b>  a[i]++;</b></p><

102、;p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=1;i<14;i++)</p><p><b>  {</b></p><p>

103、;  if(c[i]==m_iNum[0])</p><p><b>  {</b></p><p><b>  a[i]--;</b></p><p><b>  }</b></p><p>  if(c[i]==m_iNum[1])</p><p>

104、<b>  {</b></p><p><b>  a[i]--;</b></p><p><b>  }</b></p><p>  if(c[i]==m_iNum[2])</p><p><b>  {</b></p><p>

105、<b>  a[i]--;</b></p><p><b>  }</b></p><p>  if(c[i]==m_iNum[3])</p><p><b>  {</b></p><p><b>  a[i]--;</b></p><

106、;p><b>  }</b></p><p><b>  }</b></p><p>  total=abs(a[1])+abs(a[2])+abs(a[3])+abs(a[4])+abs(a[5])+abs(a[6]) </p><p>  +abs(a[7])+abs(a[8])+abs(a[9])+abs(a[

107、10])+abs(a[11])+abs(a[12])+abs(a[13]);</p><p>  if(total!=0) //利用total變量實(shí)現(xiàn)了數(shù)字匹配問(wèn)題,假如total為0則匹配正確 否則錯(cuò)誤</p><p>  MessageBox("請(qǐng)注意輸入數(shù)值是否正確");</p><p><b>  }</b><

108、/p><p><b>  else{</b></p><p>  if(dd==24)</p><p>  MessageBox("計(jì)算正確");</p><p>  m_edit3=dd;</p><p>  UpdateData(FALSE);</p><p

109、><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  MessageBox("計(jì)算錯(cuò)誤,請(qǐng)重新輸入");</p><p><b>  }</b><

110、;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  1.6.4 24點(diǎn)游戲紙牌發(fā)牌算法(不重復(fù))</p><p>  void CWorkView::RandomSele

111、ct() //初始化牌面文件的路徑,初始化牌面的數(shù)值,花色</p><p><b>  {</b></p><p>  int tempdate[4]; </p><p>  double number[4];</p><p><b>  int i,j;</b></p><p&

112、gt;  char realdate[4][80];</p><p>  char temppath[80];</p><p>  char pathname[52][80]={"res\\a1.bmp","res\\a2.bmp","res\\a3.bmp","res\\a4.bmp",</p>

113、<p>  "res\\a5.bmp","res\\a6.bmp","res\\a7.bmp","res\\a8.bmp",</p><p>  "res\\a9.bmp","res\\a10.bmp","res\\a11.bmp","res\\a12.

114、bmp",</p><p>  "res\\a13.bmp","res\\b1.bmp","res\\b2.bmp","res\\b3.bmp",</p><p>  "res\\b4.bmp","res\\b5.bmp","res\\b6.bmp&q

115、uot;,"res\\b7.bmp",</p><p>  "res\\b8.bmp","res\\b9.bmp","res\\b10.bmp","res\\b11.bmp",</p><p>  "res\\b12.bmp","res\\b13.bmp&quo

116、t;,"res\\c1.bmp","res\\c2.bmp",</p><p>  "res\\c3.bmp","res\\c4.bmp","res\\c5.bmp","res\\c6.bmp",</p><p>  "res\\c7.bmp",&qu

117、ot;res\\c8.bmp","res\\c9.bmp","res\\c10.bmp",</p><p>  "res\\c11.bmp","res\\c12.bmp","res\\c13.bmp","res\\d1.bmp",</p><p>  "

118、;res\\d2.bmp","res\\d3.bmp","res\\d4.bmp","res\\d5.bmp",</p><p>  "res\\d6.bmp","res\\d7.bmp","res\\d8.bmp","res\\d9.bmp",</p>

119、<p>  "res\\d10.bmp","res\\d11.bmp","res\\d12.bmp","res\\d13.bmp"</p><p>  };//將52紙牌文件路徑按順序依次存放于數(shù)組中</p><p>  for(i=0;i<4;i++)</p><p&g

120、t;  {tempdate[i] =(int)((double)rand()/RAND_MAX*52.0);//隨即函數(shù)得到0到51之間的數(shù)字</p><p>  for(j=0;j<i;j++)</p><p>  { while(tempdate[i]==tempdate[j])</p><p><b>  {</b></p&g

121、t;<p>  //tempdate[i] =(int)((double)rand()/RAND_MAX*52.0);</p><p>  if(tempdate[i]==51)</p><p><b>  {</b></p><p>  tempdate[i]=0;</p><p><b>  

122、}</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  tempdate[i]++;</p><p><b>  }</b></p><p><b>  }</b&

123、gt;</p><p><b>  }</b></p><p>  if(tempdate[i]<13)//判斷牌的花色為方塊</p><p><b>  {</b></p><p>  m_iNum[i]=tempdate[i]+1;//得到其數(shù)值大小</p><p>

124、;<b>  }</b></p><p>  else if(tempdate[i]<26)//判斷牌的花色為黑桃</p><p><b>  {</b></p><p>  m_iNum[i]=tempdate[i]-12; //得到其數(shù)值大小</p><p><b>  }<

125、;/b></p><p>  else if(tempdate[i]<39)//判斷牌的花色為紅桃</p><p>  m_iNum[i]=tempdate[i]-25; //得到其數(shù)值大小</p><p><b>  }</b></p><p><b>  else</b></p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論