漢諾塔游戲設計過程_第1頁
漢諾塔游戲設計過程_第2頁
漢諾塔游戲設計過程_第3頁
漢諾塔游戲設計過程_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1/1漢諾塔游戲設計過程蘭州交通大學

數理與軟件工程學院

課程設計報告

2011~2012學年第二學期

課程名稱數據結構

設計題目漢諾塔游戲程序

班級信計1001班

小組成員張章、王欣、李貴生

報告者李貴生201005235

指導老師金靜

2012年6月

一、實驗目的:

通過此次C++實訓,一方面加深了對C++語言的了解,而不只是單單的在課本中學到的那些理論。通過學生動手親自編寫,平時乏味的課程,變的生動有趣。平時在課堂上學到的東西可以自己動手編寫,將其轉化成一些實用的技能。另一方面,通過學生小組完成任務,提高團隊意識,增加凝聚力,讓同學們意識到團結就是力量,每個人都是重要的一份子。

二、題目:漢諾塔游戲程序

問題描述:在平面上有三個位置A、B、C,在A位置上有n

個大小不等的圓盤、小盤壓在大盤上形成圓盤堆。要求將A位置的N個圓盤通過B位置移動到C位置上,并按同樣的順序疊放。

移動圓盤時必須遵循以下規(guī)則:

1.每一次只能移動一個圓盤

2.圓盤可以放在A、B、C任何一個塔座上

3.任何時刻都不能將大圓盤壓在小圓盤上

基本要求:

圓盤的個數從鍵盤輸入(如3-64等);用動畫的形式在屏幕上顯示盤的移動。

三、問題分析和任務定義

1、已知有三個塔(1、

2、3)和n個從大到小的金碟子,初始狀態(tài)時n個碟子按從大到小的次序從塔1的底部堆放至頂部。

2、要求把碟子都移動到塔2(按從大到小的次序從塔2的底部堆

放至頂部)。

3、每次移動一個碟子。

4、任何時候、任何一個塔上都不能把大碟子放到小碟子的上面。

5、可以借助塔3。

先考慮a桿下面的盤子而非桿上最上面的盤子,于是任務變成了:

1、將上面的N個盤子移到b桿上;

2、將a桿上剩下的盤子移到c桿上;

3、將b桿上的全部盤子移到c桿上。

將這個過程繼續(xù)下去,就是要先完成移動n個盤子、n-1個盤子、n-2個盤子1個盤的工作。

四、課題介紹:

4.1漢諾塔問題初始模型:

4.2實現步驟:

為滿足題目中盤子的移動問題,必須遵循的條件是:一次

僅能移動一個盤,且不允許大盤放在小盤的上面。

設要解決的漢諾塔共有N個圓盤,對A桿上的全部N個圓盤從小到大順序編號,最小的圓盤為1號,次之為2號,依次類

推,則最下面的圓盤的編號為N。

第一步:先將問題簡化。假設A桿上只有一個圓盤,即漢諾塔只有一層N,則只要將1號盤從A桿上移到B桿上即可。

第二步:對于一個有N(N>1)個圓盤的漢諾塔,將N個圓

盤分成兩部分:“上面的N-1個圓盤”看成一個整體,為了

解決N個圓盤的漢諾塔,可以按下面圖示的方式進行操作:(1)將A桿上面的N-1個盤子,借助B桿,移到C桿上;

圖4—1

(2)將A桿上剩余的N號盤子移到B桿上;

圖4—2

(3)將C桿上的N-1個盤子,借助A桿,移到B桿上。

圖4—3

五、流程圖

開始

初始化界面、視窗

游戲選擇界面

按鍵判斷

Enter鍵進入游戲

選擇盤子數目(2—10)

開始游戲

判斷游戲結果

Y

繼續(xù)

N退出

盤子數加1界面、按任意鍵退出

Esc鍵退出游戲

六、源程序代碼

#include

#include

#include

#include

structT

{

inth;//塔的高度

intx;//塔的第一個盤的x坐標,y坐標等于(7+n-塔的高度h)

intl;//塔的第一個盤的長度

}ta[3]={{10,15,2},{0,0,0},{0,0,0}};

charhnt[18][79]={

{""},{"漢諾塔動畫演示"},{""},{"╔════════════════════════════════════╗"},{"║║"},{"║║"},{"║║"},{"║▆║"},{"║▆▆║"},{"║▆▆▆║"},{"║▆▆▆▆║"},{"║▆▆▆▆▆║"},{"║▆▆▆▆▆▆║"},{"║▆▆▆▆▆▆▆║"},{"║▆▆▆▆▆▆▆▆║"},{"║▆▆▆▆▆▆▆▆▆║"},{"║▆▆▆▆▆▆▆▆▆▆║"},{"╚════════════════════════════════════╝"}};

intn;

intsum=0;

intcomputerorpeople=1;

intspeed=0;

voidcount_ta_1(intta_1)

{

inti;

intj;

intk=0;

for(i=7;i10):");

scanf("%d",

printf("請選擇:輸入由電腦自動控制;\n");

printf("輸入由人控制。\n");

printf("請輸入:");

scanf("%d",

if(computerorpeople!=1

if(computerorpeople==1)

{

printf("請輸入移動盤的速度(例如:輸入則代表秒):");

scanf("%d",

}

if(n10)

n=10;

ta[0].h=n;

system("cls");

for(i=0;i<7+n;i++)

printf("%s\n",hnt[i]);

printf("%s\n\n",hnt[17]);

system("pause");

hanoi(0,1,2,n);

if(computerorpeople==1)

system("pause");

}

七、調試過程

八、學習總結與心得

通過這次的課程設計,我深入了解了漢諾塔這一經典問題,掌握了兩種解決漢諾塔的方法。同時也更好的掌握了棧思想和函數的創(chuàng)建、調用等知識。也掌握了一些修改等程序的技巧,這對我以后的學習生涯有很大的幫助。通過這次的課程設計我深刻的認識到自己所學知識的匱乏,它讓我意識到自己的基礎很不扎實,需要用功復習,也提醒我

要利用大學的時光多充實自己。當然這次程序設計的并不是很完善,還有地方可以修改。在下次課程設計中我要努力完善自己的程序不會再出現這一次的不足。

通過漢諾塔問題的C++課程設計,加強了我們動手、思考和解決問題的能力。在整個設計過程中,經常會遇到這樣那樣的情況,就是心里想這樣的方法可以行得通,但實際運行時,總實現不了,因此耗費在這上面的時間用去很多。我們做課程設計同時也是對課本知識的鞏固和加強,由于課本上的知識太多,平時課間的學習并不能很好的

溫馨提示

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

評論

0/150

提交評論