LLKDlg.cpp
上传用户:dengling
上传日期:2022-05-24
资源大小:3782k
文件大小:11k
源码类别:

其他游戏

开发平台:

Visual C++

  1. // LLKDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "LLK.h"
  5. #include "LLKDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define  ROWCOUNT  7 
  12. #define  COLCOUNT  12
  13. #define  BLANK_STATE -1
  14. #define BKCOLOR         RGB(128,128,128)
  15. #define FRONTWIDTH     (39+2)     
  16. #define FRONTHEIGHT     (39+12)     
  17. #define BKWIDTH         46
  18. #define BKHEIGHT        56
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CAboutDlg dialog used for App About
  21. class CAboutDlg : public CDialog
  22. {
  23. public:
  24. CAboutDlg();
  25. // Dialog Data
  26. //{{AFX_DATA(CAboutDlg)
  27. enum { IDD = IDD_ABOUTBOX };
  28. //}}AFX_DATA
  29. // ClassWizard generated virtual function overrides
  30. //{{AFX_VIRTUAL(CAboutDlg)
  31. protected:
  32. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  33. //}}AFX_VIRTUAL
  34. // Implementation
  35. protected:
  36. //{{AFX_MSG(CAboutDlg)
  37. //}}AFX_MSG
  38. DECLARE_MESSAGE_MAP()
  39. };
  40. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  41. {
  42. //{{AFX_DATA_INIT(CAboutDlg)
  43. //}}AFX_DATA_INIT
  44. }
  45. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  46. {
  47. CDialog::DoDataExchange(pDX);
  48. //{{AFX_DATA_MAP(CAboutDlg)
  49. //}}AFX_DATA_MAP
  50. }
  51. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  52. //{{AFX_MSG_MAP(CAboutDlg)
  53. // No message handlers
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CLLKDlg dialog
  58. CLLKDlg::CLLKDlg(CWnd* pParent /*=NULL*/)
  59. : CDialog(CLLKDlg::IDD, pParent)
  60. {
  61. //{{AFX_DATA_INIT(CLLKDlg)
  62. // NOTE: the ClassWizard will add member initialization here
  63. //}}AFX_DATA_INIT
  64. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  65. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  66.     m_nRow = ROWCOUNT;
  67. m_nCol = COLCOUNT;
  68. m_map = new int [m_nRow * m_nCol];
  69. m_nX1 = BLANK_STATE;
  70. m_nY1 = BLANK_STATE;
  71. }
  72. CLLKDlg::~CLLKDlg()
  73. {
  74. delete [] m_map;
  75. void CLLKDlg::DoDataExchange(CDataExchange* pDX)
  76. {
  77. CDialog::DoDataExchange(pDX);
  78. //{{AFX_DATA_MAP(CLLKDlg)
  79. // NOTE: the ClassWizard will add DDX and DDV calls here
  80. //}}AFX_DATA_MAP
  81. }
  82. BEGIN_MESSAGE_MAP(CLLKDlg, CDialog)
  83. //{{AFX_MSG_MAP(CLLKDlg)
  84. ON_WM_SYSCOMMAND()
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_WM_LBUTTONDOWN()
  88. //}}AFX_MSG_MAP
  89. END_MESSAGE_MAP()
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CLLKDlg message handlers
  92. BOOL CLLKDlg::OnInitDialog()
  93. {
  94. CDialog::OnInitDialog();
  95. // Add "About..." menu item to system menu.
  96. // IDM_ABOUTBOX must be in the system command range.
  97. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  98. ASSERT(IDM_ABOUTBOX < 0xF000);
  99. CMenu* pSysMenu = GetSystemMenu(FALSE);
  100. if (pSysMenu != NULL)
  101. {
  102. CString strAboutMenu;
  103. strAboutMenu.LoadString(IDS_ABOUTBOX);
  104. if (!strAboutMenu.IsEmpty())
  105. {
  106. pSysMenu->AppendMenu(MF_SEPARATOR);
  107. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  108. }
  109. }
  110. // Set the icon for this dialog.  The framework does this automatically
  111. //  when the application's main window is not a dialog
  112. SetIcon(m_hIcon, TRUE); // Set big icon
  113. SetIcon(m_hIcon, FALSE); // Set small icon
  114. // TODO: Add extra initialization here
  115. CDC *pDC = GetDC();
  116. m_men3DBkDC.CreateCompatibleDC(pDC);
  117. m_men3DBkBmp.LoadBitmap(IDB_BITMAP2);
  118. m_men3DBkDC.SelectObject(&m_men3DBkBmp);
  119. m_menAnimalDC.CreateCompatibleDC(pDC);
  120. m_menAnimalBmp.LoadBitmap(IDB_BITMAP1);
  121. m_menAnimalDC.SelectObject(&m_menAnimalBmp);
  122. m_menDC.CreateCompatibleDC(pDC);
  123. m_menBitmap.CreateCompatibleBitmap(pDC, m_nCol * FRONTWIDTH + 5, m_nRow * FRONTHEIGHT + 5);
  124. m_menDC.SelectObject(&m_menBitmap);
  125. StartNewGame();
  126. HWND hWnd = ::AfxGetMainWnd()->m_hWnd;
  127. ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0 , 0, SWP_NOMOVE|SWP_NOSIZE);
  128. return TRUE;  // return TRUE  unless you set the focus to a control
  129. }
  130. void CLLKDlg::OnSysCommand(UINT nID, LPARAM lParam)
  131. {
  132. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  133. {
  134. CAboutDlg dlgAbout;
  135. dlgAbout.DoModal();
  136. }
  137. else
  138. {
  139. CDialog::OnSysCommand(nID, lParam);
  140. }
  141. }
  142. // If you add a minimize button to your dialog, you will need the code below
  143. //  to draw the icon.  For MFC applications using the document/view model,
  144. //  this is automatically done for you by the framework.
  145. void CLLKDlg::OnPaint() 
  146. {
  147. CPaintDC dc(this); // device context for painting
  148.     DrawGame(&m_menDC);
  149. dc.BitBlt(0, 0, m_nCol*FRONTWIDTH, m_nCol*FRONTHEIGHT, &m_menDC, 0, 0, SRCCOPY);
  150. }
  151. // The system calls this to obtain the cursor to display while the user drags
  152. //  the minimized window.
  153. HCURSOR CLLKDlg::OnQueryDragIcon()
  154. {
  155. return (HCURSOR) m_hIcon;
  156. }
  157. void CLLKDlg::StartNewGame()
  158. {
  159. int i = 0;
  160. for(i = 0; i < (m_nRow * m_nCol); i++)
  161. {
  162. m_map[i] = BLANK_STATE;
  163. }
  164. srand(time(NULL));
  165. CDWordArray tempMap;
  166. for (i = 0; i < (m_nRow * m_nCol) / 4; i++)
  167. {
  168. for (int j = 0; j < 4; j++)
  169. {
  170. tempMap.Add(i);
  171. }
  172. }
  173. for( i = 0; i < (m_nRow * m_nCol); i++)
  174. {
  175. int nIndex = (int (rand() * 0.1 + rand() * 0.01 + rand()))%tempMap.GetSize();
  176. m_map[i] = tempMap.GetAt(nIndex);
  177. tempMap.RemoveAt(nIndex);
  178. }
  179. Invalidate(TRUE);
  180. }
  181. BOOL CLLKDlg::IsLink(int x1, int y1, int x2, int y2)
  182. {
  183. if (x1 == x2)
  184. {
  185. if (X1_Link_X2(x1, y1, y2))
  186. {
  187. return TRUE;
  188. }
  189. }
  190. if (y1 == y2)
  191. {
  192. if (Y1_Link_Y2(x1, x2, y1))
  193. {
  194. return TRUE;
  195. }
  196. }
  197. if(OneCornerLink(x1, y1, x2, y2))
  198. {
  199. return TRUE;
  200. }
  201. if (TwoCornerLink(x1, y1, x2, y2))
  202. {
  203. return TRUE;
  204. }
  205. return FALSE;
  206. }
  207. BOOL CLLKDlg::X1_Link_X2(int x1, int y1, int y2)
  208. {
  209. int int_temp = 0;
  210. if ( y1 > y2)
  211. {
  212. int_temp = y1;
  213. y1 = y2;
  214. y2 = int_temp;
  215. }
  216. for (int i = y1 + 1; i <= y2; i++)
  217. {
  218. if (i == y2)
  219. {
  220. return TRUE;
  221. }
  222. if (m_map[i * m_nCol + x1] != BLANK_STATE)
  223. {
  224. break;
  225. }
  226. }
  227. if (XThrough(x1 - 1, y1, 0) &&XThrough(x1 - 1, y2, 0))
  228. {
  229. return TRUE;
  230. }
  231. if (XThrough(m_nCol- 1, y1, x1 + 1) &&XThrough(m_nCol - 1, y2, x1 + 1))
  232. {
  233. return TRUE;
  234. }
  235. return FALSE;
  236. }
  237. BOOL CLLKDlg::Y1_Link_Y2(int x1, int x2, int y1)
  238. {
  239. int int_temp = 0;
  240. if ( x1 > x2)
  241. {
  242. int_temp = x1;
  243. x1 = x2;
  244. x2 = int_temp;
  245. }
  246. for (int i = x1 + 1; i <= x2; i++)
  247. {
  248. if (i == x2)
  249. {
  250. return TRUE;
  251. }
  252. if (m_map[y1 * m_nCol + i] != BLANK_STATE)
  253. {
  254. break;
  255. }
  256. }
  257. if (YThrough(y1 - 1, x1, 0) &&YThrough(y1 - 1, x2, 0))
  258. {
  259. return TRUE;
  260. }
  261. if (YThrough(m_nRow - 1, x1, y1 + 1) &&YThrough(m_nRow - 1, x2, y1 + 1))
  262. {
  263. return TRUE;
  264. }
  265. return FALSE;
  266. }
  267. BOOL CLLKDlg::XThrough(int x, int y1, int temp  )
  268. {
  269. for (int i = x; i >= temp ; i--)
  270. {
  271. if (m_map[y1 * m_nCol + i] != BLANK_STATE)
  272. {
  273. break;
  274. }
  275. }
  276. if (i < temp)
  277. {
  278. return TRUE;
  279. }
  280. return FALSE;
  281. }
  282. BOOL CLLKDlg::YThrough(int y, int x1, int temp )
  283. {
  284. for (int i = y; i >= temp ; i--)
  285. {
  286. if (m_map[i * m_nCol + x1] != BLANK_STATE)
  287. {
  288. break;
  289. }
  290. }
  291. if (i < temp)
  292. {
  293. return TRUE;
  294. }
  295. return FALSE;
  296. }
  297. BOOL CLLKDlg::OneCornerLink(int x1, int y1, int x2, int y2)
  298. {
  299. int temp_x = 0;
  300. int temp_y = 0;
  301. if (x2 < x1)
  302. {
  303. temp_x = x2;
  304. x2 = x1;
  305. x1 = temp_x;
  306. temp_y = y1;
  307. y1 = y2;
  308. y2 = temp_y;
  309. }
  310. if (x2 > x1 && y2 < y1)
  311. {
  312. if(YThrough(y1 - 1, x1 ,y2)&&XThrough(x2 - 1, y2, x1))
  313. {
  314. return TRUE;
  315. }
  316. if(XThrough(x2, y1, x1 + 1)&&YThrough(y1, x2, y2 + 1))
  317. {
  318. return TRUE;
  319. }
  320. }
  321. if(x2 > x1 && y2 > y1)
  322. {
  323. if(YThrough(y2, x1, y1 + 1)&&XThrough(x2 - 1, y2, x1))
  324. {
  325. return TRUE;
  326. }
  327. if (XThrough(x2, y1, x1 + 1)&&YThrough(y2 - 1, x2, y1))
  328. {
  329. return TRUE;
  330. }
  331. }
  332. return FALSE;
  333. }
  334. BOOL CLLKDlg::TwoCornerLink(int x1, int y1, int x2, int y2)
  335. {
  336. int temp_x = 0;
  337. int temp_y = 0;
  338. int count = 0;
  339. int i = 0;
  340. if (x2 < x1)
  341. {
  342. temp_x = x2;
  343. x2 = x1;
  344. x1 = temp_x;
  345. temp_y = y1;
  346. y1 = y2;
  347. y2 = temp_y;
  348. }
  349.   
  350. if (x2 > x1 && y2 < y1)
  351. {
  352. count  = y1 - y2 - 1;
  353. if (YThrough(y1 - 1, x1 , 0) &&YThrough(y2 - 1, x2 , 0) )
  354. {
  355. return TRUE;
  356. }//向上
  357. if (YThrough(m_nRow - 1, x1 , y1 + 1) &&YThrough(m_nRow - 1, x2 , y2 + 1) )
  358. {
  359. return TRUE;
  360. }//向下
  361. if (XThrough(x1 - 1, y1, 0) && XThrough(x2 -1, y2, 0))
  362. {
  363. return TRUE;
  364. }//向左
  365. if (XThrough(m_nCol - 1, y1, x1 + 1) && XThrough(m_nCol -1, y2, x2 + 1))
  366. {
  367. return TRUE;
  368. }//向右
  369. for (int i = 1; i <= count; i++)
  370. {
  371. if(OneCornerLink(x1, y1 - i, x2, y2))
  372. {
  373. return TRUE;
  374. }
  375. }
  376. count = x2 -x1 -1;
  377. for (i = 1; i <= count; i++)
  378. {
  379. if(OneCornerLink(x1 + i, y1, x2, y2))
  380. {
  381. return TRUE;
  382. }
  383. }
  384. }
  385. if (x2 > x1 && y2 > y1)
  386. {
  387. count  = y2 - y1 - 1;
  388. for (i = 1; i <= count; i++)
  389. {
  390. if(OneCornerLink(x1, y1 + i, x2, y2))
  391. {
  392. return TRUE;
  393. }
  394. }
  395. count = x2 - x1 - 1;
  396. for (i = 1; i <= count; i++)
  397. {
  398. if(OneCornerLink(x1 + i, y1, x2, y2))
  399. {
  400. return TRUE;
  401. }
  402. }
  403. }
  404.     return FALSE;
  405. }
  406. BOOL CLLKDlg::IsWin()
  407. {
  408. for(int i = 0; i < m_nRow * m_nCol; i++)
  409. {
  410. if (m_map[i] != BLANK_STATE)
  411. {
  412. return FALSE;
  413. }
  414. }
  415. return TRUE;
  416. }
  417. void CLLKDlg::OnLButtonDown(UINT nFlags, CPoint point) 
  418. {
  419. // TODO: Add your message handler code here and/or call default
  420. int x = point.x/FRONTWIDTH + (point.x % FRONTWIDTH?1:0) - 1;
  421. int y = point.y/FRONTHEIGHT + (point.y % FRONTHEIGHT?1:0) - 1;
  422.     if (x < m_nCol && y < m_nRow && m_map[y * m_nCol + x] != BLANK_STATE)
  423.     {
  424. if (m_nX1 == BLANK_STATE)
  425. {
  426. m_nX1 = x;
  427. m_nY1 = y;
  428.     CDC* pDC = GetDC();
  429.     CPen pen;
  430. CPen *poldPen;
  431. pen.CreatePen(PS_SOLID, 4, RGB(255, 0, 0));
  432. poldPen = pDC->SelectObject(&pen);
  433. pDC->MoveTo(x * FRONTWIDTH, y * FRONTHEIGHT);
  434. pDC->LineTo(x * FRONTWIDTH, (y + 1) * FRONTHEIGHT );
  435. pDC->LineTo((x + 1) * FRONTWIDTH, (y + 1) * FRONTHEIGHT);
  436. pDC->LineTo((x + 1) * FRONTWIDTH, y * FRONTHEIGHT);
  437. pDC->LineTo(x * FRONTWIDTH, y * FRONTHEIGHT);
  438. pDC->SelectObject(poldPen);
  439. }
  440. else
  441. {
  442. if ((m_nX1 != x || m_nY1 != y)&&(m_map[m_nY1 * m_nCol + m_nX1] == m_map[y * m_nCol + x]))
  443. {
  444. if (IsLink(x, y, m_nX1, m_nY1))
  445. {
  446. m_map[m_nY1 * m_nCol + m_nX1] = BLANK_STATE;
  447. m_map[y *m_nCol + x] = BLANK_STATE;
  448. }
  449. }
  450. m_nX1 = BLANK_STATE;
  451. m_nY1 = BLANK_STATE;
  452. Invalidate(FALSE);
  453. }    
  454.     }
  455.    if (IsWin())
  456.    {
  457.    MessageBox("success.........");
  458.    StartNewGame();
  459.    }
  460. CDialog::OnLButtonDown(nFlags, point);
  461. }
  462. void CLLKDlg::DrawGame(CDC * pDC)
  463. {
  464. pDC->FillSolidRect(0 , 0, m_nCol * FRONTWIDTH + 5, m_nRow * FRONTHEIGHT + 5,BKCOLOR);
  465. for (int i = 0; i < m_nRow ;i ++)
  466. {
  467. for (int j = 0; j < m_nCol; j ++)
  468. {
  469. if (m_map[i * m_nCol + j] == BLANK_STATE)
  470. {
  471. continue;
  472. }
  473. pDC->BitBlt(j * FRONTWIDTH, i * FRONTHEIGHT, BKWIDTH, 
  474.         BKHEIGHT, &m_men3DBkDC, 0, BKHEIGHT, SRCCOPY);
  475. pDC->BitBlt(j * FRONTWIDTH,i * FRONTHEIGHT,
  476. FRONTWIDTH - 2, FRONTHEIGHT - 12,
  477. &m_menAnimalDC,
  478. FRONTWIDTH - 2, m_map[i * m_nCol + j] * (FRONTHEIGHT - 12),
  479. SRCAND);
  480. pDC->BitBlt(j * FRONTWIDTH, i * FRONTHEIGHT,
  481. FRONTWIDTH - 2, FRONTHEIGHT - 12,
  482. &m_menAnimalDC,
  483. 0, m_map[i * m_nCol + j] * (FRONTHEIGHT - 12),
  484. SRCPAINT);
  485. }
  486. }
  487. }