C语言实现汉诺塔游戏
更新时间:2020年4月25日 17:39 点击:1859
操作就是: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++; } //初始化栈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
#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 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语言实现的猴子偷桃之类算法
下一篇: 原创的C语言控制台小游戏
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了JavaScript 实现生命游戏的示例步骤,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下...2021-04-24
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 这篇文章主要给大家分享的是pygame游戏进行声音添加的方法,这文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!...2021-10-23
- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要为大家详细介绍了C#拼图游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 今天小编跟大家分享13个有趣又好玩的Python小游戏示例代码,教你如何通过边打游戏边学编程!感兴趣的小伙伴快跟随小编一起学习起来...2022-02-23
- 这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
- 很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
这篇文章主要介绍了基于Python-Pycharm实现的猴子摘桃小游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-20- 这篇文章主要介绍了python基于tkinter制作图形界面的2048游戏的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-04-06