紙牌游戲 課程設(shè)計報告_第1頁
紙牌游戲 課程設(shè)計報告_第2頁
紙牌游戲 課程設(shè)計報告_第3頁
紙牌游戲 課程設(shè)計報告_第4頁
紙牌游戲 課程設(shè)計報告_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

紙牌游戲——課程設(shè)計報告摘要:有編號為1-52張牌,現(xiàn)以2-52為基數(shù),當(dāng)遇到他們的倍數(shù)時進(jìn)行翻牌,最后打印出結(jié)果。關(guān)鍵字:翻牌數(shù)組結(jié)構(gòu)體一、設(shè)計的問題及功能描述(1)任務(wù)定義編號為1—52張牌,正面向上,從第2張開始,以2為基數(shù),是2的倍數(shù)的牌翻一次,直到最后一張牌;然后,從第3張開始,以3為基數(shù),是3的倍數(shù)的牌翻一次,直到最后一張牌;直到以52為基數(shù)的翻過,輸出:這時輸出正面向上的牌有哪些?(2)問題分析1)基本問題分析該設(shè)計是一個查找和修改的過程。以下是根據(jù)問題程序中需要實現(xiàn)的一些功能:首先,根據(jù)題意,牌是一個具體的事物,在數(shù)據(jù)結(jié)構(gòu)中沒有專門描述撲克牌的現(xiàn)成的變量,這就要求在設(shè)計的時候,尋找一個合適的描述,對牌這個變量進(jìn)行人為的定義。接著,是對52張牌從以2為基數(shù),按倍數(shù)翻牌,一直到以52為基數(shù),按倍數(shù)翻牌。那么,如何實現(xiàn)以2為基數(shù)按倍翻完后又開始以3為基數(shù),直至以52為基數(shù)呢?這就需要定義一個可以遞增的變量,來指示該以哪個數(shù)字為基數(shù)。還有一個要解決的問題是如何按倍數(shù)翻牌?以2為例子,我們知道,需翻的是第2,4,6……2n(2n<=52)可以看出,每次下一個要翻的牌都是上一個要翻的牌加上2。同理可推,以k為基數(shù)的話,每次下一個要翻的牌都是上一個要翻的牌加上k(2<=k<=52)。最后,題目要求輸出正面向上的牌。這里引發(fā)了一個問題,如何判斷哪些為牌面向上的牌?可以用一個變量以不同的值來表示牌的正面和反面,至于具體如何實現(xiàn),是程序里要考慮的問題。2)問題的延伸問題一:在問題分析中,分析的是該設(shè)計的基本功能。而該設(shè)計既然是一個關(guān)于紙牌的游戲,那么,人機交互的友好界面是必不可少的。問題二:在該設(shè)計中,最基本的是將牌序為1—52是順序牌序按2—52的倍數(shù)翻牌,而這些可能在程序中有已經(jīng)是事先定義好的,用戶并沒有參與進(jìn)去,也就不能稱之為游戲。假設(shè)我們將這個有序的牌,經(jīng)過洗牌以后形成新的序列,那么,就要求設(shè)計一個算法,讓本來有序的牌面打亂成無序的,然后再進(jìn)行翻面的過程。重要的是,洗牌的程度由用戶來參與。在設(shè)計中設(shè)計難度級別,分別是1.初級2.中級3.高級。牌序被打亂的程度由玩家選擇的級別來決定。問題三:雖然洗牌是用戶來參與的,但做為游戲,還缺少一點趣味性。為了解決這個問題,我采用玩家競猜的方式。具體的來說就是,在洗過牌后,讓玩家從鍵盤輸入一個牌面值,如果在進(jìn)行翻面以后,如果玩家輸入的那張牌是正面向上的,則輸出猜對的提示,反之,如果輸入的那張牌是背面向上的,則輸出“再接再厲”的字樣。問題四:既然是游戲,那么游戲幫助是必不可少的。二、設(shè)計的問題設(shè)計思想、方法及方案當(dāng)然,為了更好的實現(xiàn)該設(shè)計的最終結(jié)果,也就是程序,這里有必要對設(shè)計思路有條理地整理出來。以下僅僅是每個子模塊應(yīng)該實現(xiàn)的功能,而具體的算法在實際的程序中再做介紹,下面是設(shè)想的步驟:第一步,定義撲克牌的數(shù)據(jù)結(jié)構(gòu)。要求可以存儲牌的面值和表示該牌是正面向上還是背面向上。并且定義一個長度為52的該數(shù)據(jù)結(jié)構(gòu)數(shù)組,用來表示52張這樣的牌。typedefstruct//定義一個結(jié)構(gòu)體{intid;//用來存儲紙牌的面值intflag;//表示紙牌哪面向上,奇數(shù)代表反面,偶數(shù)代表正面}p;pa[52];第二步,主程序。其功能是一開始輸出一個菜單,讓玩家做出選擇“1.測試該游戲,2.開始游戲3.游戲幫助。4.退出游戲”玩家從鍵盤輸入做出選擇后,分別調(diào)用相應(yīng)的4個子程序。第三步,對玩家的選擇進(jìn)行接收的子程序。當(dāng)玩家輸入1,2,3或者4是時候,該程序可以將玩家的選擇反饋給主程序。如果玩家輸入的是這三個數(shù)字之外,則反饋0給主程序。第四步,對紙牌的初始化的子程序。初始的要求是每張牌按從1到52順序排列,并且每張牌初始時,都要求正面向上。第五步,對游戲進(jìn)行測試的子程序。按設(shè)計的要求,對初始化后的牌進(jìn)行翻面并顯示所有正面向上的牌。第六步,洗牌子程序。通過玩家輸入的隨機數(shù)和難度級別,對52張牌進(jìn)行不同程度的洗牌,即打亂牌的順序。然后將打亂次序后的牌的排列順序在屏幕上顯示出來。第七步,開始游戲子程序。首先列出菜單“1.初級2.中級3.高級”。讓玩家選擇輸入,然后讓玩家輸入一個隨即的數(shù)字,調(diào)用洗牌的子程序,根據(jù)玩家的這兩個輸入對牌進(jìn)行不同程度的打亂。接著讓玩家輸入1-52中任意牌,調(diào)用玩家競猜子程序,判斷玩家猜的這張牌是否正面向上。第八步,玩家競猜子程序。如果玩家輸入的那張牌是正面向上的,則輸出猜對的提示,反之,如果輸入的那張牌是背面向上的,則輸出“再接再厲”的字樣。第九步,對牌面進(jìn)行翻轉(zhuǎn)的子程序。從第2張開始,以2為基數(shù),是2的倍數(shù)的牌翻一次,直到最后一張牌;然后,從第3張開始,以3為基數(shù),是3的倍數(shù)的牌翻一次,直到最68后一張牌;直到以52為基數(shù)的翻過,輸出:這時輸出正面向上的牌。第十步,游戲幫助子程序。以文字的方式的輸出向玩家介紹支紙牌游戲的具體玩法。第十一步,判斷子程序。其功能是要實現(xiàn)每次調(diào)用菜單選擇子程序和執(zhí)行完玩家要求的操作后,重新輸出主菜單,讓玩家選擇新的操作。直到玩家選擇4.退出游戲時,整個程序結(jié)束。第十二步,游戲結(jié)束子程序。以文字的方式在屏幕上輸出游戲結(jié)束的提示字。三.詳細(xì)設(shè)計和編碼開始開始I++J<=52A[I].flag++;j=j+I+1I<=52?IntI=1,jI++J<=52A[I].flag++;j=j+I+1I<=52?IntI=1,jnyy nyyA[A[I].flag%2==0?ny輸出a[輸出a[I].id結(jié)束結(jié)束(1)撲克牌數(shù)據(jù)結(jié)構(gòu)的定義typedefstruct//定義一個結(jié)構(gòu)體{intid;//用來存儲紙牌的面值intflag;//表示紙牌哪面向上,奇數(shù)代表反面,偶數(shù)代表正面}p;pa[52];在這里,id用來存儲的是紙牌的面值,即1—52中的一個數(shù)字,flag相當(dāng)于一個標(biāo)志位,設(shè)想是初始時均賦值為0。主程序的編寫voidmain(){ printf("歡迎來到紙牌游戲的世界\n"); printf("***************************************************************\n"); judge();//判斷k值,并做相應(yīng)操作的子函數(shù)}這里,主程序看起來非常簡單,主要的功能是先在屏幕上顯示歡迎詞,以建立良好的界面。然后再調(diào)用子程序judge().該子程序的功能和設(shè)計思路將在下面講到,在這里就不做贅述了。對玩家的選擇進(jìn)行接收的子程序choose()intchoose()//菜單選擇函數(shù){ intk; scanf("%d",&k);//從鍵盤輸入數(shù)字 if(k==1||k==2||k==3||k==4)//如果是1,2,3或者4 returnk;//按原輸入返回 else return0;//否則,其他的輸入均返回0}該算法實現(xiàn)的功能是:首先定義一個整型變量k,然后讓用戶從鍵盤輸入一個字符存入k中。接著的判斷語句,實現(xiàn)的是過濾的功能,即如果輸入的不是1,2,3或者4,均屬于非正確的輸入,這時返回值為0,反之,就返回輸入的字符。對紙牌的初始化的子程序init()voidinit()//紙牌的初始化子程序{inti;printf("下面是52張牌的初始順序:\n");for(i=0;i<52;i++)//對52張牌依次賦初始值 { a[i].id=i+1; a[i].flag=0;//初始時,使每個牌面均向上 printf("%d",a[i].id);//在屏幕上顯示初始后的牌面值 } printf("\n");}這個部分是對52張牌的初始化。利用一個for語句分別給52張牌順序賦上1-52的數(shù)字。同時,每張牌的標(biāo)志位flag均初始為0(0為偶數(shù))。并將牌面依次在屏幕上顯示出來。對游戲進(jìn)行測試的子程序test()voidtest()//測試游戲的子程序{printf("\n開始測試該游戲\n");printf("***************************************************************\n"); init();//初始化 result(1);//進(jìn)行翻牌后的結(jié)果}調(diào)用init()是先進(jìn)行初始化,調(diào)用result(1)是對初始的牌進(jìn)行初級難度(1代表初級難度)并在屏幕上顯示最終所有正面向上的牌。洗牌子程序wash(intk,intm)voidwash(intk,intm)//洗牌子程序{inti,j,f;pb;for(f=0;f<m;f++)for(j=0;j<k;j++)//牌序?qū)φ{(diào)的次數(shù)for(i=0;i+k<52;i++){b.id=a[i].id;a[i].id=a[i+k].id;a[i+k].id=b.id;//將第i張牌和第i+k張牌對調(diào)位置}}這是一個打亂牌序的算法,主要是利用若干張牌的位置的對調(diào)實現(xiàn)的,最內(nèi)層循環(huán)是從第1張開始將(張牌的位置)和(玩家輸入的隨即數(shù)+這張牌的位置)對調(diào).一直到(玩家輸入的隨即數(shù)+這張牌的位置)超過52,即越界為止.第二曾循環(huán)是執(zhí)行(玩家輸入的隨即數(shù))次最內(nèi)層循環(huán).最外層循環(huán)執(zhí)行的次數(shù)是根據(jù)玩家選擇的難度決定的,難度越高,執(zhí)行第二層循環(huán)的次數(shù)就越多,牌序被打亂的程度越大.同時,這也是增加游戲難度的方法.開始游戲子程序game()voidgame()//開始游戲的子程序{intk,i,m,n;printf("\n開始游戲\n");printf("***************************************************************\n"); init();//對牌進(jìn)行初始化printf("\n以下是游戲的設(shè)置:\n");printf("1.初級\n");printf("2.中級\n");printf("3.高級\n");printf("\n請您選擇游戲的難度級別:");scanf("%d",&m);//選擇輸入難度級別printf("請您輸入一個隨即數(shù),以洗牌(推薦1-25):");scanf("%d",&k);//用戶輸入數(shù)字以洗牌wash(k,m);//調(diào)用洗牌子程序printf("\n請輸入1-52中任意數(shù)字,試試您的運氣:");scanf("%d",&n);//玩家輸入猜測為正面的牌面值printf("\n下面是52張牌洗牌后的順序:\n"); for(i=0;i<52;i++) printf("%d",a[i].id);//輸出洗牌后的牌序 result(m); //輸出面向上的牌 cmp(n);//調(diào)用玩家競猜子程序}玩家選擇開始游戲時執(zhí)行的程序.先調(diào)用初始化子程序init(),然后顯示難度級別菜單,讓玩家選擇難度。接著,要玩家從鍵盤輸入一個隨即數(shù)用來洗牌。這時調(diào)用洗牌子程序wash(k,m),這里的k和m分別是玩家輸入的隨即數(shù)和難度級別,讓wash()根據(jù)這兩個數(shù)字對牌進(jìn)行不同程度的打亂。接著,是一個讓玩家輸入猜牌值的輸入語句。調(diào)用result()是對新的牌序進(jìn)行翻牌,然后在屏幕顯示正面向上的牌。最后調(diào)用cmp()是用來判斷玩家是否猜對,至于程序cmp()的具體描述,可見下文。玩家競猜子程序cmp(intn)voidcmp(intn)//玩家競猜子程序{inti;for(i=0;i<52;i++){ if(n==a[i].id)break;}if(a[i].flag%2==0)//如果玩家輸入的牌是正面的 { printf("*****************"); printf("\n*恭喜您猜對了*\n"); printf("*****************\n");//輸出猜對提示}else{printf("******************************************");printf("\n*真遺憾,您猜的牌是背面向上,請再接再厲~!*\n");printf("******************************************\n");//反之,輸出錯誤提示}}根據(jù)玩家輸入的猜牌,判斷該牌經(jīng)過翻面后是否是正面向上。在程序中使用一個for循環(huán),將n(即玩家輸入的猜牌)從第1張牌依次比較,直到相等的時候退出循環(huán)。這個時候,控制循環(huán)的變量i即是牌n在52張牌中的位置。這時判斷該牌的標(biāo)志flag是否是偶數(shù),如果是,表示正面向上,在屏幕輸出猜對的提示,反之,如果是奇數(shù),則在屏幕輸入猜錯提示。對牌面進(jìn)行翻轉(zhuǎn)的子程序result(intn)voidresult(intn)//對牌面進(jìn)行翻轉(zhuǎn)的子程序{ inti,j; for(i=1;i<52;i++)//總的循環(huán)次數(shù)51次,從以為基數(shù)開始,到以52為基數(shù) for(j=i;j<52;j=j+i+1) a[j].flag++;//對牌面標(biāo)志位進(jìn)行改變奇偶性 printf("\n");printf("\n經(jīng)過翻轉(zhuǎn)后,正面向上的牌為:");for(i=0;i<52;i++) { if((a[i].flag%2)==0)//如果牌面標(biāo)志未為偶數(shù) printf("%d",a[i].id);//輸出該牌 } printf("\n");}對牌的翻轉(zhuǎn)的實現(xiàn)采用兩層for循環(huán),第層循環(huán)控制的基數(shù)2—52的遞增。第二層循環(huán)是以該基數(shù)為倍數(shù)的翻轉(zhuǎn)。每翻轉(zhuǎn)一張牌將該牌的flag+1,目的是通過改變flag的奇偶性,以便在以后的判斷程序中判斷該牌是否正面向上。接著是判斷語句,如果a[I].flag%2==0,那么代表第I張牌的flag是偶數(shù),即是正面向上,一個輸出語句輸出滿足這樣條件的牌。游戲幫助子程序help()voidhelp(){printf("\n游戲幫助\n");printf("***************************************************************\n"); printf("該游戲的翻面規(guī)則:編號為1—52張牌,正面向上,從第2張開始,以2為基數(shù),是2");printf("的倍數(shù)的牌翻一次,直到最后一張牌;然后,從第3張開始,以3為基數(shù),是3的");printf("倍數(shù)的牌翻一次,直到最后一張牌;直到以52為基數(shù)的翻過。\n");printf("做為玩家的你在游戲開始后,可以自由的選擇游戲的難度。在提示您輸入一個牌的面值后");printf(",如果您輸入的這張牌經(jīng)過翻牌后正面向上,那么恭喜您就猜對了,反之,就是猜錯了!\n");}這個子函數(shù)理解起來并不難,僅僅是用輸出語句將關(guān)于這個紙牌游戲的規(guī)則在屏幕上顯示給玩家。判斷子程序judge()voidjudge()//判斷k值,并做相應(yīng)操作的子函數(shù){ intk; menu(); //菜單顯示函數(shù) k=choose();//調(diào)用菜單選擇子函數(shù) if(k==0)//如果k的返回值為0 { printf("對不起,您的輸入不正確,請重新輸入:"); judge(); } if(k==1) { test();//如果輸入為1,調(diào)用開始測試子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 } if(k==2) { game();//如果輸入為2,調(diào)用開始游戲子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 }if(k==3) { help();//如果輸入為3,調(diào)用游戲幫助子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 } if(k==4) quit();//如果輸入為4,調(diào)用游戲結(jié)束子程序 }首先執(zhí)行菜單顯示函數(shù),將主菜單顯示在屏幕上,利用菜單選擇子程序用來接收玩家的選擇,賦給變量k,根據(jù)玩家對主菜單的選擇,調(diào)用不同的子程序。如果輸入為1,調(diào)用開始測試子程序;如果輸入為2,調(diào)用開始游戲子程序如果輸入為3,調(diào)用游戲幫助子程序;如果輸入為4,調(diào)用游戲結(jié)束子程序。并在前三個程序調(diào)用后,又遞歸調(diào)用jadge()程序,重新進(jìn)行下一輪的操作。但當(dāng)玩家選擇4.的時候,不再遞歸調(diào)用jadge().那是應(yīng)為這個時候選擇4代表玩家要求結(jié)束游戲,所以不需要繼續(xù)進(jìn)行下一輪的操作。 游戲結(jié)束子程序quit()voidquit(){ printf("\n******************************\n"); printf("*游戲結(jié)束,祝您有一個好心情!*"); printf("\n******************************\n");}該函數(shù)的功能是:在屏幕上顯示字幕,告知玩家,游戲已經(jīng)結(jié)束了。函數(shù)中僅僅是簡單用了幾個輸出的語句。四.測試結(jié)果玩家選擇測試游戲的測試結(jié)果2.玩家選擇開始游戲的測試結(jié)果3.玩家選擇游戲幫助的測試結(jié)果4.玩家選擇退出游戲的測試結(jié)果五、對所設(shè)計的軟件進(jìn)行自我評價這個軟件所運用了這學(xué)期所學(xué)的數(shù)據(jù)結(jié)構(gòu)編寫,由于要實現(xiàn)的功能比較簡單,所以就另外思考了外加功能,如互動、竟猜、幫助等。讓這個軟件的編寫方式不僅僅局限于常規(guī)的編程思想上。沒有未解決的問題。此軟件能夠正確運行并得到正確結(jié)果。創(chuàng)新點應(yīng)該在于擴大了軟件的功能。六.總結(jié)(1)調(diào)試過程中遇到的主要問題=1\*GB1⒈編譯語法錯誤及修改1.紙牌數(shù)組的值傳遞的問題。一開始在主程序main()中定義了紙牌數(shù)組,但是出現(xiàn)的問題是:常常在調(diào)用子程序的時候,不能對該數(shù)組做出修改。于是,我將它定義成了全局變量,這樣,它在整個程序中都是有生存期的。一來,解決了很多值不能傳遞的麻煩;二來,讓整個程序看起來更簡潔。2.函數(shù)jadge()的遞歸調(diào)用出現(xiàn)的問題。本來是將玩家對主菜單的選擇在主程序里接收,然后通過值傳遞給jadge()函數(shù)做相應(yīng)的處理。但是運行程序后發(fā)現(xiàn),如果用那種方法,同樣的k值會被執(zhí)行兩次后,才能夠讓玩家重新進(jìn)行選擇。思考后知道,那是因為每次遞歸調(diào)用要從頭開始,而這個時候上一個k值還未改變,于是又執(zhí)行了一次。我的改進(jìn)方法是:讓玩家對主菜單的選擇直接在jadge()里執(zhí)行,而不需要進(jìn)行值的傳遞。這樣就避免了遞歸調(diào)用的重復(fù)。=2\*GB1⒉對設(shè)計實現(xiàn)的回顧討論和分析=1\*GB3①算法的時、空性能分析和改進(jìn)設(shè)想時間復(fù)雜度:該設(shè)計的for語句比較多,原因是需要不斷地對52牌進(jìn)行操作。即使這樣,程序的時間復(fù)雜度并不高,因為總共才52張牌,而且翻面的次數(shù)是以倍數(shù)的不斷擴大決定的。因而時間復(fù)雜度不高為O(n),這里n為52。=2\*GB3②經(jīng)驗和體會通過該設(shè)計,我熟練掌握了如何定義一個結(jié)構(gòu)體數(shù)組,如何給它賦值,并且在賦值后如何修改。熟練掌握了函數(shù)之間的相互調(diào)用,遞歸函數(shù)的調(diào)用等。更重要的是熟悉了如何去設(shè)計一個簡單的游戲。作為一個游戲程序,不但要有算法,而且要有人機交互的界面,趣味性也是必不可少的。一個好的界面向?qū)Э梢允鼓愕挠螒蛟錾簧?。?dāng)然,要編寫一個大型的游戲程序,這些是遠(yuǎn)遠(yuǎn)不夠的,需要慢慢在實踐中積累經(jīng)驗。七.附錄:帶注釋的源程序#include<stdio.h>typedefstruct//定義一個結(jié)構(gòu)體{intid;//用來存儲紙牌的面值intflag;//表示紙牌哪面向上,奇數(shù)代表反面,偶數(shù)代表正面}p;pa[52];//定義一個結(jié)構(gòu)體數(shù)組,用來存儲52張牌voidmenu()//主菜單顯示函數(shù){printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");printf("\n1.測試該游戲\n");printf("2.開始游戲\n");printf("3.游戲幫助\n");printf("4.退出游戲\n");printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%";printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";printf("請選擇您要做的操作:"); }intchoose()//菜單選擇函數(shù){ intk; scanf("%d",&k);//從鍵盤輸入數(shù)字 if(k==1||k==2||k==3||k==4)//如果是1,2,3或者4 returnk;//按原輸入返回 else return0;//否則,其他的輸入均返回0}voidinit()//紙牌的初始化子程序{inti;printf("下面是52張牌的初始順序:\n");for(i=0;i<52;i++)//對52張牌依次賦初始值 { a[i].id=i+1; a[i].flag=0;//初始時,使每個牌面均向上 printf("%d",a[i].id);//在屏幕上顯示初始后的牌面值 } printf("\n");}voidresult(intn)//對牌面進(jìn)行翻轉(zhuǎn)的子程序{ inti,j; for(i=1;i<52;i++)//總的循環(huán)次數(shù)51次,從以為基數(shù)開始,到以52為基數(shù) for(j=i;j<52;j=j+i+1) a[j].flag++;//對牌面標(biāo)志位進(jìn)行改變奇偶性 printf("\n");printf("\n經(jīng)過翻轉(zhuǎn)后,正面向上的牌為:");for(i=0;i<52;i++) { if((a[i].flag%2)==0)//如果牌面標(biāo)志未為偶數(shù) printf("%d",a[i].id);//輸出該牌 } printf("\n");}voidtest()//測試游戲的子程序{printf("\n開始測試該游戲\n");printf("***************************************************************\n"); init();//初始化 result(1);//進(jìn)行翻牌后的結(jié)果}voidwash(intk,intm)//洗牌子程序{inti,j,f;pb;for(f=0;f<m;f++)for(j=0;j<k;j++)//牌序?qū)φ{(diào)的次數(shù)for(i=0;i+k<52;i++){b.id=a[i].id;a[i].id=a[i+k].id;a[i+k].id=b.id;//將第i張牌和第i+k張牌對調(diào)位置}}voidcmp(intn)//玩家競猜子程序{inti;for(i=0;i<52;i++){ if(n==a[i].id)break;}if(a[i].flag%2==0)//如果玩家輸入的牌是正面的 {printf("*****************"); printf("\n*恭喜您猜對了*\n"); printf("*****************\n");//輸出猜對提示}else{printf("******************************************");printf("\n*真遺憾,您猜的牌是背面向上,請再接再厲~!*\n");printf("******************************************\n");//反之,輸出錯誤提示}}voidgame()//開始游戲的子程序{intk,i,m,n;printf("\n開始游戲\n");printf("***************************************************************\n"); init();//對牌進(jìn)行初始化printf("\n以下是游戲的設(shè)置:\n");printf("1.初級\n");printf("2.中級\n");printf("3.高級\n");printf("\n請您選擇游戲的難度級別:");scanf("%d",&m);//選擇輸入難度級別printf("請您輸入一個隨即數(shù),以洗牌(推薦1-25):");scanf("%d",&k);//用戶輸入數(shù)字以洗牌wash(k,m);//調(diào)用洗牌子程序printf("\n請輸入1-52中任意數(shù)字,試試您的運氣:");scanf("%d",&n);//玩家輸入猜測為正面的牌面值printf("\n下面是52張牌洗牌后的順序:\n"); for(i=0;i<52;i++) printf("%d",a[i].id);//輸出洗牌后的牌序 result(m); //輸出面向上的牌 cmp(n);//調(diào)用玩家競猜子程序}voidhelp(){printf("\n游戲幫助\n");printf("***************************************************************\n"); printf("該游戲的翻面規(guī)則:編號為1—52張牌,正面向上,從第2張開始,以2為基數(shù),是2");printf("的倍數(shù)的牌翻一次,直到最后一張牌;然后,從第3張開始,以3為基數(shù),是3的");printf("倍數(shù)的牌翻一次,直到最后一張牌;直到以52為基數(shù)的翻過。\n");printf("做為玩家的你在游戲開始后,可以自由的選擇游戲的難度。在提示您輸入一個牌的面值后");printf(",如果您輸入的這張牌經(jīng)過翻牌后正面向上,那么恭喜您就猜對了,反之,就是猜錯了!\n");}voidquit(){ printf("\n******************************\n"); printf("*游戲結(jié)束,祝您有一個好心情!*"); printf("\n******************************\n");}voidjudge()//判斷k值,并做相應(yīng)操作的子函數(shù){ intk; menu(); //菜單顯示函數(shù) k=choose();//調(diào)用菜單選擇子函數(shù) if(k==0)//如果k的返回值為0 {printf("對不起,您的輸入不正確,請重新輸入:"); judge(); } if(k==1) { test();//如果輸入為1,調(diào)用開始測試子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 } if(k==2) { game();//如果輸入為2,調(diào)用開始游戲子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 }if(k==3) { help();//如果輸入為3,調(diào)用游戲幫助子程序 judge();//一輪操作完畢,進(jìn)行下一輪操作 } if(k==4) quit();//如果輸入為4,調(diào)用游戲結(jié)束子程序 }voidmain(){ printf("歡迎來到紙牌游戲的世界\n"); printf("***************************************************************\n"); judge();//判斷k值,并做相應(yīng)操作的子函數(shù)}八.參考文獻(xiàn)[1].徐孝凱,數(shù)據(jù)結(jié)構(gòu)實用教程。北京:清華大學(xué)出版社,2021年12月第1版。[2].嚴(yán)蔚敏等。數(shù)據(jù)結(jié)構(gòu)(c語言版)。北京:清華大學(xué)出版社,2021年4月第1版。[3].嚴(yán)蔚敏等。數(shù)據(jù)結(jié)構(gòu)題集(c語言)。北京:清華大學(xué)出版社,2021年2月第1版。[4].李春葆。數(shù)據(jù)結(jié)構(gòu)習(xí)題與解析(c語言)。北京:清華大學(xué)出版社,2021年1月第1版。[5].譚浩強,《c語言程序設(shè)計》清華大學(xué)出版社

