Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 第一个windows作品
【标  题】:第一个windows作品
【关键字】:windows
【来  源】:http://blog.chinaunix.net/article.php?articleId=19794&blogId=5207

第一个windows作品

Your Ad Here 推箱子

//*******************************************************
//
// FileName  : Push The Box
// Author   : Star Fish
// Version   : 1.0
// Date   : 2005:04:04
// Coments   : 采用数组 10 * 10 来建立围墙、目标、箱子和人
//      其中 墙  1
//        目标 2
//        箱子 3
//        空余 4
//        人  5
//      坐标为 视窗原点左移一定位置为原点   
//      左边留出一部分输出 关数 和步数
//      本程序没有考虑 资源和速度
//    
//      其实该程序应该用,即一个大的数组来存储所有地图
//      用一个小的数组来表示正在用的一关地图
//      既节省空间,又提高速度
//      大地图的结构为 i,j,Sex,如果连着三个为6,6,6
//       则为一关, sex为 1,2,3,4,5
//      其它地方为 墙外
//      因为采用现在模式可以直接看到地图效果
//      
//      实际的时候应该将现在的数组转换为上面大的数组
//
//      问题有当搬动箱子的时候可以缩小刷新的区域
//
//*******************************************************

#include <windows.h>
#include "Resource.h"

#define  ID_TIMER 1

LRESULT CALLBACK WinProc ( HWND, UINT, WPARAM, LPARAM);

struct Points
{
 POINT    Position;
 struct Points  *Next;
};

struct PointSex
{
 POINT    Position;

//      其中 墙  1
//        目标 2
//        箱子 3
//        空余 4
//        人  5
 int     i;

 struct PointSex  *Next;
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nShowCmd)
{
 static TCHAR   szAppName [] = "PushBox";
 HWND     hwnd;
 MSG      msg;
 WNDCLASS    wndclass;

 wndclass.cbClsExtra  = 0;
 wndclass.cbWndExtra  = 0;
 wndclass.hbrBackground = ( HBRUSH) GetStockObject ( WHITE_BRUSH);
 wndclass.hCursor  = LoadCursor ( hInstance, MAKEINTRESOURCE ( IDC_CURSOR1) );
 wndclass.hIcon   = LoadIcon ( hInstance, MAKEINTRESOURCE ( IDI_ICON1) );
 wndclass.hInstance  = hInstance;
 wndclass.lpfnWndProc = WinProc;
 wndclass.lpszClassName = szAppName;
 wndclass.lpszMenuName = NULL;
 wndclass.style   = CS_VREDRAW | CS_HREDRAW;

 if ( !RegisterClass ( &wndclass) )
 {
  MessageBox( NULL, "This program requires windows NT!",
      szAppName, MB_ICONERROR);
  return 0;
 }

 hwnd = CreateWindow ( szAppName, "推箱子",
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT,
      NULL, NULL, hInstance, NULL);
 
 ShowWindow ( hwnd, nShowCmd);
 UpdateWindow ( hwnd);

 while ( GetMessage( &msg, NULL, 0, 0) )
 {
  TranslateMessage ( &msg);
  DispatchMessage ( &msg);
 }
 return msg.wParam;
 
}

struct PointSex *InitNewLevel ( int iLevel)
{

 struct PointSex  *pPS0, *pPs2;
 int     i, j;

  static int   iBoxMap [ 2 ][ 10 ][ 20 ] = {
      // 第一关地图
      // 0 为 墙外 ;1 为 墙 ;2 为 目标 ;3为箱子
      // 4 为 空区域 ,5 为 人
      0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0
      0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //1
      0, 0, 1, 1, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //2
      0, 0, 0, 1, 1, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //3
      0, 0, 0, 0, 1, 4, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //4
      0, 0, 1, 1, 1, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //5
      0, 0, 1, 5, 3, 4, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //6
      0, 0, 1, 4, 4, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //7
      0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //8
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //9

      0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0
      0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //1
      0, 0, 1, 1, 4, 4, 4, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,  //2
      0, 0, 0, 1, 1, 3, 3, 1, 0, 0, 0, 1, 1, 2, 1, 0, 0, 0, 0, 0,  //3
      0, 0, 0, 0, 1, 4, 4, 1, 1, 1, 1, 1, 4, 4, 1, 0, 0, 0, 0, 0,  //4
      0, 0, 1, 1, 1, 3, 4, 4, 1, 1, 4, 4, 4, 3, 1, 0, 0, 0, 0, 0,  //5
      0, 0, 1, 5, 3, 4, 3, 4, 2, 4, 4, 4, 4, 4, 1, 0, 0, 0, 0, 0,  //6
      0, 0, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,  //7
      0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //8
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //9
      // 第二关
      // 要把 这个三维数组的第一个改为 2

      };
  pPS0 = pPs2 = NULL;

