AmazeDoc.cpp
上传用户:jygk2008
上传日期:2007-04-06
资源大小:18k
文件大小:5k
源码类别:

系统/网络安全

开发平台:

Visual C++

  1. // AmazeDoc.cpp : implementation of the CAmazeDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "Amaze.h"
  5. #include "AmazeDoc.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAmazeDoc
  13. IMPLEMENT_DYNCREATE(CAmazeDoc, CDocument)
  14. BEGIN_MESSAGE_MAP(CAmazeDoc, CDocument)
  15. //{{AFX_MSG_MAP(CAmazeDoc)
  16. // NOTE - the ClassWizard will add and remove mapping macros here.
  17. //    DO NOT EDIT what you see in these blocks of generated code!
  18. //}}AFX_MSG_MAP
  19. END_MESSAGE_MAP()
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CAmazeDoc construction/destruction
  22. CAmazeDoc::CAmazeDoc()
  23. {
  24. // TODO: add one-time construction code here
  25. m_pData = NULL;
  26. m_pDisData = NULL;
  27. m_nDisNum = 0;
  28. m_nWidth = 40;
  29. m_nHeight = 25;
  30. }
  31. CAmazeDoc::~CAmazeDoc()
  32. {
  33. DeleteAmaze();
  34. }
  35. BOOL CAmazeDoc::OnNewDocument()
  36. {
  37. if (!CDocument::OnNewDocument())
  38. return FALSE;
  39. // TODO: add reinitialization code here
  40. // (SDI documents will reuse this document)
  41. return TRUE;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CAmazeDoc serialization
  45. void CAmazeDoc::Serialize(CArchive& ar)
  46. {
  47. if (ar.IsStoring())
  48. {
  49. // TODO: add storing code here
  50. }
  51. else
  52. {
  53. // TODO: add loading code here
  54. }
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CAmazeDoc diagnostics
  58. #ifdef _DEBUG
  59. void CAmazeDoc::AssertValid() const
  60. {
  61. CDocument::AssertValid();
  62. }
  63. void CAmazeDoc::Dump(CDumpContext& dc) const
  64. {
  65. CDocument::Dump(dc);
  66. }
  67. #endif //_DEBUG
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CAmazeDoc commands
  70. void CAmazeDoc::CreateAmaze()
  71. {
  72.     int Ptr=0;
  73. int X, Y, Xn, Yn;
  74.     int Dir, Dir2;
  75.     int i, k;
  76. long Count0 = (2*m_nWidth+2) * (2*m_nHeight+2);
  77.     
  78. DeleteAmaze();
  79. m_pData = new long[Count0];
  80. m_pDisData = new long[Count0];
  81.     //初始化数组
  82. memset(m_pData, 0, sizeof(long) * Count0);
  83.     //画上下边界
  84. for( i = 0 ; i <= 2 * m_nWidth; i++){
  85.         AMAZEDATA(i, 0) = 1;
  86.         AMAZEDATA(i, m_nHeight * 2) = 1;
  87.     }
  88.     
  89.     //画左右边界
  90.     for( i = 0 ; i <= 2 * m_nHeight; i++){
  91.         AMAZEDATA(0, i) = 1;
  92.         AMAZEDATA(m_nWidth * 2 , i) = 1;
  93. }
  94.     Count0 = m_nWidth * m_nHeight;
  95.     //画迷宫循环
  96.     for( i = 0 ; i<= Count0; i++){
  97.         Ptr = (Ptr + 997) % Count0;
  98.         X = Ptr / m_nHeight;
  99.         Y = Ptr - X * m_nHeight;
  100.         if(!AMAZEDATA(2 * X, 2 * Y)){
  101.             Dir = 4.0 * rand() / RAND_MAX + 1;
  102.             Dir2 = Dir;
  103.             do{
  104.                 Dir = Dir % 4 + 1;
  105.                 Xn = ((Dir == 1) - (Dir == 3)) + X;
  106.                 Yn = ((Dir == 2) - (Dir == 4)) + Y;
  107.                 if( AMAZEDATA(2 * Xn, 2 * Yn) )
  108.                     break;
  109.                 if( Dir == Dir2 ){
  110.                     X = Xn;
  111.                     Y = Yn;
  112.                 }
  113.             }while(true);
  114. AMAZEDATA(2 * X , 2 * Y) = 1;
  115. AMAZEDATA(2 * Xn , 2 * Yn) = 1;
  116. AMAZEDATA(X + Xn , Y + Yn) = 1;
  117.             Dir = 4.0 * rand() / RAND_MAX + 1;
  118.             k = 0;
  119.             do {
  120.                 k = k + 1;
  121.                 Dir = Dir % 4 + 1;
  122.                 Xn = ((Dir == 1) - (Dir == 3)) + X;
  123.                 Yn = ((Dir == 2) - (Dir == 4)) + Y;
  124. if(! AMAZEDATA(2 * Xn, 2 * Yn) ){
  125.                     //Call LineA(X, Y, Xn, Yn)
  126. AMAZEDATA(2 * X , 2 * Y) = 1;
  127. AMAZEDATA(2 * Xn , 2 * Yn) = 1;
  128. AMAZEDATA(X + Xn , Y + Yn) = 1;
  129.                     X = Xn;
  130.                     Y = Yn;
  131.                     Dir = 4.0 * rand() / RAND_MAX + 1;
  132.                     k = 0;
  133.                 }
  134.             }while(k <= 4);
  135.         }
  136.     }
  137.     
  138.     //迷宫上边开口
  139.     X = m_nWidth - 1;
  140.     do {
  141.         X = X + 1;
  142.     }while( AMAZEDATA(X, 1) );
  143.     AMAZEDATA(X, 0) = 0;
  144.     
  145.     //迷宫下边开口
  146.     X = m_nWidth - 1;
  147.     do {
  148.         X = X + 1;
  149.     }while( AMAZEDATA(X, 2 * m_nHeight - 1) );
  150.     AMAZEDATA(X, 2 * m_nHeight) = 0;
  151. DisAmaze();
  152. }
  153. void CAmazeDoc::DisAmaze()
  154. {
  155.     int X, Y=1, Xn, Yn, k=0, n, n1, i;
  156.     
  157.     if(!m_pData)
  158.         //无迷宫
  159.         return;
  160.     
  161.     for( X = 0 ;X <= m_nWidth * 2; X++)
  162.         //寻找迷宫入口
  163.         if(! AMAZEDATA(X, 0) )
  164. break;
  165. *(m_pDisData) = X;
  166. *(m_pDisData+1) = 0;
  167. *(m_pDisData+2) = X;
  168. *(m_pDisData+3) = 1;
  169. m_nDisNum = 2;
  170.     do{
  171.     //由于迷宫一定有出口,
  172.     //所以按固定方向搜索,必然会找到出口
  173.     //当前Do循环即按一定方向遍历迷宫。
  174. for( n = 0 ; n<4; n++){ 
  175. n1 = (k + n) % 4;
  176. Xn = (n1 == 2) - (n1 == 0) + X;
  177. Yn = (n1 == 1) - (n1 == 3) + Y;
  178. if(! AMAZEDATA(Xn, Yn) ){
  179. for(i=0;i<m_nDisNum;i++)
  180. if(*(m_pDisData + 2*i) == Xn && *(m_pDisData + 2*i+1) == Yn)
  181. break;
  182. m_nDisNum = i;
  183. *(m_pDisData + 2*m_nDisNum) = Xn;
  184. *(m_pDisData + 2*m_nDisNum+1) = Yn;
  185. m_nDisNum++;
  186. X = Xn;
  187. Y = Yn;
  188. k = (n1 + 3) % 4;
  189. break;
  190. }
  191. }
  192.     //当Y方向大于迷宫边界时,结束
  193.     }while( Y != 2 * m_nHeight && Y > 0);
  194. }