C語言+EasyX庫:漢諾塔移動動畫

2021-01-14 C語言函數與案例

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

遊戲裡有三根金剛石柱子,在一根柱子上從下往上按大小順序摞著7片黃金圓盤。玩家需要做的是把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

#include <graphics.h>#include <conio.h>#include <stdio.h>#define MAX 64        #define NULL 0

struct STKNODE{ int a[4];};
struct STK{ STKNODE* stack[MAX]; int top;};

STK s[3]; int v = 5;


void Initstk(STK* s); void Hannoi(int n, char a, char b, char c); void start(); void Move(int n, char a, char b); int switchab(char a); void adjust();


int main(){ int n, ta[4] = { 115, 500, 285, 518 }; printf("儘量小於16\n"); printf("請輸入漢諾塔的層數(1~64):"); scanf_s("%d", &n); STKNODE** p; p = (STKNODE**)malloc(n * sizeof(STKNODE**)); for (int i2 = 0; i2 < n; i2++) { p[i2] = (STKNODE*)malloc(sizeof(STKNODE)); } Initstk(&s[0]); Initstk(&s[1]); Initstk(&s[2]); start(); setfillcolor(GREEN); for (int i = 0; i < n; i++) { ta[0] += 5; ta[1] -= 20; ta[2] -= 5; ta[3] -= 20; solidrectangle(ta[0], ta[1], ta[2], ta[3]); ++s[0].top; for (int i1 = 0; i1 < 4; i1++) { p[i]->a[i1] = ta[i1]; s[0].stack[s[0].top] = p[i]; } } Hannoi(n, 'a', 'b', 'c'); system("pause"); printf("\t\t\t\tGame Over!\n");}