  iLevel = iLevel % 2;

  for ( j = 0; j < 10; j++)
   for ( i = 0; i < 20; i++)
   {
    if ( iBoxMap [ iLevel] [ j ] [ i ])
    {
     pPs2 = ( struct PointSex *) malloc ( sizeof (struct PointSex) );
     pPs2->Next   = pPS0;
     pPs2->Position.x = i;
     pPs2->Position.y = j;
     pPs2->i    = iBoxMap [ iLevel] [ j ] [ i ];
  
     pPS0 = pPs2;
      
     if ( pPs2->i < 0 || pPs2->i >5 )
     {
      MessageBox ( NULL,"Init error", "Error", MB_ICONERROR);
      
      while ( pPs2->Next)
      {
       free ( pPS0);
       pPS0 = pPs2;
       pPs2 = pPs2->Next;
      }

      free ( pPS0);

      exit(0);
 
     }
    }
   }

   return pPS0;
}
struct Points *InitBox( struct PointSex *pPos)
{
  struct Points   *pPs2, *pPS2;

  struct PointSex  *pPS0;
  
  pPS0 = pPos;
  pPs2 = pPS2 = NULL;


   while ( pPS0->Next)
   {
    if ( pPS0->i == 3)
    {
     pPs2 = ( struct Points *) malloc ( sizeof (struct Points) );
     pPs2->Position = pPS0->Position;
     pPs2 ->Next = pPS2;
     pPS2 = pPs2;

    }
    pPS0 = pPS0->Next;
   }

 
   if ( pPS0->i == 3)
   {
    pPs2 = ( struct Points *) malloc ( sizeof (struct Points) );
    pPs2->Position = pPS0->Position;
    pPs2 ->Next = pPS2;
    pPS2 = pPs2;
   }

   return pPs2;


}
struct Points *InitDest( struct PointSex *pPos)
{
  struct Points   *pPs2, *pPS2;

  struct PointSex  *pPS0;
  
  pPS0 = pPos;
  pPs2 = pPS2 = NULL;


   while ( pPS0->Next)
   {
    if ( pPS0->i == 2)
    {
     pPs2 = ( struct Points *) malloc ( sizeof (struct Points) );
     pPs2->Position = pPS0->Position;
     pPs2 ->Next = pPS2;
     pPS2 = pPs2;
    }
    pPS0 = pPS0->Next;
   }

 
   if ( pPS0->i == 2)
   {
    pPs2 = ( struct Points *) malloc ( sizeof (struct Points) );
    pPs2->Position = pPS0->Position;
    pPs2 ->Next = pPS2;
    pPS2 = pPs2;
   }

   return pPs2;

}

POINT InitMan (struct PointSex  *pPos)
{
  struct PointSex  *pPS0;

  pPS0 = pPos;

  while ( pPS0->Next)
   {
    if ( pPS0->i == 5)
    {
     pPS0->i = 4;
     break;
    }
    pPS0 = pPS0->Next;
   }

  return pPS0->Position;
 
}

