C语言实现汉诺塔游戏
更新时间:2015年03月30日 11:01:37 投稿:hebedich
个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。今天重新来实现一下
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
操作就是:A B 号码A的塔顶一层放在号码B的塔顶。如1(空格) 3 回车。 话说有人能把我这C的代码添加到QT界面框架上去么? 代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高....
里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了。
stackfunc.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void push_stack(stack*p, int number){ p->arr[p->head]=number; p->head++; } //初始化栈1 void 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 3 void 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; } //初始化层1 void init_ceng1(ceng* p){ p->number=1; p->row=SIZE-1; p->col=0; } //初始化层2 void init_ceng2(ceng* p){ p->number=2; p->row=SIZE-2; p->col=0; } //初始化层3 void init_ceng3(ceng* p){ p->number=3; p->row=SIZE-3; p->col=0; } //初始化层4 void init_ceng4(ceng* p){ p->number=4; p->row=SIZE-4; p->col=0; } //初始化层5 void init_ceng5(ceng*p){ p->number=5; p->row=SIZE-5; p->col=0; } //初始化层6 void init_ceng6(ceng*p){ p->number=6; p->row=SIZE-6; p->col=0; } //初始化层7 void init_ceng7(ceng*p){ p->number=7; p->row=SIZE-7; p->col=0; } //初始化层8 void 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #ifndef __STACK_H__ #define __STACK_H__ #define SIZE 8 typedef 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 ); //初始化栈1 void init_stack1(stack*); //初始化栈2和3 void init_stack2_3(stack*,stack*); //出栈 int pop_stack(stack*); //访问栈顶元素 int top_stack(stack*); //比较栈顶元素大小 -1 1 int sizecmp_stack(stack*,stack*); //判断栈的高度 int high_stack(stack*); //判断栈是否为空1 0 int empty_stack(stack*); //判断栈是否满1 0 int full_stack(stack*); //初始化层1 void init_ceng1(ceng*); //初始化层2 void init_ceng2(ceng*); //初始化层3 void init_ceng3(ceng*); //初始化层4 void init_ceng4(ceng*); //初始化层5 void init_ceng5(ceng*); //初始化层6 void init_ceng6(ceng*); //初始化层7 void init_ceng7(ceng*); //初始化层8 void init_ceng8(ceng*); //移动层块 void move_ceng( int , int * a, int *b,stack*,stack*,stack*, int k ); //打印画面 void show_map(); #endif |
演示图片
以上所述就是本文的全部内容了,希望能够对大家学习C语言的递归算法有所帮助
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
相关文章
C语言光标信息CONSOLE_CURSOR_INFO类型详解
本文详细讲解了C语言光标信息CONSOLE_CURSOR_INFO类型,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-12-12
最新评论