win32多线程 - 汉诺塔动画

最近在学win32的多线程,感觉很好玩。

还是比较喜欢C语言的简洁,我总觉得MFC干扰的要素太多了,让人不能集中精力做核心代码,花在做界面上的时间太多。

这个程序是用C语言写的,用了win32提供的多线程做。虽然整个程序可以完全不用多线程也能实现,但是作为练习写一写感觉还是蛮好~

记得上次做龟兔赛跑的时候完全没有用win32函数,为了实现延时(delay),调用了时间函数计时,然后不停的空循环……现在想想真是愚蠢,用win32的Sleep就行了,而且不会占用CPU资源。

---------

代码:

#include  < stdio.h >
#include 
< windows.h >
#include 
< stdlib.h >

#define  MAX_PLATE 10
#define  PLAYDELAY 400
#define  LOOPDELAY 200

int  tower[ 3 ][MAX_PLATE];
int  top[ 3 ];
bool  GameOver;

// init towers
void  init( int  n)
{
    top[
1]=top[2]=0;
    top[
0]=n;
    
for(int i=0;i<n;i++)
    
{
        tower[
0][i]=n-i;
        tower[
1][i]=tower[2][i]=0;
    }

}


void  printChar( int  w, int  ch)
{
    
for(int i=0;i<w;i++) printf("%c",ch);
}


void  printPlate( int  width, int  size)
{

    
if(size==0)
    
{
        printChar(width
/2,' ');
        printf(
"|");
        printChar(width
/2,' ');
    }

    
else
    
{
        printChar(width
/2-size/2,' ');
        printChar(size,
'#');
        printChar(width
/2-size/2,' ');
    }

}


// Draw towers
void  draw( int  n)
{
    
int width=n*2-1;
    system(
"cls");
    
for(int j=n-1;j>=0;j--)
    
{
        
for(int i=0;i<3;i++)
        
{
            
if(top[i]<=j) printPlate(width,0);
            
else printPlate(width,tower[i][j]*2-1);
            printf(
" ");
        }

        printf(
" ");
    }

}


void  move( int  a, int  b)
{
    tower[b][top[b]
++]=tower[a][--top[a]];
}


void  Hanoi( int  n, int  a, int  b, int  c)
{
    
if(n)
    
{
        Hanoi(n
-1,a,c,b);
        move(a,c);
        Sleep(PLAYDELAY);
        Hanoi(n
-1,b,a,c);
    }

}


// MultThread Function
void  play( int  n)
{
    init(n);
    GameOver
=false;
    Hanoi(n,
0,1,2);
    GameOver
=true;
}


int  _tmain( int  argc, _TCHAR *  argv[])
{
    
int n=6;    //number of plates
    
    
//new Thread
    HANDLE hThread;
    DWORD ThreadID;
    hThread 
= CreateThread(NULL,0,
        (LPTHREAD_START_ROUTINE)play,    
//Pointer of ThreadFunc
        (VOID*)n,    //Argument to ThreadFunc
        0,&ThreadID);

    
//game loop
    while(!GameOver)
    
{
        draw(n);
        Sleep(LOOPDELAY);
    }


    
//system("pause");
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值