1. 程式人生 > >漢諾塔演示程式(MFC)

漢諾塔演示程式(MFC)

首先展示一下程式演示效果:

漢諾塔動態演示

一、程式功能:

1、可演示盤數為2-7時,移動步驟

2、點選spin按鈕可增或減盤子的個數,也可在編輯框內輸入數字,數字必須在3-7之間

3、可連續移動盤子,也可在中間暫停,對應的按鈕為“開始演示”和“暫停”

4、可單步演示盤子的移動,對應的按鈕為“上一步”與“下一步”

二、基本思路:

傳統的漢諾塔程式採用的是遞迴程式,但這並不便於進行單步操作。我這採用棧方式來實現,將中間結果存下來,以便下一步操作,然後上一步的功能是通過vector陣列,存下已進行的操作。然後主要利用的SetTimer和KillTimer來實現演示,加快及減慢則是通過修改Timer的執行時間間隔。

三、區域性功能實現

1、繪畫背景圖

void CMyDlg::ShowBg(CDC * dc)

void CMyDlg::ShowBg(CDC * dc){

	//顯示背景
	CDC pdc, ddc;
	pdc.CreateCompatibleDC(dc); // 建立一個臨時顯示裝置
	ddc.CreateCompatibleDC(dc); // 建立一個載入盤子的臨時顯示裝置

	CBitmap bmp, * obmp;
	bmp.LoadBitmap(IDB_BG); // 載入背景圖片

	obmp = pdc.SelectObject(&bmp); // 將圖片顯示在裝置pdc上。

	//顯示盤子
	int n[] = {0, 0, 0}; // 用於存放每個柱子已顯示多少盤子
	for(int i = 0; i < number ; i++){
		CBitmap dbmp, * odbmp;
		dbmp.LoadBitmap(IDB_B7 - i); // 載入從大到小第i個盤子圖片
		odbmp = ddc.SelectObject(&dbmp); // 將盤子顯示在裝置ddc上。
		pdc.BitBlt(10 + 150*dish[i], 225 - n[dish[i]]*20, 140, 15, &ddc, 0, 0, SRCCOPY); // 將ddc拷貝到臨時顯示裝置pdc對應位置上
		n[dish[i]] ++;
		ddc.SelectObject(odbmp); // 顯示完畢,還原裝置
	}

	dc->BitBlt(10, 10, 460, 260, &pdc, 0, 0, SRCCOPY); // 將pdc拷貝到程式顯示裝置dc上
	pdc.SelectObject(obmp); // 顯示完畢,還原裝置
}
2、下一步功能實現

void CMyDlg::OnBnClickedNextButton()

void CMyDlg::OnBnClickedNextButton()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	flag1 = true;
	if (0 == number) {
		MessageBox("請選擇盤子數!");
		return;
	}
	if (!flag)
	{
		CMyDlg::OnButton1();
	}
	else if (idx < int(res.size() - 1))
	{
		++idx;
		dish[res[idx].num] = res[idx].end;
		Invalidate(FALSE);//重繪
	}
	else
		SetTimer(1015, last, NULL);
}

3、上一步功能實現
void CMyDlg::OnBnClickedPrevButton()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	flag1 = true;
	//char str[10];
	//sprintf(str, "%d\n", idx);
	//MessageBox(str);
	if (idx >= 0)
	{
		dish[res[idx].num] = res[idx].beg;
		--idx;
		Invalidate(FALSE);//重繪
	}
}
4、加快,減慢功能實現
//加快
void CMyDlg::OnBnClickedButton3()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	if (last > 100)
	{
		last -= 100;
		UpdateData(FALSE);
		KillTimer(1015);
		SetTimer(1015, last, NULL);
	}
}

//減慢
void CMyDlg::OnBnClickedButton4()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	CString str;
	
	if (last < 800)
	{
		CString str;
		last += 100;
		UpdateData(FALSE);
		KillTimer(1015);
		SetTimer(1015, last, NULL);
	}
}
具體實現見程式

