1. 程式人生 > >漢諾塔遊戲的設計(附程式碼)

漢諾塔遊戲的設計(附程式碼)

漢諾塔遊戲的設計

漢諾塔問題是最經典的遞迴問題,筆者就該問題設計了這個遊戲,由使用者互動遊戲和自動演示兩部分組成,支援撤銷功能、選關、自動完成等功能。

  首先建立了類CMap,該類主要實現使用者每一步的操作和畫圖顯示功能,記錄的時候只須記錄每組盤子的個數和盤子的矩形。程式碼和註釋如下:

//記錄每一步的盤子的情況
class CMap
{
public:
//每組盤子的個數int iCount[3];
//3組盤子裡面,每個盤子的位置,用矩形表示RECT *Rect[3];
//建構函式CMap()
{
//三組盤子,每組盤子的矩形for(int i=0;i<3;i++)
Rect[i]=new RECT[NUM];

//初始化每組盤子的個數iCount[0]=NUM;
iCount[1]=0;
iCount[2]=0;
//第一組盤子的矩形的位置for(i=0;i<NUM;i++)
{
Rect[0][i].left=Center[0]-(NUM-i)*Dx2;
Rect[0][i].right=Center[0]+(NUM-i)*Dx2;
Rect[0][i].bottom=(NUM+1-i)*Dx;
Rect[0][i].top=(NUM-i)*Dx;
}
//第二組盤子的矩形初始化為空for(i=0;i<NUM;i++)
{
Rect[1][i].left=0;
Rect[1][i].right=0;
Rect[1][i].bottom=0;
Rect[1][i].top=0;
}
//第三組盤子的矩形初始化為空for(i=0;i<NUM;i++)
{
Rect[2][i].left=0;
Rect[2][i].right=0;
Rect[2][i].bottom=0;
Rect[2][i].top=0;
}
}
//運算子過載CMap operator=(CMap Other)
{
//對新的CMap物件,應該重新分配記憶體for(int i=0;i<3;i++)
Rect[i]=new RECT[NUM];
//依次賦值for(i=0;i<3;i++)
{
iCount[i]=Other.iCount[i];
for(int j=0;j<NUM;j++)
Rect[i][j]=Other.Rect[i][j];
}
//返回return *(this);
}
//畫圖,顯示盤子的情況void OnDraw(HDC hdc)
{
//畫出每個盤子for(int i=0;i<3;i++)
for(int j=0;j<iCount[i];j++)
Rectangle(hdc,
Rect[i][j].left,
Rect[i][j].top,
Rect[i][j].right,
Rect[i][j].bottom);
}
//解構函式~CMap()
{
//記憶體的釋放for(int i=0;i<3;i++)
{
if(Rect[i]!=NULL)
{
Rect[i]=NULL;
delete Rect[i];
}
}
}
};
下面是漢諾塔的主類Hanio,該類的成員函式有OnDraw()Undo()Move()AutoMove()等,分別實現漢諾塔的畫圖顯示、撤銷、移動盤子、自動移動盤子等功能,程式碼及註釋如下:class Hanio
{
public:
//當前的步數int iStep;
//記錄每一步的盤子的情況CMap Record[MAXSTEP];
public:
//建構函式Hanio()
{
//初始化,步數為0
iStep=0;
//初始化記錄for(int i=0;i<MAXSTEP;i++)
{
Record[i]=CMap();
}
}
//畫圖,顯示漢諾塔的情況void OnDraw(HDC hdc)
{
Record[iStep].OnDraw(hdc);
}
//撤銷void Undo()
{
if(iStep>0)
iStep--;
//重繪Draw();
}
//移動盤子void Move(int iStart,int iEnd)
{
//得到當前盤子的記錄CMap Map=Record[iStep];
//移動的情況判斷,去除非法的移動if(iStart<0||iStart>=3)
return;
if(iEnd<0||iEnd>=3)
return;
if(iStart==iEnd)
return;
if(Map.iCount[iStart]<1)
return;
//得到移動前的開始組,結束組的盤子的個數int iStartRectNum=Map.iCount[iStart];
int iEndRectNum=Map.iCount[iEnd];
//從小盤子移動到大盤子上面的情況是不可以的。if(iEndRectNum>0)
if(Width(Map.Rect[iStart][iStartRectNum-1])>=Width(Map.Rect[iEnd][iEndRectNum-1]))

相關推薦

遊戲設計程式碼

漢諾塔遊戲的設計 漢諾塔問題是最經典的遞迴問題,筆者就該問題設計了這個遊戲,由使用者互動遊戲和自動演示兩部分組成,支援撤銷功能、選關、自動完成等功能。   首先建立了類CMap,該類主要實現使用者每一步的操作和畫圖顯示功能,記錄的時候只須記錄每組盤子的個數和盤子的矩形。程

路徑列印遞迴

漢諾塔 (http://baike.baidu.com/view/191666.htm) 的移動也可以看做是遞迴函式。 我們對柱子編號為a, b, c,將所有圓盤從a移到c可以描述為: 如果a只有一個圓盤,可以直接移動到c; 如果a有N個圓盤,可以看成a有1個圓盤(底盤) + (N-1)

遊戲規律,讓淪為體力勞動!解法Python原始碼

記住這個規律,以後玩漢諾塔基本上就是體力勞動了。 規律: 先小後大,單左雙右,迴圈。 設3個柱子分別是甲,乙,丙,把3根柱子看成一個迴圈,也就是說,甲的右邊是乙,乙的右邊是丙,而丙的右邊則回到甲,同理,甲的左邊就是丙。簡單點,記住丙的右邊是甲,和甲的左邊是丙就行了。

【20180927】【C/C++基礎知識】程式的模組化設計,拿球遊戲組合問題遊戲遞迴問題,報數遊戲斷點+記憶體除錯,遞迴與迭代

目錄 一、模組化設計思想和方法 模組化設計方法:自頂向下設計,自下向上程式設計實現的設計方法。 學生成績管理系統,若所有功能都在主函式中實現,程式的可讀性、可修改性都很差,因此我們每個功能分別用一個函式來實現,主函式方便快捷的呼叫這些函式即可(模組化)。

的故事C語言——遞歸

code log 圓盤 印度 return 16px move class baidu 漢諾塔:   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤

Unity實現遊戲

ges idt warn mage [0 lis lose gif bject 漢諾塔的規則: 有ABC三個柱子,A柱子上從小到大排列圓盤 要將A柱子上所有圓盤移動到C柱子上,每次只能移一個 圓盤放置必須從小到大,不能存在此盤子上面有比它大的存在。 比如三個漢諾塔玩法:

java智能四子棋人機大戰遊戲設計項目,以及原創PSD,設計文檔

給他 直接 發揮 假設 獲得 思路 -- 攔截 格子 本項目是使用java技術+自創“假設下子”算法開發的人機大戰四子棋遊戲客戶端。 具體項目,以及原創PSD,設計文檔,在文件末尾的百度雲連接。 一. 小組說明: 組名:CST 組長:陳飛良(C): 組員:

遞歸,遊戲

漢諾塔 pri bsp alt 技術 print def style spa def hanoi(n,a,b,c): if n==1: print(n,a+‘->‘+c) else: hanoi(n-1,a,c,b)

遞迴實現——Java程式碼

在遞迴中不斷重複以下步驟: 若要將N層從X轉移到Z,則需要將N-1層從X轉移到Y,再將第N層從X轉移到Z,最後將N-1層從Y轉移到Z;將N層從從X轉移到Y、Y轉移到Z、Y轉移到X、Z轉移到X、Z轉移到Y也類似。 返回條件:N == 1時,第N層直接轉移到Z。(

1.0普通次數版

好吧,作為資訊統練中的基礎題,在網上確實找不到,因此我找了一道需要高精度的題進行改編 漢諾塔 時空限制1000ms / 128MB 題目背景 直達通天路·小A歷險記第四篇 題目描述

001 遊戲

三個塔座A、B、C上各有一根針,通過B把64個盤子從A針移動到C針,移動時必須遵循下列規則: (1)圓盤可以插入在A、B或C塔座的針上; (2)每次只能移動一個圓盤; (3)任何時刻都不能將一個較大的圓盤壓在較小的圓盤之上。 def hanoi(a, b, c

第12周專案3--移動步驟遞迴函式

問題及程式碼: /* *Copyright (c)2014,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱:hannuota.cpp *作 者:單昕昕 *完成日期:2014年11月13日 *版 本 號:v1.0 *

HDU - 1995 奇妙的 遞迴思想詳解

用1,2,...,n表示n個盤子,稱為1號盤,2號盤,...。號數大盤子就大。經典的漢諾塔問  題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於  印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小 

遞迴----經典問題:遊戲

題目:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。這裡假設最開始放盤

C語言遊戲

【問題描述】 漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一

演示程式MFC

首先展示一下程式演示效果: 一、程式功能: 1、可演示盤數為2-7時,移動步驟 2、點選spin按鈕可增或減盤子的個數,也可在編輯框內輸入數字,數字必須在3-7之間 3、可連續移動盤子,也可在中間暫停,對應的按鈕為“開始演示”和“暫停” 4、可單步演示盤

演算法與資料結構複習——遞迴實現計算遊戲步驟

 漢諾塔遊戲  移動盤子將一定數量的盤子從第一個地方放到第三個地方,且大盤子不能放在小盤子上面,一次只能移動一次盤子   /** * */ package ch07; /** * @author lixin * @date 2018年7月23日 * @Des

深入理解python遞迴函式:遊戲

def hanota(n,zhu1,zhu2,zhu3):     if n==1:         print (zhu1+' --> '+zhu3)     else:        hanota(n-1, zhu1, zhu3, zhu2)         pr

遊戲簡單玩法

今天學習遞迴的時候,書上以一款名叫<漢諾塔>的解謎遊戲為例。雖然開始被那演算法搞蒙了,不過我倒是把這遊戲的玩法給解出來了,這裡分享一下. 遊戲簡介: 遊戲裡有三根金剛石柱子,左邊的柱子上從下往上按照大小順序摞著N片黃金圓盤。玩家需要做的是把圓盤從下面開始按