欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實(shí)現(xiàn)漢諾塔游戲

 更新時(shí)間:2015年03月30日 11:01:37   投稿:hebedich  
個(gè)人覺得漢諾塔這個(gè)遞歸算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實(shí)網(wǎng)上也有很多代碼,可以直接參考。記得大一開始時(shí)就做過漢諾塔的習(xí)題,但是那時(shí)代碼寫得很長很長,也是不理解遞歸的結(jié)果。今天重新來實(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("請輸入游戲等級(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ù)請輸入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語言的遞歸算法有所幫助

相關(guān)文章

  • C語言return知識(shí)點(diǎn)總結(jié)

    C語言return知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于C語言return知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • C語言二分法求解方程根的兩種方法

    C語言二分法求解方程根的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C語言二分法求解方程根的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解

    C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解

    高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對(duì)每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 深入解析C++ STL中的常用容器

    深入解析C++ STL中的常用容器

    這里我們不涉及容器的基本操作之類,只是要討論一下各個(gè)容器其各自的特點(diǎn)。STL中的常用容器包括:順序性容器(vector、deque、list)、關(guān)聯(lián)容器(map、set)、容器適配器(queue、stac)
    2013-09-09
  • C語言實(shí)現(xiàn)推箱子游戲

    C語言實(shí)現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 16種C語言編譯警告(Warning)類型的解決方法

    16種C語言編譯警告(Warning)類型的解決方法

    由于編譯的警告各種各樣,根本不可以一一羅列出來,下面只是列舉出比較典型的十六種警告,還有一些警告,大家只要根據(jù)字面意思,就可以很快的查找出來,并解決之。希望對(duì)大家有所幫助。
    2014-08-08
  • 解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題

    解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題

    這篇文章主要介紹了解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于memset()函數(shù)的深入理解

    基于memset()函數(shù)的深入理解

    本篇文章是對(duì)memset()函數(shù)又進(jìn)行了深一步的了解,需要的朋友參考下
    2013-05-05
  • 詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    這篇文章主要介紹了C++編程中標(biāo)記語句與復(fù)合語句的寫法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    這篇文章主要介紹了C++實(shí)現(xiàn)四叉樹效果(附源碼下載),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03

最新評(píng)論