void DrawMap( HDC hdc, struct PointSex *pPos)
{
 struct PointSex *p0;

 POINT   apt [ 4 ];

 HBRUSH hBrush;
 
 p0 = pPos;
 
 while ( p0)
 {
  if ( p0->i == 1) // WALL
  {
   hBrush = CreateHatchBrush ( HS_DIAGCROSS, RGB ( 100, 100, 100) );
   SelectObject ( hdc, hBrush);
   
   apt [ 0 ].x  = p0->Position.x * 100;
   apt [ 0 ].y  = p0->Position.y * 100;

   apt [ 1 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 1 ].y  = p0->Position.y * 100;

   apt [ 2 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 2 ].y  = ( p0->Position.y + 1) * 100;

   apt [ 3 ].x  = p0->Position.x * 100;
   apt [ 3 ].y  = ( p0->Position.y + 1) * 100;

   Polygon ( hdc, apt, 4);

   DeleteObject ( hBrush);

  }
  else if ( p0->i == 4) // space
  {
  
   SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
   
   apt [ 0 ].x  = p0->Position.x * 100;
   apt [ 0 ].y  = p0->Position.y * 100;

   apt [ 1 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 1 ].y  = p0->Position.y * 100;

   apt [ 2 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 2 ].y  = ( p0->Position.y + 1) * 100;

   apt [ 3 ].x  = p0->Position.x * 100;
   apt [ 3 ].y  = ( p0->Position.y + 1) * 100;

   Polygon ( hdc, apt, 4);
  }

  p0 = p0->Next;
 }
 

 return;
}
void Drawdest( HDC hdc, int i ,int j)
{
  POINT   apt [ 4 ];

   apt [ 0 ].x  = i * 100;
   apt [ 0 ].y  = j * 100;

   apt [ 1 ].x  = ( i + 1) * 100;
   apt [ 1 ].y  = j * 100;

   apt [ 2 ].x  = ( i + 1) * 100;
   apt [ 2 ].y  = ( j + 1) * 100;

   apt [ 3 ].x  = i * 100;
   apt [ 3 ].y  = ( j + 1) * 100;

   Polygon ( hdc, apt, 4);

   SelectObject ( hdc, GetStockObject ( BLACK_BRUSH) );
   
   apt [ 0 ].x  = i * 100 + 25;
   apt [ 0 ].y  = j * 100 + 25;

   apt [ 1 ].x  = i * 100 + 75;
   apt [ 1 ].y  = j * 100 + 25;

   apt [ 2 ].x  = i * 100 + 75;
   apt [ 2 ].y  = j * 100 + 75;

   apt [ 3 ].x  = i * 100 + 25;
   apt [ 3 ].y  = j * 100 + 75;

   Polygon ( hdc, apt, 4);


}
void DrawDest ( HDC hdc,struct Points *pDest)
{
 struct Points *p0;

 POINT   apt [ 4 ];

 p0 = pDest;

 while ( p0)
 {

   apt [ 0 ].x = p0->Position.x * 100;
   apt [ 0 ].y = p0->Position.y * 100;

   apt [ 1 ].x = ( p0->Position.x + 1) * 100;
   apt [ 1 ].y = p0->Position.y * 100;

   apt [ 2 ].x = ( p0->Position.x + 1) * 100;
   apt [ 2 ].y = ( p0->Position.y + 1) * 100;

   apt [ 3 ].x = p0->Position.x * 100;
   apt [ 3 ].y = ( p0->Position.y + 1) * 100;


   SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
   Polygon ( hdc, apt, 4);

   SelectObject ( hdc, GetStockObject ( BLACK_PEN) );

   Polyline ( hdc, apt, 4);

   MoveToEx( hdc, apt [ 0].x, apt [ 0 ].y, NULL);
   LineTo ( hdc, apt [ 3 ].x, apt [ 3 ].y);


   SelectObject ( hdc, GetStockObject ( BLACK_BRUSH) );
   
   apt [ 0 ].x  = p0->Position.x * 100 + 25;
   apt [ 0 ].y  = p0->Position.y * 100 + 25;

   apt [ 1 ].x  = p0->Position.x * 100 + 75;
   apt [ 1 ].y  = p0->Position.y * 100 + 25;

   apt [ 2 ].x  = p0->Position.x * 100 + 75;
   apt [ 2 ].y  = p0->Position.y * 100 + 75;

   apt [ 3 ].x  = p0->Position.x * 100 + 25;
   apt [ 3 ].y  = p0->Position.y * 100 + 75;

   Polygon ( hdc, apt, 4);

  p0 = p0->Next;
 }
 p0 = pDest;
 return;
}

