读书人

游走的字符程序C源代码,该怎么解决

发布时间: 2012-03-14 12:01:12 作者: rapoo

游走的字符程序C源代码
哪位高手帮下小弟!很急!!!!!!!
游走的字符(比如“A”)在屏幕或者窗口中游动,碰到屏幕的边界,自动改变方向。按任意键结束。用C语言做!

[解决办法]

C/C++ code
#include <windows.h>#include <process.h>    /* _beginthread, _endthread */#include <stddef.h>#include <stdlib.h>#include <conio.h>void Bounce( void *ch );void CheckKey( void *dummy );/* GetRandom returns a random integer between min and max. */#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))BOOL repeat = TRUE;     /* Global repeat flag and video variable */HANDLE hStdOut;         /* Handle for console window */CONSOLE_SCREEN_BUFFER_INFO csbi;    /* Console information structure */void main(){    CHAR    ch = 'A';    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );    /* Get display screen's text row and column information. */   GetConsoleScreenBufferInfo( hStdOut, &csbi );    /* Launch CheckKey thread to check for terminating keystroke. */    _beginthread( CheckKey, 0, NULL );    /* Loop until CheckKey terminates program. */    while( repeat )    {        /* On first loops, launch character threads. */        _beginthread( Bounce, 0, (void *) (ch++)  );        /* Wait one second between loops. */        Sleep( 1000L );    }}/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */void CheckKey( void *dummy ){    _getch();    repeat = 0;    /* _endthread implied */}/* Bounce - Thread to create and and control a colored letter that moves * around on the screen. * * Params: ch - the letter to be moved */void Bounce( void *ch ){    /* Generate letter and color attribute from thread argument. */    char    blankcell = 0x20;    char    blockcell = (char) ch;    BOOL    first = TRUE;   COORD   oldcoord, newcoord;   DWORD   result;     /* Seed random number generator and get initial location. */    srand( _threadid );    newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );    newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );    while( repeat )    {        /* Pause between loops. */        Sleep( 100L );        /* Blank out our old position on the screen, and draw new letter. */        if( first )            first = FALSE;        else         WriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result );         WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result );        /* Increment the coordinate for next placement of the block. */        oldcoord.X = newcoord.X;        oldcoord.Y = newcoord.Y;        newcoord.X += GetRandom( -1, 1 );        newcoord.Y += GetRandom( -1, 1 );        /* Correct placement (and beep) if about to go off the screen. */        if( newcoord.X < 0 )            newcoord.X = 1;        else if( newcoord.X == csbi.dwSize.X )            newcoord.X = csbi.dwSize.X - 2;        else if( newcoord.Y < 0 )            newcoord.Y = 1;        else if( newcoord.Y == csbi.dwSize.Y )            newcoord.Y = csbi.dwSize.Y - 2;        /* If not at a screen border, continue, otherwise beep. */        else            continue;//        Beep( ((char) ch - 'A') * 100, 175 );    }    /* _endthread given to terminate */    _endthread();}
[解决办法]
C/C++ code
回答楼上的MSDN源程序Example/* BEGTHRD.C illustrates multiple threads using functions: * *      _beginthread            _endthread * * * This program requires the multithreaded library. For example, * compile with the following command line: *     CL /MT /D "_X86_" BEGTHRD.C * * If you are using the Visual C++ development environment, select the  * Multi-Threaded runtime library in the compiler Project Settings  * dialog box. *  */#include <windows.h>#include <process.h>    /* _beginthread, _endthread */#include <stddef.h>#include <stdlib.h>#include <conio.h>void Bounce( void *ch );void CheckKey( void *dummy );/* GetRandom returns a random integer between min and max. */#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))BOOL repeat = TRUE;     /* Global repeat flag and video variable */HANDLE hStdOut;         /* Handle for console window */CONSOLE_SCREEN_BUFFER_INFO csbi;    /* Console information structure */void main(){    CHAR    ch = 'A';    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );    /* Get display screen's text row and column information. */   GetConsoleScreenBufferInfo( hStdOut, &csbi );    /* Launch CheckKey thread to check for terminating keystroke. */    _beginthread( CheckKey, 0, NULL );    /* Loop until CheckKey terminates program. */    while( repeat )    {        /* On first loops, launch character threads. */        _beginthread( Bounce, 0, (void *) (ch++)  );        /* Wait one second between loops. */        Sleep( 1000L );    }}/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */void CheckKey( void *dummy ){    _getch();    repeat = 0;    /* _endthread implied */}/* Bounce - Thread to create and and control a colored letter that moves * around on the screen. * * Params: ch - the letter to be moved */void Bounce( void *ch ){    /* Generate letter and color attribute from thread argument. */    char    blankcell = 0x20;    char    blockcell = (char) ch;    BOOL    first = TRUE;   COORD   oldcoord, newcoord;   DWORD   result;    /* Seed random number generator and get initial location. */    srand( _threadid );    newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );    newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );    while( repeat )    {        /* Pause between loops. */        Sleep( 100L );        /* Blank out our old position on the screen, and draw new letter. */        if( first )            first = FALSE;        else         WriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result );         WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result );        /* Increment the coordinate for next placement of the block. */        oldcoord.X = newcoord.X;        oldcoord.Y = newcoord.Y;        newcoord.X += GetRandom( -1, 1 );        newcoord.Y += GetRandom( -1, 1 );        /* Correct placement (and beep) if about to go off the screen. */        if( newcoord.X < 0 )            newcoord.X = 1;        else if( newcoord.X == csbi.dwSize.X )            newcoord.X = csbi.dwSize.X - 2;        else if( newcoord.Y < 0 )            newcoord.Y = 1;        else if( newcoord.Y == csbi.dwSize.Y )            newcoord.Y = csbi.dwSize.Y - 2;        /* If not at a screen border, continue, otherwise beep. */        else            continue;        Beep( ((char) ch - 'A') * 100, 175 );    }    /* _endthread given to terminate */    _endthread();}Process and Environment Control RoutinesSee Also   _endthread, abort, exit 

读书人网 >C语言

热点推荐