win32多线程 - 汉诺塔动画

来源:互联网 发布:java抓取网页数据 脚本 编辑:程序博客网 时间:2024/05/17 05:55

最近在学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;
}


原创粉丝点击