void DrawBox( HDC hdc, struct Points *pBox)
{
 struct Points *p0;

 POINT   apt [ 4 ];


 p0 = pBox;

 while ( p0)
 {
  // 斜杠
  SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
  MoveToEx ( hdc, p0->Position.x * 100, p0->Position.y * 100, NULL);
  LineTo ( hdc, (p0->Position.x + 1) * 100, ( p0->Position.y + 1) * 100 );

  MoveToEx ( hdc, (p0->Position.x + 1) * 100, p0->Position.y * 100, NULL);
  LineTo ( hdc, p0->Position.x * 100, ( p0->Position.y + 1) * 100);
  
  // 3 边
   apt [ 0 ].x  = p0->Position.x * 100;
   apt [ 0 ].y  = p0->Position.y * 100;

   apt [ 1 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 1 ].y  = p0->Position.y * 100;

   apt [ 2 ].x  = ( p0->Position.x + 1) * 100;
   apt [ 2 ].y  = ( p0->Position.y + 1) * 100;

   apt [ 3 ].x  = p0->Position.x * 100;
   apt [ 3 ].y  = ( p0->Position.y + 1) * 100;

   Polyline ( hdc, apt ,4);
    
  MoveToEx ( hdc, p0->Position.x * 100, p0->Position.y * 100, NULL);
  LineTo ( hdc, p0->Position.x * 100, ( p0->Position.y + 1) * 100);


  p0 = p0->Next;
 }
}

void Drawbox ( HDC hdc, int i, int j)
{
  
 POINT apt [ 4 ];

  // 斜边
  MoveToEx ( hdc, i * 100, j * 100, NULL);
  LineTo ( hdc, (i + 1) * 100, ( j + 1) * 100 );

  MoveToEx ( hdc, (i + 1) * 100, j * 100, NULL);
  LineTo ( hdc, i * 100, ( j + 1) * 100);
  
  // 3 边
   apt [ 0 ].x  = i * 100;
   apt [ 0 ].y  = j * 100;

   apt [ 1 ].x  = ( i + 1) * 100;
   apt [ 1 ].y  = j * 100;

   apt [ 2 ].x  = ( i + 1) * 100;
   apt [ 2 ].y  = ( j + 1) * 100;

   apt [ 3 ].x  = i * 100;
   apt [ 3 ].y  = ( j + 1) * 100;

   Polyline ( hdc, apt ,4);
    
  MoveToEx ( hdc, i * 100, j * 100, NULL);
  LineTo ( hdc, i * 100, ( j + 1) * 100);


}
void DrawMan( HDC hdc, POINT po)
{
 int i;
 POINT man [ 5 ] = { 80, 50, 20, 50, 40, 40, 20, 50, 40, 60};


//   Polyline ( hdc, apt ,4);
 for ( i = 0; i < 5; i++ )
 {
  man [ i ].x += po.x * 100;
  man [ i ].y += po.y * 100;
 }

 Polyline ( hdc, man, 5);


}
void MoveCoordinate ( HDC hdc, int cxClient, int cyClient)
{
 SetMapMode ( hdc, MM_ISOTROPIC);
 SetWindowExtEx ( hdc, 1500, 1500, NULL);
    SetViewportExtEx (hdc, cxClient , cyClient, NULL) ;
  SetViewportOrgEx ( hdc, cxClient / 10, cyClient / 10 , NULL);
}