引力波的實驗探測給我們的啟示摘要:引力理論的發(fā)展經(jīng)歷了數(shù)百年,從牛頓到愛因斯坦,從萬有引力定律到廣義相對論。在這過程中,科學(xué)家們引力波的預(yù)言質(zhì)疑不休、爭論不止。而引力波的實驗探測無疑證明了一切。引力波的發(fā)現(xiàn),彌補了愛因斯坦的廣義相對論的漏洞,也確定了他的理論的正確。這是人類史上出現(xiàn)的又一契機,它將為人類社會帶來重大變革?!捌莆濉笔侵袊鴤鹘y(tǒng)迎財神的日子。2016年的這一天,卻一個讓全世界物理學(xué)界沸騰的日子,甚至許多的物理學(xué)家為之痛哭流涕——被預(yù)言已經(jīng)百年的引力波,終于被探測到了。引力是什么?在今天人們所知道的物質(zhì)的四種基本相互作用中,引力作用為最弱。四種相互作用按作用強度比例順序是:強相互作用(1),電磁相互作用(10),弱相互作用(10),引力相互作用(10)。因此,在研究基本粒子的運動時,引力一般略去不計。但在天文學(xué)領(lǐng)域內(nèi),由于涉及的對象的質(zhì)量極其巨大,引力就成為不僅支配著天體的運動,而且往往是天體的結(jié)構(gòu)和演化的決定因素。引力并不是一種所謂的“力”,而是一種屬性。牛頓在1687年出版的《自然哲學(xué)的數(shù)學(xué)原理》一書中首次提出萬有引力定律,基于此,他結(jié)識了彗星的運動軌道和地球上的潮汐現(xiàn)象,并根據(jù)萬有引力定律成功地預(yù)言并發(fā)現(xiàn)了海王星。萬有引力定律出現(xiàn)后,才正式把研究天體的運動建立在力學(xué)理論的基礎(chǔ)上,從而創(chuàng)立了天體力學(xué)。簡單的說,質(zhì)量越大的東西產(chǎn)生的引力越大,地球的質(zhì)量產(chǎn)生的引力足夠把地球上的東西全部抓牢。1905年,愛因斯坦提出狹義相對論,突破了絕對時間和絕對空間的概念,否定了瞬時超距作用,從根本上動搖了建立在這些舊觀念基礎(chǔ)上的牛頓引力理論。經(jīng)過十年的探索后,愛因斯坦于1915年提出了迄今為止最成功的近代引力理論——廣義相對論。廣義相對論中,引力被歸咎于時空的彎曲。這種彎曲是由物質(zhì)造成的,物質(zhì)的質(zhì)量越大,所形成的扭曲也就越嚴(yán)重。但是這種彎曲,對于人類來說根本感知不到,一是因為人類伴隨這種彎曲一起彎曲了,而是由于這種彎曲太微小。大質(zhì)量物體發(fā)生的扭曲引起了震動,而這種震動,就是引力波??茖W(xué)家們通過探測這種時空震蕩,來證實引力波的存在。早在1916年,愛因斯坦在廣義相對論中就預(yù)言了引力波的存在。而科學(xué)家們普遍認(rèn)為,這次LIGO這一發(fā)現(xiàn)是愛因斯坦相對論實驗驗證中最后一塊缺失的“拼圖”,證實了愛因斯坦廣義相對論的正確性,彌補了愛因斯坦的廣義相對論的漏洞,驗證了已故科學(xué)家愛因斯坦的預(yù)言。探測的儀器叫做邁克爾遜干涉儀,或是LIGO。LIGO的“兩條腿”都有4千米長,最近的一次升級就花去了幾十億美元。LIGO的原理是什么?簡單來說是利用光速不變,在同樣的直線路程里測試耗時,而通過時間的偏差(盡最大可能排除誤差,也是耗資巨大的原因)來判定空間確實存在震動。這樣的實驗設(shè)置基于愛因斯坦的假設(shè):光速不變,是因為以光的視角看,它沿途經(jīng)過的空間發(fā)生了折疊伸縮??赡艿囊Σㄌ綔y源包括致密雙星系統(tǒng)(白矮星,中子星和黑洞)。在2016年2月11日,LIGO科學(xué)合作組織和Virgo合作團(tuán)隊宣布他們已經(jīng)利用高級LIGO探測器,首次探測到了來自于雙黑洞合并的引力波信號。在過去的數(shù)十年里,許多物理學(xué)家和天文學(xué)家為證明引力波的存在進(jìn)行了大量研究。其中,泰勒和赫爾斯由于第一次得到引力波存在的間接證據(jù)榮獲1993年諾貝爾物理學(xué)獎。到目前為止,類似的雙中子星系統(tǒng)已經(jīng)發(fā)現(xiàn)了近十個,但是雙黑洞系統(tǒng)卻是首次。在實驗方面,第一個對直接探測引力波作偉大嘗試的人是韋伯。雖然他的共振棒探測器最后沒能找到引力波,但是韋伯開創(chuàng)了引力波實驗科學(xué)的先河,為如今的碩果打下了基礎(chǔ)。因為在地面上很容易受到干擾,所以物理學(xué)家們也在向太空進(jìn)軍。歐洲的空間引力波項目eLISA(演化激光干涉空間天線)。eLISA將由三個相同的探測器構(gòu)成為一個邊長為五百萬公里的等邊三角形,同樣使用激光干涉法來探測引力波。此項目已經(jīng)歐洲空間局通過批準(zhǔn),正式立項,目前處于設(shè)計階段,計劃于2034年發(fā)射運行。作為先導(dǎo)項目,兩顆測試衛(wèi)星已經(jīng)于2015年12月3日發(fā)射成功,目前正在調(diào)試之中。中國的科研人員,在積極參與目前的國際合作之外之外,也在籌建自己的引力波探測項目。引力波的實驗探測引起了世界范圍的轟動,這些探測極其不易,宇宙中發(fā)生爆炸性的大事件時產(chǎn)生的引力波,才相對容易探測到,例如黑洞合并、星系合并、超新星爆炸等。100年前,愛因斯坦在預(yù)言引力波存在時就曾說:“這些數(shù)值是如此微小,她們不會對任何的東西產(chǎn)生顯著的作用,沒人能夠去測量它們?!辈桃环蚪o出解釋:“時間發(fā)生得越早,距離越遠(yuǎn),越會在宇宙中傳播期間被紅移。紅移指的是由于宇宙本身的膨脹將所有的波動的波長拉直拉平,這樣其波動性就難以被探測到。例如,這次LIGO探測到的引力波,是13億年以前兩個大約30個太陽質(zhì)量的黑洞并合所產(chǎn)生的引力波,振幅之小,是在原子核尺寸的千分之一的尺度。能探測到真的是非常不容易,LIGO實驗組的科學(xué)家們也是在幾十年里經(jīng)歷多次挫折,不斷調(diào)整方案,改進(jìn)儀器,才最終探測到的。”所以它的成功探測也標(biāo)志著在這個領(lǐng)域人類的技術(shù)進(jìn)步到了前所未有的水平。而它所具有的里程碑意義不止在科學(xué)情感上,更在于能夠打開人類的一個新的世界——每個人都對它滿懷期待。如果電磁波探測是人類的眼睛,那么人類又多了一雙聆聽外界的耳朵。馬克斯·普朗克引力物理研究所說:“在《星際穿越》和《三體》中,都不約而同地將引力波選為了未來科技發(fā)達(dá)的人類的通訊手段,這也許只能是美好的幻想,但對于天文研究而言,引力波的確開啟了一扇新的窗口。吹進(jìn)來的第一縷清風(fēng),就帶來了一個重大的信息:極重的恒星級雙黑洞系統(tǒng)存在并可以在足夠短的時間(10億年)內(nèi)并合。這是讓我們始料未及的。誰能知道在將來的更多的探測中,LIGO和一眾引力波探測器能帶給我們什么樣的驚喜呢?”引力波有兩個非常重要而且比較獨特的性質(zhì)。第一:不需要任何的物質(zhì)存在于引力波源周圍。這時就不會有電磁輻射產(chǎn)生。第二:引力波能夠幾乎不受阻擋的穿過行進(jìn)途中的天體。比如,來自于遙遠(yuǎn)恒星的光會被星際介質(zhì)所遮擋,引力波能夠不受阻礙的穿過。對于天文學(xué)家來說,這兩個特征允許引力波攜帶有更多的之前從未被觀測過的天文現(xiàn)象信息,而每一個電磁波譜的打開,都會為我們帶來前所未有的發(fā)現(xiàn)。天文學(xué)家們同樣期望引力波也是如此。而引力波本身的性質(zhì)也可能對基礎(chǔ)物理學(xué)產(chǎn)生巨大的影響。另外,引力波蘊含的,很可能是宇宙誕生的畫面。我們從小都被告知一個最著名的猜想——宇宙是在一場爆炸中誕生的。這意味著,在時空的開始,宇宙又一次最為劇烈的震動。引力波就能讓我們還原這個震動——它是否存在?有多大規(guī)模?不僅如此,引力波還能傳遞信息——我們看不到的宇宙空間在發(fā)生什么?據(jù)科學(xué)家解釋,這次的引力波就是在遙遠(yuǎn)的距離上巨大的黑洞變化引起的。而這一結(jié)果也證明了黑洞真實存在——至少是廣義相對論預(yù)測的由純凈、真空、扭曲時空組成的完美圓形物體。并且,引力波傳遞的信息可以讓科學(xué)家更精確地估計宇宙膨脹的速度??偠灾?,一個新的重大科學(xué)發(fā)現(xiàn),總會給人類社會帶來無法預(yù)估的發(fā)展。18世紀(jì)面熟電磁波的麥克斯韋理論確認(rèn)的時候,也沒人知道會給人類帶來什么,但是現(xiàn)在不管是電視機還是移動電話,都與電磁現(xiàn)象有關(guān)。引力波的發(fā)現(xiàn)類似當(dāng)年的發(fā)現(xiàn)X光一樣,是一種工具。有了這個工具,我們可以利用引力波的觀察,去觀察遙遠(yuǎn)的宇宙的現(xiàn)象。發(fā)現(xiàn)暗物質(zhì)、時空穿梭等等才是有可能實現(xiàn)的事情。如果沒有引力波,以我們現(xiàn)有的技術(shù)是做不到這些科幻世界才有的事情的。“既然引力波是存在的,基于引力波的科研思路可信性就大大提高了。就好像走一條未知的路,走到半路,有人懷疑不對,結(jié)果證實是對的,那么就可以加快步伐了?!碧K萌說。世界各國都加大了探測研究引力波的力度,我國也緊跟探索引力波的步伐?!疤烨儆媱潯眳⑴c者、中山大學(xué)天文與空間科學(xué)研究院院長李淼教授介紹,“天琴計劃”是我國自主開展空間引力波探測的可行方案,發(fā)射三顆衛(wèi)星探測引力波,該計劃預(yù)期執(zhí)行期為2016~2035年,分四階段實施。項目還將挖山洞,建觀測站以及建設(shè)綜合研究大樓。預(yù)計擬投三億啟動。天琴計劃預(yù)期執(zhí)行期為2016-2035年,分四階段實施:(1)2016-2020年:完成月球/深空衛(wèi)星激光測距、空間等效原理檢驗實驗和下一代重力衛(wèi)星實驗所需關(guān)鍵技術(shù)研發(fā)。主要研發(fā)成果包括:新一代月球激光測距反射器、月球激光測距臺站、高精度加速度計、無拖曳控制(包含微推進(jìn)器)、高精度星載激光干涉儀、星間激光測距技術(shù)等;(2)2021-2025年:完成空間等效原理檢驗實驗和下一代重力衛(wèi)星實驗工程樣機,并成功發(fā)射下一代重力衛(wèi)星和空間等效原理實驗衛(wèi)星。主要研發(fā)成果包含:超靜衛(wèi)星平臺、高精度大型激光陀螺儀以及進(jìn)一步提高加速度計、無拖曳控制、高精度星載激光干涉儀、星間激光測距等技術(shù);(3)2026-2030年:完成空間引力波探測關(guān)鍵技術(shù),完成衛(wèi)星載荷工程樣機;(4)2031-2035年:進(jìn)行衛(wèi)星系統(tǒng)整機聯(lián)調(diào)測試、系統(tǒng)組裝,發(fā)射空間引力波探測衛(wèi)星。李淼介紹,“天琴計劃”的出發(fā)點是切實根據(jù)我國的技術(shù)能力實際和未來幾十年的發(fā)展前景,提出我國自主開展空間引力波探測的可行方案。在目前討論的初步概念中,天琴將采用三顆全同的衛(wèi)星構(gòu)成一個等邊三角形陣列,每顆衛(wèi)星內(nèi)部都包含一個或兩個極其小心懸浮起來的檢驗質(zhì)量。衛(wèi)星上將安裝推力可以精細(xì)調(diào)節(jié)的微牛級推進(jìn)器,實時調(diào)節(jié)衛(wèi)星的運動姿態(tài),使得檢驗質(zhì)量始終保持與周圍的保護(hù)容器互不接觸的狀態(tài)。這樣檢驗質(zhì)量將只在引力的作用下運動,而來自太陽風(fēng)或太陽光壓等細(xì)微的非引力擾動將被衛(wèi)星外殼屏蔽掉。高精度的激光干涉測距技術(shù)將被用來記錄由引力波引起的、不同衛(wèi)星上檢驗質(zhì)量之間的細(xì)微距離變化,從而獲得有關(guān)引力波的信息?!疤烨佟钡男l(wèi)星將在以地球為中心、高度約10萬公里的軌道上運行,針對確定的引力波源進(jìn)行探測。這樣的選擇能夠避免測到引力波信號卻無法確定引力波源的問題。中國科學(xué)院也于2016年2月16日公布了空間引力波探測與研究的“空間太極計劃”。按照這一計劃,我國將在2030年前后發(fā)射由位于等邊三角形頂端三顆衛(wèi)星組成的引力波探測星組,用激光干涉方法進(jìn)行中低頻波段引力波的直接探測。主要科學(xué)目標(biāo)是觀測雙黑洞并合和極大質(zhì)量比天體并合時產(chǎn)生的引力波輻射,以及其他的宇宙引力波輻射過程。中科院力學(xué)研究所胡文瑞院士表示,“我國目前的技術(shù)能力與國際先進(jìn)水平還有一定的差距,這種差距可以通過良好的國際合作得到一定的彌補?!焙娜鹫f,“空間太極計劃”是一個中歐合作的國際合作計劃,目前有兩個方案:方案一是參加歐洲空間局的eLISA雙邊合作計劃;方案二是發(fā)射一組中國的引力波探測衛(wèi)星組,與2035年左右發(fā)射的eLISA衛(wèi)星組同時遨游太空,進(jìn)行低頻引力波探測。據(jù)介紹,空間引力波探測被列入中科院制訂的空間2050年規(guī)劃。2008年由中科院發(fā)起,中科院多個研究所及院外高校科研單位共同參與。引力波的發(fā)現(xiàn)是感人至深的,它印證了一位物理學(xué)大師的睿智偉大,為年富力強的物理學(xué)家們增添了信心和安慰。在理性上,引力波的發(fā)現(xiàn)更是激動人心的,人類的歷史將會改寫,一切都是未知,未知也許會更加美好。參考文獻(xiàn):[1].柏格曼著,周奇、郝蘋譯:《相對論引論》,高等教育出版社,北京,1961。(P.G.Bergmann,IntroductiontotheTheoryofRelativity,Butterworths,London,1958.)[2].溫伯格著,鄒振隆譯:《引力和宇宙論》,科學(xué)出版社,北京,1979。(S.Weinberg,GravitationandCosmology,JohnWileyandSons,NewYork,1972.)[3].北京:科學(xué)出版社

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論