C語言實(shí)現(xiàn)漢諾塔游戲
操作就是:A B 號(hào)碼A的塔頂一層放在號(hào)碼B的塔頂。如1(空格) 3 回車。 話說有人能把我這C的代碼添加到QT界面框架上去么? 代碼寫的不好 ,維護(hù)性不夠,只能玩8層的,寫完以后發(fā)現(xiàn)很難拓展,軟件工程,設(shè)計(jì)模式有待提高....
里面提示輸入等級(jí)的裝B用了,沒有實(shí)現(xiàn),大家隨便輸入個(gè)個(gè)位數(shù)就可以玩了。
stackfunc.c
#include"STACK.h"
#include<stdio.h>
extern ceng CENG[SIZE];
//數(shù)據(jù)入棧
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];
}
//比較兩個(gè)棧頂元素的大小
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;
}
//移動(dòng)層
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("請(qǐng)輸入游戲等級(jí):\n");
scanf("%d",&level);
if(level<=0||level>8)
printf("等級(jí)范圍錯(cuò)誤,重新輸入\n");
}while(level<=0||level>8);
}
level=8;
newrow=0,newcol=0;
stack STACK[3];
//初始化3個(gè)棧
init_stack1(&STACK[0]);
init_stack2_3(&STACK[1],&STACK[2]);
//初始化8個(gè)層
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("游戲等級(jí)為:%d\n",level);
// printf("源棧最高層是%d ......\n",top_stack(&STACK[res]));
printf(" 一號(hào)的高度%d ",STACK[0].head);
printf(" 二號(hào)的高度%d ",STACK[1].head);
printf(" 三號(hào)的高度%d\n",STACK[2].head);
printf("\n已經(jīng)走的步數(shù)為 %d \n",step);
//選擇源 目標(biāo)
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正在移動(dòng)層塊....\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("是否繼續(xù)游戲?繼續(xù)請(qǐng)輸入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*);
//移動(dòng)層塊
void move_ceng(int ,int * a,int *b,stack*,stack*,stack*,int k );
//打印畫面
void show_map();
#endif
演示圖片
以上所述就是本文的全部內(nèi)容了,希望能夠?qū)Υ蠹覍W(xué)習(xí)C語言的遞歸算法有所幫助
上一篇:使用Objective-C獲取IPHONE手機(jī)IMSI序列號(hào)
欄 目:C語言
本文標(biāo)題:C語言實(shí)現(xiàn)漢諾塔游戲
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3111.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什