LRESULT CALLBACK WinProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 static int   cxClient, cyClient;
 static int   cxChar, cxCaps, cyChar;

 static int   iLevel; // 关
 static int   iNum; // 统计步数
 static BOOL   fPass;  // 过关
 static BOOL   bMan;


 static struct PointSex *pLevelMap; // 每一关的地图链表
 struct PointSex   *pPS0, *pPS1;  // 每一关的地图链表

 static struct Points *pDest, *pBox;
 static struct Points *pPs2;


 static POINT  iMan; //人的位置


 HDC     hdc;
 PAINTSTRUCT   ps;
 TEXTMETRIC   tm;

 TCHAR    szBuffer [10];


 switch ( message)
 {
 case WM_CREATE:

  SetTimer ( hwnd, ID_TIMER, 300, NULL);
  
  hdc = GetDC ( hwnd);
  
  GetTextMetrics ( hdc, &tm);
  cxChar = tm.tmAveCharWidth;
  cxCaps = ( tm.tmPitchAndFamily & 1 ? 2 : 3)
     * cxChar / 2;
  cyChar = tm.tmHeight + tm.tmExternalLeading ;

  iLevel = 0;
  iNum = 0;

  bMan = FALSE;

  pLevelMap = NULL;
  pDest = NULL;

  pLevelMap = InitNewLevel ( iLevel);
  pDest = InitDest ( pLevelMap);
  iMan = InitMan ( pLevelMap);
  pBox = InitBox ( pLevelMap);
  

  ReleaseDC ( hwnd, hdc);
 
  return 0;
 case WM_SIZE:
  cxClient = LOWORD ( lParam);
  cyClient = HIWORD ( lParam);
  return 0;

 case WM_KEYDOWN:
  switch ( wParam)
  {
  case VK_UP:
    
   pPS0 = pLevelMap;

   while ( pPS0) // while 1
   {
    if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y - 1 &&
      pPS0->i == 4)
      // 为空
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.y--;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

       // 如果原位置是目的 则要将该位置画白

       pPs2 = pDest;

       // 找到人原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y + 1)
         // iMan.y已减1
        {
          
         SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
         Drawdest ( hdc , iMan.x, iMan.y + 1);
   
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
     
     break;
    }// end if
    else if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y - 1 &&
      pPS0->i == 2)
      // 为目的
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.y--;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

     break;

    } // end else if
    else if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y - 1 &&
      pPS0->i == 3)
      // else if 2
      // 上面为箱子
    {
     pPS1 = pLevelMap;
     
     while ( pPS1) // while 3
     {
      if ( pPS1->Position .x == iMan.x  &&
        pPS1->Position .y == iMan.y - 2 &&
        ( pPS1->i == 4 || pPS1->i == 2)
       )
       // 找到箱子移动到的位置,即空或目的
       // if 4
      {
       hdc = GetDC ( hwnd);
       
       MoveCoordinate ( hdc, cxClient, cyClient);
       
       // 处理人
       SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
       DrawMan ( hdc, iMan);
       
       iMan.y--;
       iNum++;

       SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
       DrawMan ( hdc, iMan);

       // 还要处理箱子
       // 分为箱子链和地图位置处理
       // 先处理箱子链位置
       pPs2 = pBox;

       // 找到箱子原位置 也就是现在人的位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
         SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y - 1);

         pPs2->Position.y--;

         SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y );
         
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
       // 重画箱子完成

       pPS1->i = 3;
       // 到达该位置

       // 处理地图
       pPS0->i = 4;

       // 如果原位置是目的 则要改为目的

       pPs2 = pDest;

       // 找到箱子原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {           
         pPS0->i = 2;
         
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

       pPS1 = pLevelMap;

       while ( pPS1)
       {
        if ( pPS1->i ==2)
         break;
        else if ( pPS1->Next ==NULL &&
         ( pPS1->i > 2 || pPS1->i < 2))
         fPass = TRUE;   
        pPS1 = pPS1->Next;
       }
       
       InvalidateRect ( hwnd, NULL, TRUE);
       
       break;
      }// end if 4 空或目标 箱子的新位置
      pPS1 = pPS1->Next;
      
     }// end while 3
     break;
    } // end else if  2 上面为箱子
    pPS0 = pPS0->Next;
   } // end while 1 所有的位置
 
   break;
  case VK_DOWN:
    
   pPS0 = pLevelMap;

   while ( pPS0) // while 1
   {
    if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y + 1 &&
      pPS0->i == 4)
      // 为空
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.y++;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);
       
     pPs2 = pDest;

       // 找到人原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y - 1)
         // iMan.y已减1
        {
          
         SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
         Drawdest ( hdc , iMan.x, iMan.y - 1);
        
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

     
     break;
    }// end if
    else if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y + 1 &&
      pPS0->i == 2)
      // 为目的
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.y++;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

     break;

    } // end else if
    else if ( pPS0->Position .x == iMan.x  &&
      pPS0->Position .y == iMan.y + 1 &&
      pPS0->i == 3)
      // else if 2
      // 为箱子 箱子上面为空或目的
    {
     pPS1 = pLevelMap;
     
     while ( pPS1) // while 3
     {
      if ( pPS1->Position .x == iMan.x  &&
        pPS1->Position .y == iMan.y + 2 &&
        ( pPS1->i == 4 || pPS1->i == 2)
       )
       // 找到箱子移动到的位置,即空或目的
       // if 4
      {
       hdc = GetDC ( hwnd);
       
       MoveCoordinate ( hdc, cxClient, cyClient);
       
       // 处理人
       SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
       DrawMan ( hdc, iMan);
       
       iMan.y++;
       iNum++;

       SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
       DrawMan ( hdc, iMan);

       // 还要处理箱子
       // 分为箱子链和地图位置处理
       // 先处理箱子链位置
       pPs2 = pBox;

       // 找到箱子原位置 也就是现在人的位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
         SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y - 1);

         pPs2->Position.y++;

         SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y );
         
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
       // 重画箱子完成

       pPS1->i = 3;
       // 到达该位置

       // 处理地图
       pPS0->i = 4;

       // 如果原位置是目的 则要改为目的

       pPs2 = pDest;

       // 找到箱子原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
           pPS0->i = 2;
        
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
     
       pPS1 = pLevelMap;

       while ( pPS1)
       {
        if ( pPS1->i ==2)
         break;
        else if ( pPS1->Next ==NULL &&
         ( pPS1->i > 2 || pPS1->i < 2))
         fPass = TRUE;   
        pPS1 = pPS1->Next;
        
       }

       
       InvalidateRect ( hwnd, NULL, TRUE);
       
       break;
      }// end if 4 箱子的新位置
      pPS1 = pPS1->Next;
      
     }// end while 3
     break;
    } // end else if  2 箱子上面为空或目标
    pPS0 = pPS0->Next;
   } // end while 1 所有的位置
 

   break;
  case VK_LEFT:
    
   pPS0 = pLevelMap;

   while ( pPS0) // while 1
   {
    if ( pPS0->Position .x == iMan.x - 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 4)
      // 为空
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.x--;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);
     
       pPs2 = pDest;

       // 找到人原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x + 1 &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
          
         SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
         Drawdest ( hdc , iMan.x + 1, iMan.y);

         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

     break;
    }// end if
    else if ( pPS0->Position .x == iMan.x  - 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 2)
      // 为目的
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.x--;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

     break;

    } // end else if
    else if ( pPS0->Position .x == iMan.x - 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 3)
      // else if 2
      // 为箱子 箱子上面为空或目的
    {
     pPS1 = pLevelMap;
     
     while ( pPS1) // while 3
     {
      if ( pPS1->Position .x == iMan.x - 2 &&
        pPS1->Position .y == iMan.y &&
        ( pPS1->i == 4 || pPS1->i == 2)
       )
       // 找到箱子移动到的位置,即空或目的
       // if 4
      {
       hdc = GetDC ( hwnd);
       
       MoveCoordinate ( hdc, cxClient, cyClient);
       
       // 处理人
       SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
       DrawMan ( hdc, iMan);
       
       iMan.x--;
       iNum++;

       SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
       DrawMan ( hdc, iMan);

       // 还要处理箱子
       // 分为箱子链和地图位置处理
       // 先处理箱子链位置
       pPs2 = pBox;

       // 找到箱子原位置 也就是现在人的位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
         SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
         Drawbox( hdc, pPs2->Position.x - 1, pPs2->Position.y);

         pPs2->Position.x--;

         SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y );
         
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
       // 重画箱子完成

       pPS1->i = 3;
       // 到达该位置

       // 处理地图
       pPS0->i = 4;

       // 如果原位置是目的 则要改为目的

       pPs2 = pDest;

       // 找到箱子原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
           pPS0->i = 2;
        
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

       pPS1 = pLevelMap;

       while ( pPS1)
       {
        if ( pPS1->i ==2)
         break;
        else if ( pPS1->Next ==NULL &&
         ( pPS1->i > 2 || pPS1->i < 2))
         fPass = TRUE;   
        pPS1 = pPS1->Next;
       }
       
       InvalidateRect ( hwnd, NULL, TRUE);
       
       break;
      }// end if 4 箱子的新位置
      pPS1 = pPS1->Next;
      
     }// end while 3
     break;
    } // end else if  2 箱子上面为空或目标
    pPS0 = pPS0->Next;
   } // end while 1 所有的位置

   break;
  case VK_RIGHT:
    
   pPS0 = pLevelMap;

   while ( pPS0) // while 1
   {
    if ( pPS0->Position .x == iMan.x + 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 4)
      // 为空
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.x++;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

       pPs2 = pDest;

       // 找到人原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x - 1 &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
          
         SelectObject ( hdc, GetStockObject ( WHITE_BRUSH) );
         Drawdest ( hdc , iMan.x - 1, iMan.y);

         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

     
     break;
    }// end if
    else if ( pPS0->Position .x == iMan.x + 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 2)
      // 为目的
    {
     hdc = GetDC ( hwnd);
 
     MoveCoordinate ( hdc, cxClient, cyClient);

     SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
     DrawMan ( hdc, iMan);

     iMan.x++;
     iNum++;

     SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
     DrawMan ( hdc, iMan);

     break;

    } // end else if
    else if ( pPS0->Position .x == iMan.x + 1 &&
      pPS0->Position .y == iMan.y &&
      pPS0->i == 3)
      // else if 2
      // 为箱子 箱子上面为空或目的
    {
     pPS1 = pLevelMap;
     
     while ( pPS1) // while 3
     {
      if ( pPS1->Position .x == iMan.x + 2 &&
        pPS1->Position .y == iMan.y &&
        ( pPS1->i == 4 || pPS1->i == 2)
       )
       // 找到箱子移动到的位置,即空或目的
       // if 4
      {
       hdc = GetDC ( hwnd);
       
       MoveCoordinate ( hdc, cxClient, cyClient);
       
       // 处理人
       SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
       DrawMan ( hdc, iMan);
       
       iMan.x++;
       iNum++;

       SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
       DrawMan ( hdc, iMan);

       // 还要处理箱子
       // 分为箱子链和地图位置处理
       // 先处理箱子链位置
       pPs2 = pBox;

       // 找到箱子原位置 也就是现在人的位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
         SelectObject ( hdc, GetStockObject ( WHITE_PEN) );
         Drawbox( hdc, pPs2->Position.x + 1, pPs2->Position.y);

         pPs2->Position.x++;

         SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
         Drawbox( hdc, pPs2->Position.x, pPs2->Position.y );
         
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5
       // 重画箱子完成

       pPS1->i = 3;
       // 到达该位置

       // 处理地图
       pPS0->i = 4;

       // 如果原位置是目的 则要改为目的

       pPs2 = pDest;

       // 找到箱子原位置
       while ( pPs2) // while 5
       {
        if( pPs2->Position.x == iMan.x &&
         pPs2->Position.y == iMan.y )
         // iMan.y已减1
        {
           pPS0->i = 2;
        
         break;
        }// end if
        pPs2 = pPs2->Next;
       }//end while 5

       pPS1 = pLevelMap;

       while ( pPS1)
       {
        if ( pPS1->i ==2)
         break;
        else if ( pPS1->Next ==NULL &&
         ( pPS1->i > 2 || pPS1->i < 2))
         fPass = TRUE;   
        pPS1 = pPS1->Next;
       }
       
       InvalidateRect ( hwnd, NULL, TRUE);
       
       break;
      }// end if 4 箱子的新位置
      pPS1 = pPS1->Next;
      
     }// end while 3
     break;
    } // end else if  2 箱子上面为空或目标
    pPS0 = pPS0->Next;
   } // end while 1 所有的位置


   break;
  }
  return 0;
  
 case WM_TIMER:
    
  hdc = GetDC ( hwnd);

  MoveCoordinate ( hdc, cxClient, cyClient);