void Hannoi(int n, char a, char b, char c){ if (n == 1) Move(1, a, c); else { Hannoi(n - 1, a, c, b); Move(n, a, c); Hannoi(n - 1, b, a, c); }}
void Initstk(STK* s){ int i; s->top = 0; for (i = 0; i <= MAX; i++) s->stack[++s->top] = NULL; s->top = 0;}
void Move(int n, char a, char b){ int i3, i4 = 0, i5 = 0; i3 = b - a; i4 = switchab(a); i5 = switchab(b); STKNODE* q1, * q0; q1 = (STKNODE*)malloc(sizeof(STKNODE)); q0 = (STKNODE*)malloc(sizeof(STKNODE));
q0 = s[i4].stack[s[i4].top]; ++s[i5].top; q1->a[0] = q0->a[0] + i3 * 200; q1->a[1] = 500 - s[i5].top * 20; q1->a[2] = q0->a[2] + i3 * 200; q1->a[3] = 500 - s[i5].top * 20 + 18; s[i5].stack[s[i5].top] = q1; --s[i4].top;
while (q0->a[1] >= 100) { setfillcolor(GREEN); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); adjust(); Sleep(10 * v); setfillcolor(WHITE); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); setlinecolor(RED); line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); q0->a[1] -= 10; q0->a[3] -= 10; }
while (q0->a[2] != q1->a[2]) { setfillcolor(GREEN); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); adjust(); Sleep(10 * v); setfillcolor(WHITE); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); if (i3 < 0) { q0->a[0] -= 20; q0->a[2] -= 20; } else { q0->a[0] += 20; q0->a[2] += 20; } }
while (q0->a[3] <= q1->a[3]) { setfillcolor(GREEN); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); adjust(); Sleep(10 * v); setfillcolor(WHITE); solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]); setlinecolor(RED); if (q0->a[1] > 100) { line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); } q0->a[1] += 10; q0->a[3] += 10; }
setfillcolor(GREEN); solidrectangle(q1->a[0], q1->a[1], q1->a[2], q1->a[3]);}
void start(){
initgraph(800, 650);
setbkcolor(WHITE);
cleardevice();
float H, S, L; H = 0; S = 1; L = 0.5f; setlinestyle(PS_SOLID, 2); for (int r = 600; r > 544; r--) { H += 5; setlinecolor(HSLtoRGB(H, S, L)); circle(750, 900, r); }
settextstyle(50, 0, "華文楷體"); settextcolor(RED); outtextxy(200, 150, "漢諾塔移動動畫"); settextstyle(20, 0, "黑體"); outtextxy(600, 200, "BY:enter"); outtextxy(500, 200, "版本V1.1"); settextstyle(50, 0, "黑體"); settextcolor(GREEN); outtextxy(200, 350, "隨便按一個鍵開始吧!");
_getch();
cleardevice();
setlinecolor(RED);
line(400, 110, 400, 500); line(600, 110, 600, 500); line(200, 110, 200, 500);
setfillcolor(LIGHTGRAY); fillrectangle(80, 501, 720, 510);
solidrectangle(360, 540, 440, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(370, 550, "暫停"); settextstyle(20, 0, "宋體"); settextcolor(RED); outtextxy(300, 580, "滑鼠暫停後請按空格繼續");
solidrectangle(160, 540, 240, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(170, 550, "加速"); settextstyle(20, 0, "宋體"); settextcolor(RED); outtextxy(170, 580, "請按 d");
solidrectangle(560, 540, 640, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(570, 550, "減速"); settextstyle(20, 0, "宋體"); settextcolor(RED); outtextxy(570, 580, "請按 a");
settextstyle(50, 0, "宋體"); settextcolor(GREEN); outtextxy(10, 10, "正在進行中請欣賞:");}
int switchab(char a){ switch (a) { case 'a': return 0; case 'b': return 1; case 'c': return 2; default: return 0; }}
void adjust(){ char f;
if (_kbhit()) f = _getch();
if (MouseHit() == true) {
MOUSEMSG Mouse; Mouse = GetMouseMsg();
if (Mouse.x >= 360 && Mouse.x <= 440 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) { f = ' '; } if (Mouse.x >= 160 && Mouse.x <= 240 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) { f = 'd'; } if (Mouse.x >= 560 && Mouse.x <= 640 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) { f = 'a'; } }
switch (f) {
case ' ':
settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(370, 550, "繼續"); _getch();
settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(370, 550, "暫停"); break;
case 'a':
setfillcolor(LIGHTGRAY); solidrectangle(560, 540, 640, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(575, 545, "減速"); Sleep(30);
v++;
setfillcolor(LIGHTGRAY); solidrectangle(560, 540, 640, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(570, 550, "減速"); break;
case 'd': setfillcolor(LIGHTGRAY); solidrectangle(160, 540, 240, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(165, 545, "加速"); Sleep(30); setfillcolor(LIGHTGRAY); solidrectangle(160, 540, 240, 580); settextstyle(30, 0, "黑體"); settextcolor(GREEN); outtextxy(170, 550, "加速");
v--;
if (v <= 0) { v = 1; } break;
default: break; }
f = 'r'; FlushMouseMsgBuffer(); }

相關焦點

  • 畢業生求職必會算法 漢諾塔
    漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。二、漢諾塔移動過程漢諾塔動畫: 演示圓盤移動過程(此動圖來源於網絡)下面分三種情況分別演示每個盤子的移動過程(n 代表圓盤數量):1個圓盤的情況:
  • 一起玩轉漢諾塔
    並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。後來,這個傳說就演變為漢諾塔遊戲,玩法如下:1.有三根杆子A,B,C。回到前面漢諾塔的問題上來。我們假設函數func(n, a, b, c)用於將n個圓盤由a移動到c,b作為輔助柱子。那麼我們可以這樣實現這個遞歸過程:func:if n!
  • 漢諾塔的神秘步伐
    快問快答:漢諾塔什麼形狀?
  • 64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法
    漢諾塔是一個非常經典的數學模型,它有一個古老的傳說。相傳印度主神大梵天在創造世界的同時,也造了三根金剛石柱子。其中一根柱子上放著64個大小均不相同的圓盤。大梵天命令婆羅門將這64個圓盤按照從大到小的順序移動到另一根柱子上,在移動的過程中始終要保持大盤在下,小盤子在上。
  • 簡單又常見的算法題:漢諾塔
    關於漢諾塔的傳說漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
  • 啟迪智慧的漢諾塔遊戲
    1883年法國的數學家 Edouard Lucas(愛德華·盧卡斯) 提出漢諾塔問題。這個小小的遊戲裡邊包含著巨大的數學智慧,塔遊戲中蘊藏著豐富的數學思想方法:包括分類討論的思想與方法、最優化選擇的方法、數學歸納的方法、數學遞歸的思想等,因此 ,玩好漢諾塔遊戲不僅可以從中獲得快樂 ,還能夠學到許多數學知識 。
  • C語言編程實例講解
    C語言三個數從小到大排序/輸出C語言猴子吃桃問題C語言百錢買百雞(百錢百雞,百雞問題)C語言漁夫打魚曬網問題C語言希爾排序算法C語言冒泡排序算法C語言直接插入排序算法C語言快速排序算法C語言選擇排序算法C語言歸併排序算法C語言二分查找算法,折半查找算法C語言分塊查找算法,索引順序查找算法C語言求
  • Linux下C編程基礎之:本章小結與思考與練習
    3.8 本章小結本章是Linux中進行C語言編程的基礎,首先講解了C語言編程的關鍵點,這裡關鍵要了解編輯器、編譯連結器、調試器及項目管理工具等概念。
  • 數學奧秘——漢諾塔的秘密
    今天帶來了一個有趣的數學思維遊戲——漢諾塔遊戲。相傳神創造了3根杆子,就有了這個遊戲,分別是起始杆、過渡杆和目標杆,起始杆上擺放著大小不同的圓盤。其中起始杆上擺放一個圓盤表示第一關,擺放兩個圓盤表示第二關,擺放三個圓盤表示第三關,依次類推。
  • 漢諾塔——我其實還在第一層
    漢諾塔問題描述假設有3個分別命名為A,B,C的塔座,在塔座A上插有n個直徑大小各不相同,依小從大編號為1,2,........,n的圓盤。現要求將塔座A上的n個圓盤移至塔座C上,並仍按同樣的順序疊排,圓盤移動時必須遵守下列規則:每次只能移動一個圓盤;圓盤可以插在A,B和C中的任一塔座上;任何時候都不能將一個較大的圓盤壓在較小圓盤上;三個圓盤移動方法
  • 荒野日記漢諾塔怎麼玩
    本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟,這裡就給大家講解一下,卡關的玩家可以看一下,希望能夠幫助到各位玩家~下面就一起來看看吧! 本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟
  • C語言怎麼樣?今天聊聊C語言的發展史!
    此版本還看到了C語言的開始,該語言用於編寫一些命令。 此處的代碼僅是某些命令,某些庫函數和C編譯器的原始碼。c /中的文件來自 last1120c.tar.gz 磁帶,並構成了第二版Unix的有效C編譯器。
  • 漢諾塔遊戲:遞歸經典問題
    漢諾塔遊戲,是非常著名的智力趣味題,在很多算法書籍和智力競賽中都有涉及。
  • 強迫症玩家的最愛 書本漢諾塔讓一切歸於有序
    漢諾塔是一種非常古老的益智遊戲,小編在很小的時候就接觸過這種遊戲,對這類遊戲雖談不上喜歡,但卻有著很深刻的印象,今天小編就為大家帶來就是一款名為書本漢諾塔的休閒益智遊戲,遊戲好不好,大家看過評測就知道了。
  • 關於漢諾塔的步驟
    畫之前,我們先了解一個有趣的問題~如何理解漢諾塔到底幾個步驟的問題?看看熱心知友的回覆漢諾塔永遠只有三步:ok,進入教程。準備工具:尺子,鉛筆,剪刀。先來看效果圖:▼第一步:我們用尺子劃分好由小到大的格子。
  • 最全的C語言基礎知識都在這了
    我們用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,加深小夥伴們對C語言的認識。2、main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
  • C語言程序設計試題及答案
    A) 必須在最開始 B) 必須在系統調用的庫函數的後面C) 可以任意 D) 必須在最後3、下列符號串中符合C語言語法的標識符是( )。A) 'a'&&'b' B) a<=b C) a||b+c&&b-c D) !((a<b)&&!c||1)14、設有數組定義:char array[]=「student」;則數組所佔的存貯空間為( )。
  • 深入理解C語言
    導讀:Dennis Ritchie過世了,他發明了C語言,一個影響深遠並徹底改變世界的計算機語言。一門經歷40多年的到今天還長盛不訓的語言,今天很多語言都受到C的影響,C++,Java,C#,Perl,PHP,Javascript等等。但是,你對C了解嗎?相信你看過本站的《C語言的謎題》還有《誰說C語言很簡單?》。
  • 漢諾塔拓展項目
    漢諾塔拓展項目項目簡介:這是一個考驗集體智慧的項目,根據要求,學員需在規定時間內將漢諾塔從A區移到C區。這個項目能訓練團隊合作解決問題的能力;讓學員學會用不用的角度思考問題;診斷學員的個性特徵;提升團隊間的溝通能力。
  • C語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    在C語言程序開發中,一些比較成熟的庫函數常常會被使用。畢竟,如果手邊就有不錯的「輪子」可以用,沒有程式設計師願意再花費精力憑空造一個輪子出來。,不過不知道讀者注意到沒,有些庫函數的參數是 void * 類型的,例如:void *memcpy(void *dest, constvoid *src, size_t n);void *memmove(void *dest, constvoid *src, size_t n);前面的章節在討論C語言指針時,提到指針從某種程度上來說,