BoxMan_Edit.cpp
上传用户:qiangti
上传日期:2022-04-06
资源大小:644k
文件大小:14k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) AFE(Active-Free-Elegance)
  3. Module Name:
  4.     BoxMan_Edit.cpp
  5. Abstract:
  6. the BoxMan-Edit operation-contain Class
  7. Author:
  8.     Weijian Luo (Arthur Luo)   15-Jun-2005
  9. E-mail: skybluehacker@yahoo.com.cn
  10. Revision History:      1.0
  11. --*/
  12. #include "stdafx.h"
  13. #include "BoxMan_Editer.h"
  14. #include "BoxMan_Edit.h"
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char THIS_FILE[]=__FILE__;
  18. #define new DEBUG_NEW
  19. #endif
  20. int MAP_WIDTH =                16;
  21. int MAP_HEIGHT   =             14;
  22. int MAP_SMALL_SQUARE_SIZE  =   20;
  23. //地图状态
  24. #define MAP_BACKGROUP  48  //'0'  对应字符'0'
  25. #define MAP_WHITEWALL  49  //'1'
  26. #define MAP_BLUEWALL   50  //'2'
  27. #define MAP_BALL       51  //'3'
  28. #define MAP_YELLOWBOX  52  //'4'
  29. #define MAP_REDBOX     53  //'5'
  30. #define MAP_MANWALL    54  //'6'
  31. #define MAP_MANBALL    55  //'7'
  32. //假宏定义
  33. int MAX_MISSION_NUM  = 1;
  34. //////////////////////////////////////////////////////////////////////
  35. // Construction/Destruction
  36. //////////////////////////////////////////////////////////////////////
  37. CBoxMan_Edit::CBoxMan_Edit()
  38. {
  39. ClearMap();
  40. MAX_MISSION_NUM = LoadMaxMissionNum();
  41. }
  42. CBoxMan_Edit::~CBoxMan_Edit()
  43. {
  44. }
  45. void CBoxMan_Edit::LoadMap(int iMissionNum)
  46. {
  47.     CString str;
  48.     str.Format("[%d]", iMissionNum);
  49. FILE *pFile = fopen("map.info", "rb");
  50. if (pFile == NULL)
  51. {
  52.         AfxMessageBox("载入地图文件失败");
  53.         return;
  54. }
  55.     char cTmp[20];
  56.     fgets(cTmp, 20, pFile);
  57.     while (strncmp(cTmp, str, 3) != 0)
  58.     {
  59.         fgets(cTmp, 20, pFile);
  60.     }
  61.     for (int i = 0; i < MAP_HEIGHT; i++)
  62.         fgets(m_cMap[i], 20, pFile);
  63.     fclose(pFile);
  64. }
  65. void CBoxMan_Edit::SaveMap(void)
  66. {
  67.     CString str;
  68.     str.Format("[%d]", MAX_MISSION_NUM+1);
  69.     //最大地图数已经在初始化时候获取
  70. //打开地图文件
  71. FILE *pFile = fopen("map.info", "a+t");
  72. if (pFile == NULL)
  73. {
  74.         AfxMessageBox("打开地图文件失败");
  75.         return;
  76. }
  77. //文件指针移到文件末
  78. fseek( pFile, 0L, SEEK_END);
  79. //写入体图头部
  80. fputs(str,pFile);
  81. fputs("n",pFile);
  82. //写入地图数据体
  83. char strBuf[200];
  84.     for (int i = 0; i < MAP_HEIGHT; i++)
  85. {
  86. memset(strBuf,0,sizeof(strBuf));
  87. memcpy(strBuf,m_cMap[i],MAP_WIDTH);
  88.         fputs(strBuf, pFile);
  89. fputs("n",pFile);
  90. }
  91. //关闭地图
  92.     fclose(pFile);
  93. //最大地图数自增
  94. MAX_MISSION_NUM += 1;
  95. }
  96. int CBoxMan_Edit::LoadMaxMissionNum(void)
  97. {
  98. int iMissionNum = 1;
  99.     CString str;
  100.     str.Format("[%d]", iMissionNum);
  101. FILE *pFile = fopen("map.info", "rb");
  102. if (pFile == NULL)
  103. {
  104.         AfxMessageBox("载入地图文件失败");
  105.         return -1;
  106. }
  107.     char cTmp[20];
  108. while( !feof(pFile) )//not end of file
  109. {
  110. fgets(cTmp, 20, pFile);
  111. if(strncmp(cTmp, str, 3) == 0)
  112. {
  113.     str.Format("[%d]", ++iMissionNum);
  114. }
  115. }
  116.     fclose(pFile);
  117. return iMissionNum-1;
  118. }
  119. CPoint CBoxMan_Edit::GetManPosition()
  120. {
  121.     CPoint manPosition(0, 0);
  122.     for (int i = 0; i < MAP_HEIGHT; i++)
  123.     {
  124.         for (int j = 0; j < MAP_WIDTH; j++)
  125.         {
  126.             if (m_cMap[i][j]==MAP_MANWALL || m_cMap[i][j]==MAP_MANBALL)
  127.             {
  128.                 manPosition.x = j;
  129.                 manPosition.y = i;
  130.             }
  131.         }
  132.     }
  133.     return manPosition;
  134. }
  135. void CBoxMan_Edit::DrawMap(CDC* pDC)
  136. {
  137.     int i, j, x, y;
  138.     for (i = 0; i < MAP_HEIGHT; i++)
  139.     {
  140.         for (j = 0; j < MAP_WIDTH; j++)
  141.         {// pDC->TextOut(j * 10, i * 15, m_cMap[i][j]);
  142.             x = j * 20;
  143.             y = i * 20;
  144.             switch (m_cMap[i][j])
  145.             {
  146.             case MAP_BACKGROUP://0
  147.                 DrawBackGroup(x, y, pDC);
  148.                 break;
  149.             case MAP_WHITEWALL://1
  150.                 DrawWhiteWall(x, y, pDC);
  151.                 break;
  152.             case MAP_BLUEWALL://2
  153.                 DrawBlueWall(x, y, pDC);
  154.                 break;
  155.             case MAP_BALL://3
  156.                 DrawBall(x, y, pDC);
  157.                 break;
  158.             case MAP_YELLOWBOX://4
  159.                 DrawYellowBox(x, y, pDC);
  160.                 break;
  161.             case MAP_REDBOX://5
  162.                 DrawRedBox(x, y, pDC);
  163.                 break;
  164.             case MAP_MANWALL://6
  165.                 DrawManWall(x, y, pDC);
  166.                 break;
  167.             case MAP_MANBALL://7
  168.                 DrawManBall(x, y, pDC);
  169.                 break;
  170.             }
  171.         }
  172.     }
  173. }
  174. void CBoxMan_Edit::DrawBackGroup(int x, int y, CDC* pDC)
  175. {
  176.     COLORREF clr = RGB(0, 0, 0);
  177.     pDC->FillSolidRect(x, y, 20, 20, clr);
  178. }
  179. void CBoxMan_Edit::DrawWhiteWall(int x, int y, CDC* pDC)
  180. {
  181.     COLORREF clr1 = RGB(255, 255, 255);
  182.     COLORREF clr2 = RGB(48, 48, 48);
  183.     COLORREF clr3 = RGB(192, 192, 192);
  184.     pDC->FillSolidRect(x, y, 19, 19, clr1);
  185.     pDC->FillSolidRect(x + 1, y + 1, 19, 19, clr2);
  186.     pDC->FillSolidRect(x + 1, y + 1, 18, 18, clr3);
  187.     pDC->MoveTo(x, y + 10);
  188.     pDC->LineTo(x + 20, y + 10);
  189.     pDC->MoveTo(x + 10, y + 10);
  190.     pDC->LineTo(x + 10, y + 20);
  191. }
  192. void CBoxMan_Edit::DrawBlueWall(int x, int y, CDC* pDC)
  193. {
  194.     COLORREF clr = RGB(0, 0, 255);
  195.     pDC->FillSolidRect(x, y, 20, 20, clr);
  196.     pDC->MoveTo(x, y + 10);
  197.     pDC->LineTo(x + 20, y + 10);
  198.     pDC->MoveTo(x + 10, y + 10);
  199.     pDC->LineTo(x + 10, y + 20);
  200. }
  201. void CBoxMan_Edit::DrawBall(int x, int y, CDC* pDC)
  202. {
  203.     COLORREF clr = RGB(0, 0, 255);
  204.     pDC->FillSolidRect(x, y, 20, 20, clr);
  205.     pDC->MoveTo(x, y + 10);
  206.     pDC->LineTo(x + 20, y + 10);
  207.     pDC->MoveTo(x + 10, y + 10);
  208.     pDC->LineTo(x + 10, y + 20);
  209.     pDC->Ellipse(x, y, x + 20, y + 20);
  210.     pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);
  211. }
  212. void CBoxMan_Edit::DrawYellowBox(int x, int y, CDC* pDC)
  213. {
  214.     COLORREF clr = RGB(255, 255, 0);
  215.     pDC->FillSolidRect(x, y, 20, 20, clr);
  216.     COLORREF clr2 = RGB(255, 192, 0);
  217.     pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);
  218.     COLORREF clr3 = RGB(0, 0, 0);
  219.     pDC->SetPixel(x + 3, y + 3, clr3);
  220.     pDC->SetPixel(x + 17, y + 3, clr3);
  221.     pDC->SetPixel(x + 3, y + 17, clr3);
  222.     pDC->SetPixel(x + 17, y + 17, clr3);
  223. }
  224. void CBoxMan_Edit::DrawRedBox(int x, int y, CDC* pDC)
  225. {
  226.     COLORREF clr = RGB(255, 255, 0);
  227.     pDC->FillSolidRect(x, y, 20, 20, clr);
  228.     COLORREF clr2 = RGB(255, 0, 0);
  229.     pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);
  230.     COLORREF clr3 = RGB(0, 0, 0);
  231.     pDC->SetPixel(x + 3, y + 3, clr3);
  232.     pDC->SetPixel(x + 17, y + 3, clr3);
  233.     pDC->SetPixel(x + 3, y + 17, clr3);
  234.     pDC->SetPixel(x + 17, y + 17, clr3);
  235. }
  236. void CBoxMan_Edit::DrawManWall(int x, int y, CDC* pDC)
  237. {
  238.     COLORREF clr = RGB(0, 0, 255);                   //蓝色墙
  239.     pDC->FillSolidRect(x, y, 20, 20, clr);
  240.     pDC->MoveTo(x, y + 10);
  241.     pDC->LineTo(x + 20, y + 10);
  242.     pDC->MoveTo(x + 10, y + 10);
  243.     pDC->LineTo(x + 10, y + 20);
  244.     pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头
  245.     pDC->MoveTo(x + 2, y + 11);                      //人手
  246.     pDC->LineTo(x + 18, y + 11);
  247.     pDC->MoveTo(x + 10, y + 10);                     //人身体
  248.     pDC->LineTo(x + 10, y + 12);
  249.     pDC->MoveTo(x + 2, y + 20);                      //人脚
  250.     pDC->LineTo(x + 10, y + 12);
  251.     pDC->LineTo(x + 18, y +20);
  252. }
  253. void CBoxMan_Edit::DrawManBall(int x, int y, CDC* pDC)
  254. {
  255.     COLORREF clr = RGB(0, 0, 255);                   //球
  256.     pDC->FillSolidRect(x, y, 20, 20, clr);
  257.     pDC->MoveTo(x, y + 10);
  258.     pDC->LineTo(x + 20, y + 10);
  259.     pDC->MoveTo(x + 10, y + 10);
  260.     pDC->LineTo(x + 10, y + 20);
  261.     pDC->Ellipse(x, y, x + 20, y + 20);
  262.     pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);
  263.     pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头
  264.     pDC->MoveTo(x + 2, y + 11);                      //人手
  265.     pDC->LineTo(x + 18, y + 11);
  266.     pDC->MoveTo(x + 10, y + 10);                     //人身体
  267.     pDC->LineTo(x + 10, y + 12);
  268.     pDC->MoveTo(x + 2, y + 20);                      //人脚
  269.     pDC->LineTo(x + 10, y + 12);
  270.     pDC->LineTo(x + 18, y +20);
  271. }
  272. void CBoxMan_Edit::UpdateMap(UINT nChar)
  273. {
  274.     int x1, y1, x2, y2, x3, y3;
  275.     x1 = m_ptManPosition.x;
  276.     y1 = m_ptManPosition.y;
  277.     switch (nChar)
  278.     {
  279.     case VK_UP:
  280.         x2 = x1;
  281.         y2 = y1 - 1;
  282.         x3 = x1;
  283.         y3 = y1 - 2;
  284.         UpdateMap(x1, y1, x2, y2, x3, y3);
  285.         break;
  286.     case VK_DOWN:
  287.         x2 = x1;
  288.         y2 = y1 + 1;
  289.         x3 = x1;
  290.         y3 = y1 + 2;
  291.         UpdateMap(x1, y1, x2, y2, x3, y3);
  292.         break;
  293.     case VK_LEFT:
  294.         x2 = x1 - 1;
  295.         y2 = y1;
  296.         x3 = x1 - 2;
  297.         y3 = y1;
  298.         UpdateMap(x1, y1, x2, y2, x3, y3);
  299.         break;
  300.     case VK_RIGHT:
  301.         x2 = x1 + 1;
  302.         y2 = y1;
  303.         x3 = x1 + 2;
  304.         y3 = y1;
  305.         UpdateMap(x1, y1, x2, y2, x3, y3);
  306.         break;
  307.     case 82:  //R  replay this mission
  308.     case 114: //r  replay this mission
  309.         LoadMap(m_iMissionNum);
  310.         m_ptManPosition = GetManPosition();
  311.         break;
  312.     case 113:  //F2  play next mission
  313.         m_iMissionNum = m_iMissionNum + 1;
  314.         if (m_iMissionNum > MAX_MISSION_NUM)
  315.             m_iMissionNum = 1;
  316.         LoadMap(m_iMissionNum);
  317.         m_ptManPosition = GetManPosition();
  318.         break;
  319.     case 112:  //F1  play forward mission
  320.         m_iMissionNum = m_iMissionNum - 1;
  321.         if (m_iMissionNum < 1)
  322.             m_iMissionNum = MAX_MISSION_NUM;
  323.         LoadMap(m_iMissionNum);
  324.         m_ptManPosition = GetManPosition();
  325.     }
  326. }
  327. void CBoxMan_Edit::UpdateMap(int x1, int y1, int x2, int y2, int x3, int y3)
  328. {
  329.     switch (m_cMap[y2][x2])
  330.     {
  331.     case MAP_BACKGROUP:           //wrong map
  332.         AfxMessageBox("wrong map");
  333.         break;
  334.     case MAP_WHITEWALL:          //do nothing
  335.         
  336.         break;
  337.     case MAP_BLUEWALL:           //can go
  338.         m_cMap[y2][x2] = MAP_MANWALL;
  339.         if (m_cMap[y1][x1] == MAP_MANWALL)
  340.             m_cMap[y1][x1] = MAP_BLUEWALL;
  341.         else if (m_cMap[y1][x1] == MAP_MANBALL)
  342.             m_cMap[y1][x1] = MAP_BALL;
  343.         m_ptManPosition.x = x2;
  344.         m_ptManPosition.y = y2;
  345.         break;
  346.     case MAP_BALL:               //can go
  347.         m_cMap[y2][x2] = MAP_MANBALL;
  348.         if (m_cMap[y1][x1] == MAP_MANWALL)
  349.             m_cMap[y1][x1] = MAP_BLUEWALL;
  350.         else if (m_cMap[y1][x1] == MAP_MANBALL)
  351.             m_cMap[y1][x1] = MAP_BALL;        
  352.         m_ptManPosition.x = x2;
  353.         m_ptManPosition.y = y2;
  354.         break;
  355.     case MAP_YELLOWBOX:          //under judge
  356.         if (m_cMap[y3][x3] == MAP_BALL)   // can go
  357.         {
  358.             m_cMap[y3][x3] = MAP_REDBOX;
  359.             m_cMap[y2][x2] = MAP_MANWALL;
  360.             if (m_cMap[y1][x1] == MAP_MANWALL)
  361.                 m_cMap[y1][x1] = MAP_BLUEWALL;
  362.             else if (m_cMap[y1][x1] == MAP_MANBALL)
  363.                 m_cMap[y1][x1] = MAP_BALL;
  364.             m_ptManPosition.x = x2;
  365.             m_ptManPosition.y = y2;
  366.         }
  367.         else if (m_cMap[y3][x3] == MAP_BLUEWALL) //can go
  368.         {
  369.             m_cMap[y3][x3] = MAP_YELLOWBOX;
  370.             m_cMap[y2][x2] = MAP_MANWALL;
  371.             if (m_cMap[y1][x1] == MAP_MANWALL)
  372.                 m_cMap[y1][x1] = MAP_BLUEWALL;
  373.             else if (m_cMap[y1][x1] == MAP_MANBALL)
  374.                 m_cMap[y1][x1] = MAP_BALL;
  375.             m_ptManPosition.x = x2;
  376.             m_ptManPosition.y = y2;
  377.         }
  378.         break;
  379.     case MAP_REDBOX:             //under judge
  380.         if (m_cMap[y3][x3] == MAP_BALL)   // can go
  381.         {
  382.             m_cMap[y3][x3] = MAP_REDBOX;
  383.             m_cMap[y2][x2] = MAP_MANBALL;
  384.             if (m_cMap[y1][x1] == MAP_MANWALL)
  385.                 m_cMap[y1][x1] = MAP_BLUEWALL;
  386.             else if (m_cMap[y1][x1] == MAP_MANBALL)
  387.                 m_cMap[y1][x1] = MAP_BALL;
  388.             m_ptManPosition.x = x2;
  389.             m_ptManPosition.y = y2;
  390.         }
  391.         else if (m_cMap[y3][x3] == MAP_BLUEWALL) //can go
  392.         {
  393.             m_cMap[y3][x3] = MAP_YELLOWBOX;
  394.             m_cMap[y2][x2] = MAP_MANBALL;
  395.             if (m_cMap[y1][x1] == MAP_MANWALL)
  396.                 m_cMap[y1][x1] = MAP_BLUEWALL;
  397.             else if (m_cMap[y1][x1] == MAP_MANBALL)
  398.                 m_cMap[y1][x1] = MAP_BALL;
  399.             m_ptManPosition.x = x2;
  400.             m_ptManPosition.y = y2;
  401.         }        
  402.         break;
  403.     case MAP_MANWALL:            //wrong map
  404.         AfxMessageBox("wrong map");
  405.         break;
  406.     case MAP_MANBALL:            //wrong map
  407.         AfxMessageBox("wrong map");
  408.         break;
  409.     }
  410. }
  411. bool CBoxMan_Edit::IsFinish()
  412. {
  413.     bool bFinish = true;
  414.     for (int i = 0; i < MAP_HEIGHT; i++)
  415.     {
  416.         for (int j = 0; j < MAP_WIDTH; j++)
  417.         {
  418.             if (m_cMap[i][j] == MAP_BALL || m_cMap[i][j] == MAP_MANBALL)
  419.                 bFinish = false;
  420.         }
  421.     }
  422.     return bFinish;
  423. }
  424. BOOL CBoxMan_Edit::ChangeMissionNum(int iNum)
  425. {
  426. if((iNum>MAX_MISSION_NUM)||(iNum<1))
  427. {
  428. return FALSE;
  429. }
  430. else
  431. {
  432.         m_iMissionNum = iNum;
  433.         LoadMap(m_iMissionNum);
  434.         m_ptManPosition = GetManPosition();
  435. return TRUE;
  436. }
  437. }
  438. int  CBoxMan_Edit::GetNowMissionNum(void)
  439. {
  440. return m_iMissionNum;
  441. }
  442. void CBoxMan_Edit::ChangeMap(int x, int y, int iState)
  443. {
  444.             m_cMap[y][x] = iState;
  445. }
  446. void CBoxMan_Edit::ClearMap(void)
  447. {
  448. for(int x=0; x< MAP_WIDTH; x++)
  449. for(int y=0; y<MAP_HEIGHT; y++)
  450. {
  451.             m_cMap[y][x] = MAP_BACKGROUP;
  452. }
  453. }
  454. void CBoxMan_Edit::DrawMouseCursor(int x, int y, int iState, CDC *pDC)
  455. {
  456. switch (iState)
  457. {
  458. case MAP_BACKGROUP://背景
  459. DrawBackGroup(x, y, pDC);
  460. break;
  461. case MAP_WHITEWALL://墙
  462. DrawWhiteWall(x, y, pDC);
  463. break;
  464. case MAP_BLUEWALL://通道
  465. DrawBlueWall(x, y, pDC);
  466. break;
  467. case MAP_BALL://目的地
  468. DrawBall(x, y, pDC);
  469. break;
  470. case MAP_YELLOWBOX://箱子
  471. DrawYellowBox(x, y, pDC);
  472. break;
  473. case MAP_REDBOX://箱子
  474. DrawRedBox(x, y, pDC);
  475. break;
  476. case MAP_MANWALL://人在目的地
  477. DrawManWall(x, y, pDC);
  478. break;
  479. case MAP_MANBALL://人在通道
  480. DrawManBall(x, y, pDC);
  481. break;
  482. }
  483. }