//  DrawMap ( hdc, cxClient, cyClient, iBoxMapTmp);

  if ( fPass)
  {
   fPass = FALSE;
   iLevel++;
   iNum = 0;
 
   // pLevelMap处理

  
   pPS0 = pLevelMap->Next;

   while ( pPS0 && pPS0->Next )
   {
    free ( pLevelMap );
    pLevelMap = pPS0;
    pPS0 = pPS0->Next;
    
   }
   
   free ( pPS0);
   
   pPs2 = pDest->Next;
   
   while ( pPs2 && pPs2->Next )
   {
    free ( pDest);
    pDest = pPs2;
    pPs2 = pPs2->Next;
   }
   
   free ( pPs2);

   pPs2 = pBox->Next;

   while ( pPs2 && pPs2->Next )
   {
    free ( pBox);
    pBox = pPs2;
    pPs2 = pPs2->Next;
   }
 
   free ( pPs2);

   pLevelMap = InitNewLevel ( iLevel);
   pDest = InitDest ( pLevelMap);
   iMan = InitMan ( pLevelMap);
   pBox = InitBox ( pLevelMap);
   
   InvalidateRect( hwnd, NULL, TRUE);
  }

  bMan = !bMan;

  if ( bMan)
   SelectObject ( hdc, GetStockObject ( BLACK_PEN) );
  else
   SelectObject ( hdc, GetStockObject ( WHITE_PEN) );


  DrawMan ( hdc, iMan);


  SetTextAlign ( hdc, TA_LEFT | TA_TOP);
  TextOut ( hdc, -200, 0, "Level:", 6);
  SetTextAlign ( hdc, TA_RIGHT | TA_TOP);
  TextOut ( hdc, -20, 0,  szBuffer,
   wsprintf ( szBuffer, "%2d",  iLevel) );
  SetTextAlign ( hdc, TA_LEFT | TA_TOP);
  
  TextOut ( hdc, -200, 50, "Num:" , 4 );
  SetTextAlign ( hdc, TA_RIGHT | TA_TOP);
  TextOut ( hdc, -20, 50, szBuffer,
   wsprintf ( szBuffer, "%2d",  iNum) );
  SetTextAlign ( hdc, TA_LEFT | TA_TOP);

  // 目的地有问题

