VB編寫益智游戲“漢諾塔”
汨羅網(wǎng)站建設公司創(chuàng)新互聯(lián)建站,汨羅網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為汨羅千余家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設公司要多少錢,請找那個售后服務好的汨羅做網(wǎng)站的公司定做!
海粟/文
《軟件報》2007年47期 61-74
【編程引子】
“漢諾塔”問題源自印度的一個古老傳說,對于它的算法比較常見的是應用遞歸調(diào)用。在本例中,筆者將給大家介紹一種更簡單和直觀的處理方法。
【編程分析】
漢諾塔游戲的主要目的是借助B區(qū)域,將A區(qū)域的五只盤子轉(zhuǎn)移到C區(qū)域中,要求每次移動必須從最上層盤子開始,而且必須始終保證小號盤子在大號盤子的上方。
程序的主要技術點,除了對上述要求的實現(xiàn)外,還要考慮到鼠標拖放盤子以及盤子的定位、排序等內(nèi)容。在設計初期,筆者首先考慮采用單擊選定,再次單擊定位的方式來移動盤子,但這樣做必須要讓程序記住誰是活動盤子,而且操作的直觀性較差。所以,最后筆者還是選擇了利用鼠標事件來模擬拖動盤子的動作。
而對于盤子移動后的定位問題,如果單純靠坐標計算來顯然,工作量是非常大的。所以,筆者在本例中應用了“一個蘿卜一個坑”的簡單原理,將目標位置提前放置好Image控件,這樣一來,盤子的移動和定位操作都成了對目標控件屬性的控制,處理起來變得十分方便。
【主要代碼】
1.程序初始化
程序初始化操作在窗體加載事件中完成,另外它與“重新開始”功能模塊的作用完全相同,所以可以通過調(diào)用的方式來共享代碼。代碼的主要功能是移動步驟清零、在A區(qū)域復位盤子,以及清除B和C兩區(qū)域盤子等,主要內(nèi)容如下:
Private Sub Command1_Click()
Label4.Caption = 0 ’移動步驟清零
For i = 0 To 4
Image1(i).Picture = LoadPicture(App.Path "\p" i ".jpg")
Image2(i).Picture = LoadPicture("")
Image3(i).Picture = LoadPicture("")
Next i
Call SortImg(Image1, 1080) ’對齊盤子
End Sub
其中子過程SortImg是對指定區(qū)域內(nèi)盤子進行居中對齊操作,后文中會有詳細介紹。
2.轉(zhuǎn)移盤子
該過程是整個程序的核心,需要考慮的事件包括從A區(qū)至B區(qū)和C區(qū)、從B區(qū)至A區(qū)和C區(qū)、從C區(qū)至A區(qū)和B區(qū)這樣共六種情況,為了簡化代碼編寫,筆者在程序中使用了控件數(shù)組。下面是從A區(qū)向其它兩區(qū)轉(zhuǎn)移盤子的代碼,其它幾種情況與之類似:
Private Sub Image1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Index 4 Then If Image1(Index + 1).Picture 0 Then Exit Sub ’移動操作不合法
If X = 2000 And X = 3200 Then
Call MoveImg(Image1, Image2, Index) ’從A向B轉(zhuǎn)移
Call SortImg(Image2, 3420) ’對齊盤子3420為區(qū)域中心線X值
End If
If X = 4300 And X = 5700 Then
Call MoveImg(Image1, Image3, Index) ’從A向C轉(zhuǎn)移
Call SortImg(Image3, 5760)
End If
End Sub
通過分析可知,如果用戶所選盤子的上方還有盤子,則不符合游戲規(guī)則,會被終止。另外,程序中使用了類似其它軟件中的“熱區(qū)域”的概念,即當拖動鼠標至我們規(guī)定的B區(qū)域中時,將引發(fā)真正的移動操作(即激活子過程MoveImg),其主要代碼如下:
Private Sub MoveImg(SImg As Object, DImg As Object, Idx As Integer)
For i = 0 To 4
If DImg(i).Picture = 0 Then ’當前區(qū)域有位置
If i 0 Then
If SImg(Idx).Width DImg(i - 1).Width Then ’符合上小下大游戲條件
DImg(i).Picture = SImg(Idx).Picture ’移動盤子
Exit For
Else
Exit Sub ’移動操作不合法則退出
End If
Else
DImg(i).Picture = SImg(Idx).Picture ’向區(qū)域最下方移動盤子
Exit For
End If
End If
Next i
If i = 4 Then
SImg(Idx).Picture = LoadPicture("")
Label4.Caption = Label4.Caption + 1 ’更新操作步數(shù)
End If
End Sub
在移動子過程中,判定位置是否為空的主要依據(jù)是目標Image控件的Picture屬性是否為0;當獲知位置可用時,再進一步判斷當前位置的下面位置盤子的尺寸是否大于當前盤子(即對游戲規(guī)則的判定),條件滿足的話就可以通過傳遞Picture屬性值來完成移動操作了;最后,還要將源位置盤子清空,并且記錄操作步數(shù)。
3.對齊盤子
在上述兩模塊中都涉及了子過程SortImg,其主要功能是對區(qū)域內(nèi)盤子進行居中對齊處理,這是美化程序執(zhí)行效果的一項重要措施,同時在該部分中還加入了游戲勝利過關的判斷(即每轉(zhuǎn)移一步判斷一次),主要代碼如下:
Private Sub SortImg(Img As Object, IntCenter As Integer)
For i = 0 To 4
Img(i).Left = IntCenter - Img(i).Width / 2
Next i
For i = 0 To 4
If Image1(i).Picture 0 Then Exit For
If Image2(i).Picture 0 Then Exit For
Next i
If i 4 Then MsgBox "恭喜:你成功了!", vbOKOnly + vbInformation, "勝利"
End Sub
【編程后記】
面對一些看似復雜的程序功能,仔細研究一下,總會有好的思路和方法閃現(xiàn)出來。本例實現(xiàn)了漢諾塔游戲的基本設計思路,大家還可以在盤子數(shù)量、步數(shù)排行榜等方面予以改進,以使該程序變得更加豐富、精彩!
以下是5個盤子的漢諾塔程序,用的是遞歸算法:
#includefstream
#includeiostream
using namespace std;
ofstream fout("Honnoi.txt");
int num=1;//記錄步數(shù)
void Move(int n,char x,char y)
{
foutnum":""把"n" 號盤,從"x"柱移到"y"號柱"endl;
coutnum":""把"n" 號盤,從"x"柱移到"y"號柱"endl;
++num;
}
void Hannoi(int n,char A,char C,char B)
{
if(n==1)
Move(1,A,C);
else
{
Hannoi(n-1,A,B,C);
Move(n,A,C);
Hannoi(n-1,B,C,A);
}
}
int main()
{
Hannoi(5,'A','C','B');
cout"輸出完畢!"endl;
cout"一共"num-1"步"endl;
return 0;
}
程序?qū)⑤敵霾綌?shù)、每步操作和總步數(shù)
給你個參考:
Private Sub hanoi(n As Integer, one As String, two As String, three As String)
If n = 1 Then
Print Tab(5); one; "-------"; three
Else
Call hanoi(n - 1, one, three, two)
Print Tab(5); one; "-------"; three
Call hanoi(n - 1, two, one, three)
End If
End Sub
Private Sub Form_Click()
Dim x As Integer
x = Val(InputBox("請輸入圓盤的個數(shù)"))
Print Tab(5); "將" x "個圓盤從A柱移到C柱的移動順序為"
Call hanoi(x, "A", "B", "C")
End Sub
標題名稱:漢諾塔vb.net 漢諾塔怎么玩
網(wǎng)站地址:http://muchs.cn/article14/hphoge.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、小程序開發(fā)、網(wǎng)站維護、手機網(wǎng)站建設、網(wǎng)站設計、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)