在學習C語言的時候我們都會先從簡單的漢諾塔游戲開始,那么你知道C語言如何實現漢諾塔游戲嗎?別著急,下面武林小編就帶大家一起去了解關于實現漢諾塔游戲的內容。
操作就是:A B 號碼A的塔頂一層放在號碼B的塔頂。如1(空格) 3 回車。 話說有人能把我這C的代碼添加到QT界面框架上去么?? 代碼寫的不好 ,維護性不夠,只能玩8層的,寫完以后發現很難拓展,軟件工程,設計模式有待提高....
里面提示輸入等級的裝B用了,沒有實現,大家隨便輸入個個位數就可以玩了。
stackfunc.c
#include"STACK.h"#include<stdio.h>extern ceng CENG[SIZE];//數據入棧void push_stack(stack*p,int number){ p->arr[p->head]=number; p->head++;} //初始化棧1void init_stack1(stack*p){ p->head=0; push_stack(p,1); push_stack(p,2); push_stack(p,3); push_stack(p,4); push_stack(p,5); push_stack(p,6); push_stack(p,7); push_stack(p,8);}//初始化棧2 3void init_stack2_3(stack* p1,stack* p2){ p1->head=0; p1->arr[p1->head]=0; p2->head=0; p2->arr[p2->head]=0;}//彈出棧頂元素int pop_stack(stack* p){ p->head--; return p->arr[p->head];}//訪問棧頂元素int top_stack(stack* p){ return p->arr[p->head-1];}//比較兩個棧頂元素的大小int sizecmp_stack(stack* p1,stack* p2){ if(p1->arr[p1->head-1]>p2->arr[p2->head-1]) return 1; else if(p1->arr[p1->head-1]<p2->arr[p2->head-1]) return -1; else return 0;} //測出棧的高度int high_stack(stack* p){ return p->head;} //是否為空棧int empty_stack(stack* p){ return p->head==0;} //是否棧滿int full_stack(stack* p){ return p->head==SIZE;} //初始化層1void init_ceng1(ceng* p){ p->number=1; p->row=SIZE-1; p->col=0;} //初始化層2void init_ceng2(ceng* p){ p->number=2; p->row=SIZE-2; p->col=0;} //初始化層3void init_ceng3(ceng* p){ p->number=3; p->row=SIZE-3; p->col=0;} //初始化層4void init_ceng4(ceng* p){ p->number=4; p->row=SIZE-4; p->col=0;}//初始化層5void init_ceng5(ceng*p){ p->number=5; p->row=SIZE-5; p->col=0;}//初始化層6void init_ceng6(ceng*p){ p->number=6; p->row=SIZE-6; p->col=0; }//初始化層7void init_ceng7(ceng*p){ p->number=7; p->row=SIZE-7; p->col=0;}//初始化層8void init_ceng8(ceng*p){ p->number=8; p->row=SIZE-8; p->col=0;}//移動層void move_ceng(int level,int *nrow,int *ncol,stack*p1,stack* p2,stack* p3,int stdec){ stack* arr[3]; arr[0]=p1; arr[1]=p2; arr[2]=p3; *nrow=level-1-high_stack(arr[stdec]); *ncol=stdec;} //顯示圖片void show_map(void){ int i,j; for(i=0;i<SIZE;i++) { for(j=0;j<3;j++) { if(CENG[0].row==i&&CENG[0].col==j) { printf(" | 1 | "); }else if(CENG[1].row==i&&CENG[1].col==j) { printf(" | 2 | "); }else if(CENG[2].row==i&&CENG[2].col==j) { printf(" | 3 | "); }else if(CENG[3].row==i&&CENG[3].col==j) { printf(" | 4 | "); }else if(CENG[4].row==i&&CENG[4].col==j) { printf(" | 5 | "); }else if(CENG[5].row==i&&CENG[5].col==j) { printf(" | 6 | "); }else if(CENG[6].row==i&&CENG[6].col==j){ printf(" | 7 | "); }else if(CENG[7].row==i&&CENG[7].col==j){ printf(" |8| "); }else printf(" "); } printf("/n"); } printf("=====================================================================/n");}
main.c
#include"STACK.h"#include<stdio.h> ceng CENG[SIZE];int main(){ int res=1,dec=1; char con; int newrow; int newcol; int step=0; int level=0; while(1){ if (level==0) { do{ printf("請輸入游戲等級:/n"); scanf("%d",&level); if(level<=0||level>8) printf("等級范圍錯誤,重新輸入/n"); }while(level<=0||level>8); } level=8; newrow=0,newcol=0; stack STACK[3]; //初始化3個棧 init_stack1(&STACK[0]); init_stack2_3(&STACK[1],&STACK[2]); //初始化8個層 init_ceng1(&CENG[0]); init_ceng2(&CENG[1]); init_ceng3(&CENG[2]); init_ceng4(&CENG[3]); init_ceng5(&CENG[4]); init_ceng6(&CENG[5]); init_ceng7(&CENG[6]); init_ceng8(&CENG[7]);while(1){ //打印畫面 switch(level){ case 1:show_map();break; case 2:show_map();break; case 3:show_map();break; case 4:show_map();break; case 5:show_map();break; case 6:show_map();break; case 7:show_map();break; case 8:show_map();break; }while(1) { // printf("游戲等級為:%d/n",level);// printf("源棧最高層是%d ....../n",top_stack(&STACK[res])); printf(" 一號的高度%d ",STACK[0].head); printf(" 二號的高度%d ",STACK[1].head); printf(" 三號的高度%d/n",STACK[2].head); printf("/n已經走的步數為 %d /n",step); //選擇源 目標 scanf("%d",&res); scanf("%d",&dec); res--; dec-- ; if(!(res>=0&&res<3&&dec>=0&&dec<3))/*||(empty_stack(&STACK[res]))*/ { printf("/n/n輸入范圍超出/n"); }else if(empty_stack(&STACK[res])==1) { printf("%d/n",STACK[0].head); printf("/n/n源棧空/n"); } else if(sizecmp_stack(&STACK[res],&STACK[dec])<0) { printf("/n/n大塊的不能放在小塊的上面/n"); }else { if(dec!=res){ printf("/n/n/n正在移動層塊..../n"); step++; move_ceng(level,&newrow,&newcol,&STACK[0],&STACK[1],&STACK[2],dec); CENG[top_stack(&STACK[res])-1].row=newrow; CENG[top_stack(&STACK[res])-1].col=newcol; push_stack(&STACK[dec],pop_stack(&STACK[res])); break; }else { printf("/n/n/n放輕松/n"); }break; } show_map(); } if (full_stack(STACK+1)==1||full_stack(STACK+2)==1) { printf("完成了漢諾塔!/n"); level++; break; }} show_map(); printf("是否繼續游戲?繼續請輸入y,否則按其它鍵/n"); scanf("%*[^/n]"); scanf("%*c"); scanf("%c",&con); if(con!='y') break;} return 0;}
STACK.h
#ifndef __STACK_H__#define __STACK_H__#define SIZE 8typedef struct STACK{ int head; int arr[SIZE];}stack; typedef struct CENG{ int number; int row; int col;}ceng; extern ceng CENG[SIZE]; //入棧void push_stack(stack*,int);//初始化棧1void init_stack1(stack*);//初始化棧2和3void init_stack2_3(stack*,stack*);//出棧int pop_stack(stack*);//訪問棧頂元素int top_stack(stack*);//比較棧頂元素大小 -1 1int sizecmp_stack(stack*,stack*);//判斷棧的高度int high_stack(stack*);//判斷棧是否為空1 0int empty_stack(stack*);//判斷棧是否滿1 0int full_stack(stack*); //初始化層1void init_ceng1(ceng*);//初始化層2void init_ceng2(ceng*);//初始化層3void init_ceng3(ceng*);//初始化層4void init_ceng4(ceng*);//初始化層5void init_ceng5(ceng*);//初始化層6void init_ceng6(ceng*);//初始化層7void init_ceng7(ceng*);//初始化層8void init_ceng8(ceng*);//移動層塊void move_ceng(int ,int * a,int *b,stack*,stack*,stack*,int k );//打印畫面void show_map();#endif
演示圖片
看完后你知道C語言如何實現漢諾塔游戲了嗎?上文中小編為大家介紹了相信的實現方法,希望能夠對大家學習C語言的遞歸算法有所幫助
新聞熱點
疑難解答
圖片精選