//  DrawBox( hdc, pBox);
//  DrawDest( hdc, pDest);


  ReleaseDC ( hwnd, hdc);

  return 0;
 case WM_PAINT:
  
  hdc = BeginPaint ( hwnd, &ps);

  MoveCoordinate ( hdc, cxClient, cyClient);

  // 输出文字
  SetTextAlign ( hdc, TA_LEFT | TA_TOP);

  TextOut ( hdc, -200, 0, "Level:", 6);
  SetTextAlign ( hdc, TA_RIGHT | TA_TOP);
  TextOut ( hdc, -20, 0,  szBuffer,
   wsprintf ( szBuffer, "%2d",  iLevel) );
  SetTextAlign ( hdc, TA_LEFT | TA_TOP);
  
  TextOut ( hdc, -200, 50, "Num:" , 4 );
  SetTextAlign ( hdc, TA_RIGHT | TA_TOP);
  TextOut ( hdc, -20, 50, szBuffer,
   wsprintf ( szBuffer, "%2d",  iNum) );
  SetTextAlign ( hdc, TA_LEFT | TA_TOP);
  
  // 输出图形

  DrawMap ( hdc, pLevelMap);
  Dra

windows系统中得到精确到微妙的时间:【上一篇】
带参数的main函数:【下一篇】
【相关文章】
  • windows系统中得到精确到微妙的时间
  • QT Windows developing enviroment Building
  • Writing Scalable Applications for Windows NT
  • 在 MS Windows 下執行 Miniwin
  • 删除Linux后找回Windows的启动菜单
  • windows对话框程序模板。
  • Windows SDK入门浅谈
  • Windows 环境下apache+mod_perl+activeperl安装运行说明
  • cedega <<--可以运行windows下面程序的好东东
  • Windows 2000 DataCenter Server,需要的给个上传地址。
  • 【随机文章】
  • 设计模式(2)- 抽象工厂(Abstract Factory)
  • 多数据表共用一个页的新闻发布(PHP)
  • 如何使用ASP产生象安装向导的主页
  • 制作自己的man手册
  • 三种宽带上网拨号软件的常见故障与解决方法
  • 域名专题 - DNS 问答
  • C++对象模型(3) - An Object Distinction
  • mmap
  • 用ASP.NET在网页上显示缩略图
  • 网际畅游,MyIE2技巧集锦
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.