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;
}
#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;
}
- win32多线程 - 汉诺塔动画
- win32多线程 - 汉诺塔动画 .
- Win32多线程
- Win32 多线程
- win32 多线程
- WIN32多线程
- win32 多线程
- Win32 多线程的性能
- Win32 多线程的性能
- Win32多线程程序设计读书笔记
- Win32 多线程的性能
- 《Win32多线程程序设计》
- 《Win32 多线程程序设计》读书笔记
- WIN32上的多线程
- win32多线程编程
- Win32多线程程序设计基本概念
- 深入浅出Win32多线程程序设计
- win32 多线程 1
- XHTML常用元素学习笔记
- Jsp连接数据库大全
- 用Windows 2003作路由局域网共享上网
- 解决你的外部依赖 -- svn:externals
- 卸装Oracle
- win32多线程 - 汉诺塔动画
- 线程同步基础知识
- 路由器与交换机 1
- 你是最好的孩子
- VS2005工程转化到VS2008后,TabControl控件出现异常问题
- 你一定能行
- 千兆交换机的级联
- javaDB—— derby简单操作
- 利用div+css在GridView模版列打造可定制的ToolTip风格