home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 8 Other
/
08-Other.zip
/
RWALK.ZIP
/
RWALK.C
next >
Wrap
Text File
|
1991-06-13
|
7KB
|
214 lines
// this is RWALK.C, a simple-minded random walk program. The Esc key will clear
// the screen and put the walker in the middle. Use F3 to end to program.
#define INCL_DOSDATETIME
#define INCL_GPIBITMAPS
#define INCL_GPICONTROL
#define INCL_GPIPRIMITIVES
#define INCL_WINERRORS
#define INCL_WININPUT
#define INCL_WINSYS
#define INCL_WINTIMER
#define INCL_WINWINMANAGER
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#define PMG_CASU ( KC_CTRL | KC_ALT | KC_SHIFT | KC_KEYUP )
#define PMG_SWP ( SWP_SIZE | SWP_MOVE | SWP_MAXIMIZE )
#define MY_TIMER 17
#define NCOLOR 25
#define NPOINTS 32000
#define USERMSG1 (WM_USER+0)
// #define PMGDEBUG
#ifdef PMGDEBUG
// #define PMGALLMSGS
FILE *fp;
#endif
int RandomMove(POINTL *ptlPP,int x,int y,int incr)
{
static int color=(short) CLR_BLUE,dir=8,colors[NCOLOR]={
(short) CLR_RED,(short) CLR_RED,(short) CLR_RED,(short) CLR_RED,
(short) CLR_GREEN,(short) CLR_GREEN,(short) CLR_GREEN,(short) CLR_GREEN,
(short) CLR_GREEN,
(short) CLR_CYAN,(short) CLR_CYAN,
(short) CLR_YELLOW, (short) CLR_YELLOW,(short) CLR_YELLOW,
(short) CLR_YELLOW,
(short) CLR_WHITE,(short) CLR_WHITE,
(short) CLR_PINK,(short) CLR_PINK,(short) CLR_PINK,(short) CLR_PINK,
(short) CLR_BLUE,(short) CLR_BLUE,(short) CLR_BLUE,(short) CLR_BLUE};
int nc=0,nx=(short) ptlPP->x,ny=(short) ptlPP->y;
int tmp=incr*((28&rand())+4),tdir=7&rand();
if ( 4==(dir^tdir) ) return (short) CLR_ERROR;
if ( 2>tdir || 7==tdir )
if ( (nx+tmp)<x ) nx+=tmp; else nc=1;
if ( 0<tdir && 4>tdir )
if ( (ny+tmp)<y ) ny+=tmp; else nc=1;
if ( 2<tdir && 6>tdir )
if ( nx>=tmp ) nx-=tmp; else nc=1;
if ( 4<tdir )
if ( ny>=tmp ) ny-=tmp; else nc=1;
if ( nc ) color=colors[rand()%NCOLOR];
else
{
ptlPP->x=nx;
ptlPP->y=ny;
dir=tdir;
}
return color;
}
//1
MRESULT EXPENTRY CWProc(HWND hwnd,USHORT msg,MPARAM mp1,MPARAM mp2)
{
static HAB myhab;
static POINTL ptlPointerPos,aptl[3];
static HPS hpsWindow;
static int color,cornerx,cornery,dx,dy,erase,ix,rate,size,
xynum,x[NPOINTS],y[NPOINTS],z[NPOINTS];
#ifdef PMGALLMSGS
fprintf(fp,"msg=%4.4X, mp1.1=%4.4X, mp1.2=%4.4X mp2.1=%4.4X, mp2.2=%4.4X\n",
msg,SHORT1FROMMP(mp1),SHORT2FROMMP(mp1),SHORT1FROMMP(mp2),SHORT2FROMMP(mp2) );
#endif
switch (msg)
{
case WM_CREATE:
ix=-1;
xynum=1;
cornerx=32767;
WinStartTimer(myhab,hwnd,MY_TIMER,rate);
return (MRESULT) FALSE;
case WM_SIZE:
ix=0;
dx=SHORT1FROMMP(mp2)&(-32);
dy=SHORT2FROMMP(mp2)&(-32);
if ( dx>=cornerx && dy>=cornery )
{
cornerx=dx;
cornery=dy;
dx=(dx>>1)-x[0];
dy=(dy>>1)-y[0];
x[0]=dx;
y[0]=dy;
for ( ix=1 ; ix<xynum ; ix++ )
{
x[ix]+=dx;
y[ix]+=dy;
}
}
else
{
cornerx=dx;
cornery=dy;
size=(cornerx<cornery?cornerx:cornery)/128;
if ( 0==size ) size=1;
WinPostMsg(hwnd,WM_CHAR,MPFROM2SHORT(6,257),MPFROM2SHORT(0X11B,15));
}
x[0]=cornerx>>1;
y[0]=cornery>>1;
return (MRESULT) FALSE;
case USERMSG1:
erase=SHORT1FROMMP(mp1);
if ( NPOINTS<(erase-1) ) erase=NPOINTS-1;
rate=SHORT2FROMMP(mp1);
myhab=PVOIDFROMMP(mp2);
return (MRESULT) FALSE;
//2
case WM_CHAR:
if ( 0==(SHORT1FROMMP(mp1) & PMG_CASU)
&& (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) )
{
if ( '\x1b'==CHAR1FROMMP(mp2) )
{ // Esc key
xynum=1;
ptlPointerPos.x=x[0];
ptlPointerPos.y=y[0];
WinInvalidateRect(hwnd,NULL,TRUE);
break;
}
if ( VK_F3==CHAR3FROMMP(mp2) )
{ // f3 key
WinStopTimer(myhab,hwnd,MY_TIMER);
WinPostMsg(hwnd,WM_CLOSE,0L,0L);
break;
}
}
break;
case WM_PAINT: // clear screen, set pointer to center
hpsWindow=WinBeginPaint(hwnd,NULL,(PRECTL) aptl);
GpiBitBlt(hpsWindow,NULL,3L,aptl,ROP_ZERO,BBO_OR); // BLACK
ptlPointerPos.x=x[0];
ptlPointerPos.y=y[0];
GpiMove(hpsWindow,&ptlPointerPos);
for ( ix=1 ; ix<xynum ; ix++ )
{
GpiSetColor(hpsWindow,(long) z[ix]);
ptlPointerPos.x=x[ix];
ptlPointerPos.y=y[ix];
GpiLine(hpsWindow,&ptlPointerPos);
}
WinEndPaint(hpsWindow);
ix=-1;
return (MRESULT) FALSE;
case WM_TIMER:
if ( MY_TIMER!=SHORT1FROMMP(mp1) || ix>=0 ) break;
hpsWindow=WinGetPS(hwnd);
GpiMove(hpsWindow,&ptlPointerPos);
color=RandomMove(&ptlPointerPos,cornerx,cornery,size);
if ( ((short) CLR_ERROR)!=color )
{
x[xynum]=(short) ptlPointerPos.x;
y[xynum]=(short) ptlPointerPos.y;
z[xynum++]=color;
GpiSetColor(hpsWindow,(long) color);
GpiLine(hpsWindow,&ptlPointerPos);
}
WinReleasePS(hpsWindow);
if ( xynum>=erase )
WinPostMsg(hwnd,WM_CHAR,MPFROM2SHORT(6,257),MPFROM2SHORT(0X11B,15));
break;
}
return WinDefWindowProc(hwnd,msg,mp1,mp2);
}
//3
int main(int argc, char *argv[])
{
static HAB hab;
static HMQ hmq;
static HWND hwndFrame,hwndClient;
static QMSG qmsg;
static ULONG flFrameFlags=
FCF_TITLEBAR+FCF_SYSMENU+FCF_MINMAX+FCF_SIZEBORDER+FCF_SHELLPOSITION;
static char szCC[]="Rwalk";
int erase=1800,rate=75;
DATETIME dt;
if ( 1<argc ) sscanf(argv[1],"%d",&rate);
if ( 2<argc ) sscanf(argv[2],"%d",&erase);
#ifdef PMGDEBUG
if ( NULL==( fp=fopen("WINMSGS","w") ) ) return printf("open failed\n");
#endif
DosGetDateTime(&dt);
srand(dt.hours+dt.minutes+dt.seconds+dt.hundredths+dt.day+dt.month+dt.year);
hab=WinInitialize(0);
CWProc(NULL,USERMSG1,MPFROM2SHORT(erase,rate),MPFROMP(hab)); // cheat!
hmq=WinCreateMsgQueue(hab,0);
WinRegisterClass(hab,szCC,CWProc,CS_SIZEREDRAW,0);
hwndFrame=WinCreateStdWindow(HWND_DESKTOP,WS_VISIBLE,&flFrameFlags,
szCC,"Random Walker",0L,NULL,0,&hwndClient);
if ( NULL==hwndFrame ) WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,
"Unable to create window",szCC,0,MB_OK | MB_ICONEXCLAMATION );
else
{
while ( WinGetMsg(hab,&qmsg,NULL,0,0) ) WinDispatchMsg(hab,&qmsg);
WinDestroyWindow(hwndFrame);
}
WinDestroyMsgQueue(hmq);
WinTerminate(hab);
#ifdef PMGDEBUG
fclose(fp);
#endif
return 0;
}
//4