四、參考工程

本人程式碼是參考網上修改的,感覺實現上應該還有有待提高的地方,各位可根據需求進行修改,工程環境是VS2015 + MFC。工程已上傳

相關推薦

演示程式MFC

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

的故事C語言——遞歸

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

1.0普通次數版

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

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

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

路徑列印遞迴

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

java菜鳥---------用java寫的問題程式

漢諾塔是遞迴裡最經典的題。 漢諾塔問題:大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。 這個

c語言實現程式執行步驟詳解

很久沒去接觸c語言了,今天翻了翻c語言的書,偶然間看到了大一時讓我鬱悶了很久的漢諾塔問題,又重新推理了一遍,漢諾塔的實現採用遞迴演算法,涉及到資料結構中的棧的知識。下面是c實現漢諾塔的原始碼。程式只是實現了文字資訊,即用文字描述了圓盤的移動過程,並未真正實現圓盤的移動,該程式

程式設計師的數學》:問題Hanoi問題的遞迴演算法與非遞迴演算法總結

從被呼叫函式返回呼叫函式前,系統也應完成3件事: ①儲存被呼叫函式的結果; ②釋放被呼叫函式的資料區; ③依照被呼叫函式儲存的返回地址將控制轉移到呼叫函式。 當有多個函式構成巢狀呼叫時,按照“後呼叫先返回”的原則(LIFO),上述函式之間的資訊傳遞和控制轉移必須通過“棧”來實現,即系統將整個程式執行時所需的

Hanoijava實現程式

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

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

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

河內問題:

漢諾塔 medium 問題 http int logs 一行 移動 else     漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小

nyoj 1078 [二分圖 || 規律 || 暴力 || 貪心]

二分圖 二分圖匹配 int 處理 names 特殊 mes while 最小路徑覆蓋 題目:nyoj 1078 漢諾塔(四) 分析:做這個題目的時候是在圖論的題目裏面看到的。到時讀了題目推了一下,發現好像有點規律。試了一下果然過了。 後來看了一下數據,才50。那

++ 但是 logs 大片 scanf pan 兩種 初始 入棧 漢諾塔(三) 描述 在印度,有這麽一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片

HDU 1207 II 遞推

return main 世界 個數 也會 來源 esp 一次 移動 經典的漢諾塔問題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令

習題3.10 的非遞歸實現25 分浙大版《數據結構第2版》題目集

-i pro 數據結構 但是 int 遞歸實現 記錄 表達 names 借助堆棧以非遞歸(循環)方式求解漢諾塔的問題(n, a, b, c),即將N個盤子從起始柱(標記為“a”)通過借助柱(標記為“b”)移動到目標柱(

遞歸計算組合數、判斷回文字符串、問題

文字 bigint 是否 rar blog rgs port 所有 相等 一.使用組合數公式利用n!來計算 1.設計思想 先輸入整數n和k,分別用計算n!的遞歸的方法算出n!,k!和(n-k)!的結果,再計算n!/(k!(n-k)!!。用大數類BigInte

遞推遞歸組合數,,回文數問題java

char n-1 判斷 resource int swa one ise tex 遞推遞歸組合數: 1 思路:用函數求得n!,調用函數計算結果流程圖 2 .1流程圖 3 .1源代碼: import java.util.Scanner; public class

課後作業——遞歸組合數、、回文

bigint 遞歸函數 指定 lang ole 作業1 eof 2-2 image 課後作業1 使用組合數公式利用n!來計算 一、 程序設計思想 定義n,k,輸入並檢測輸入的值是否是整數,如果n>k,調用計算階乘的函數,計算並輸出結果。階乘計算函數使用遞歸的思想,並使

用遞歸方法解決問題Recursion Hanoi Tower Python

else tro 如果 strong noi ron 最小 傳說 大小 漢諾塔問題源於印度的一個古老傳說:梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。梵天命令婆羅門把圓盤按大小順序重新擺放在另一根柱子上,並且規定小圓盤上不能放大