jds_snakeView.cpp
上传用户:ywxcgood
上传日期:2022-06-03
资源大小:1959k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. // jds_snakeView.cpp : implementation of the CJds_snakeView class
  2. //
  3. #include "stdafx.h"
  4. #include "jds_snake.h"
  5. #include "jds_snakeDoc.h"
  6. #include "jds_snakeView.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CJds_snakeView
  15. IMPLEMENT_DYNCREATE(CJds_snakeView, CView)
  16. BEGIN_MESSAGE_MAP(CJds_snakeView, CView)
  17. //{{AFX_MSG_MAP(CJds_snakeView)
  18. ON_WM_TIMER()
  19. ON_WM_CREATE()
  20. ON_WM_KEYDOWN()
  21. ON_COMMAND(ID_DIFFICULTY_EASY, OnDifficultyEasy)
  22. ON_COMMAND(ID_DIFFICULTY_HARD, OnDifficultyHard)
  23. ON_COMMAND(ID_DIFFICULTY_NORMAL, OnDifficultyNormal)
  24. ON_COMMAND(ID_DIFFICULTY_VERYHARD, OnDifficultyVeryhard)
  25. ON_COMMAND(ID_BUTTON_START, OnButtonStart)
  26. //}}AFX_MSG_MAP
  27. // Standard printing commands
  28. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  29. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  30. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CJds_snakeView construction/destruction
  34. CJds_snakeView::CJds_snakeView()
  35. {
  36. // TODO: add construction code here
  37. start=0;
  38. difficulty=10;
  39. count=4;
  40. }
  41. CJds_snakeView::~CJds_snakeView()
  42. {
  43. }
  44. BOOL CJds_snakeView::PreCreateWindow(CREATESTRUCT& cs)
  45. {
  46. // TODO: Modify the Window class or styles here by modifying
  47. //  the CREATESTRUCT cs
  48. return CView::PreCreateWindow(cs);
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CJds_snakeView drawing
  52. void CJds_snakeView::OnDraw(CDC* pDC)
  53. {
  54. CJds_snakeDoc* pDoc = GetDocument();
  55. ASSERT_VALID(pDoc);
  56. // TODO: add draw code for native data here
  57. }
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CJds_snakeView printing
  60. BOOL CJds_snakeView::OnPreparePrinting(CPrintInfo* pInfo)
  61. {
  62. // default preparation
  63. return DoPreparePrinting(pInfo);
  64. }
  65. void CJds_snakeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  66. {
  67. // TODO: add extra initialization before printing
  68. }
  69. void CJds_snakeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  70. {
  71. // TODO: add cleanup after printing
  72. }
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CJds_snakeView diagnostics
  75. #ifdef _DEBUG
  76. void CJds_snakeView::AssertValid() const
  77. {
  78. CView::AssertValid();
  79. }
  80. void CJds_snakeView::Dump(CDumpContext& dc) const
  81. {
  82. CView::Dump(dc);
  83. }
  84. CJds_snakeDoc* CJds_snakeView::GetDocument() // non-debug version is inline
  85. {
  86. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJds_snakeDoc)));
  87. return (CJds_snakeDoc*)m_pDocument;
  88. }
  89. #endif //_DEBUG
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CJds_snakeView message handlers
  92. void CJds_snakeView::OnTimer(UINT nIDEvent) 
  93. {
  94. // TODO: Add your message handler code here and/or call default
  95. KillTimer(1);
  96. CString str_count;
  97. str_count.Format("分数:%d",count-4);
  98. aliveordie(); //生死判官
  99. CDC* pDC=GetDC();
  100. CDC MemDC;
  101. CBitmap MemBitmap;
  102. MemDC.CreateCompatibleDC(NULL); 
  103. MemBitmap.CreateCompatibleBitmap(pDC,1000,1000); 
  104. CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); 
  105. MemDC.FillSolidRect(0,0,1000,1000,RGB(255,255,255)); 
  106. MemDC.TextOut(500,200,str_count);
  107. MemDC.Rectangle(CRect(10,10,440,440));
  108. MemDC.Rectangle(CRect(20,20,430,430));
  109. if (start==1)
  110. {
  111. b.x=a[0].x;
  112. b.y=a[0].y;
  113. if (aspect==0)
  114. {
  115. a[0].x=a[0].x+10;
  116. } else if (aspect==1)
  117. {
  118. a[0].y=a[0].y+10;
  119. }else if (aspect==2)
  120. {
  121. a[0].x=a[0].x-10;
  122. }else if (aspect==3)
  123. {
  124. a[0].y=a[0].y-10;
  125. }
  126. for (int i=1;i<count-1;i++)
  127. {
  128. a[count-i].x=a[count-i-1].x;
  129. a[count-i].y=a[count-i-1].y;
  130. }
  131. a[1].x=b.x;
  132. a[1].y=b.y;
  133. CBrush head(RGB(255,0,0));
  134. MemDC.SelectObject(head);
  135. rct=new CRect(a[0].x,a[0].y,a[0].x+10,a[0].y+10);
  136. MemDC.Rectangle(rct);
  137. for(i=1;i<count;i++)
  138. {
  139. CBrush body(RGB(255,255,0));
  140. MemDC.SelectObject(body);
  141. rct=new CRect(a[i].x,a[i].y,a[i].x+10,a[i].y+10);
  142. MemDC.Rectangle(rct);
  143. MemDC.SelectStockObject(BLACK_BRUSH);
  144. }
  145. if (a[0].x==xx && a[0].y==yy)
  146. {
  147. can_new=1;
  148. count++;
  149. a[count-1].x=a[count-2].x;
  150. a[count-1].y=a[count-2].y;
  151. // MessageBox("eat");
  152. }
  153. if (can_new==1)
  154. {
  155. int px=int(random(2,42));
  156. int py=int(random(2,42));
  157. xx=px*10;
  158. yy=px*10;
  159. for (int i=0;i<count;i++)
  160. {
  161. while (xx==a[i].x && yy==a[i].y)
  162. {
  163. int px=int(random(2,42));
  164. int py=int(random(2,42));
  165. xx=px*10;
  166. yy=px*10;
  167. }
  168. }
  169. can_new=0;
  170. }
  171. CBrush foot(RGB(0,255,0));
  172. MemDC.SelectObject(foot);
  173. MemDC.Rectangle(xx,yy,xx+10,yy+10);
  174. MemDC.SelectStockObject(BLACK_BRUSH);
  175. }
  176. pDC->BitBlt(0,0,1000,1000,&MemDC,0,0,SRCCOPY); 
  177. MemBitmap.DeleteObject(); 
  178. MemDC.DeleteDC(); 
  179. OnDraw(pDC);
  180. int m_timer=SetTimer(1,difficulty*30,NULL);
  181. CView::OnTimer(nIDEvent);
  182. }
  183. int CJds_snakeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  184. {
  185. if (CView::OnCreate(lpCreateStruct) == -1)
  186. return -1;
  187. // TODO: Add your specialized creation code here
  188. /*
  189. CString str;
  190. str.Format("%d",difficulty);
  191. MessageBox(str);
  192. */
  193. SetTimer(1,10,NULL);
  194. srand(unsigned(time(0)));
  195. return 0;
  196. }
  197. void CJds_snakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  198. {
  199. // TODO: Add your message handler code here and/or call default
  200. last_aspect=aspect;
  201. if (nChar==37 && last_aspect!=0)
  202. {
  203. aspect=2;
  204. }else if (nChar==38 && last_aspect!=1)
  205. {
  206. aspect=3;
  207. }else if (nChar==39 && last_aspect!=2)
  208. {
  209. aspect=0;
  210. }else if (nChar==40 && last_aspect!=3)
  211. {
  212. aspect=1;
  213. }
  214. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  215. }
  216. double CJds_snakeView::random(double start, double end)
  217. {
  218. return start+(end-start)*rand()/(RAND_MAX + 1.0);
  219. }
  220. void CJds_snakeView::aliveordie()
  221. {
  222. for (int i=1;i<count;i++)
  223. {
  224. if (a[0].x==a[i].x && a[0].y==a[i].y)
  225. {
  226. start=0;
  227. }
  228. else if (a[0].x<20 || a[0].x>420 ||a[0].y<20 ||a[0].y>420)
  229. {
  230. start=0;
  231. }
  232. }
  233. }
  234. void CJds_snakeView::Init()
  235. {
  236. aspect=0;
  237. last_aspect=0;
  238. count=4;
  239. can_new=1;
  240. a[0].x=90;
  241. a[0].y=80;
  242. a[1].x=80;
  243. a[1].y=80;
  244. a[2].x=70;
  245. a[2].y=80;
  246. a[3].x=60;
  247. a[3].y=80;
  248. }
  249. void CJds_snakeView::OnDifficultyEasy() 
  250. {
  251. // TODO: Add your command handler code here
  252. difficulty=10;
  253. CString str;
  254. str.Format("%d",difficulty);
  255. // MessageBox(str);
  256. }
  257. void CJds_snakeView::OnDifficultyHard() 
  258. {
  259. // TODO: Add your command handler code here
  260. difficulty=3;
  261. }
  262. void CJds_snakeView::OnDifficultyNormal() 
  263. {
  264. // TODO: Add your command handler code here
  265. difficulty=6;
  266. CString str;
  267. str.Format("%d",difficulty);
  268. // MessageBox(str);
  269. }
  270. void CJds_snakeView::OnDifficultyVeryhard() 
  271. {
  272. // TODO: Add your command handler code here
  273. difficulty=2;
  274. CString str;
  275. str.Format("%d",difficulty);
  276. // MessageBox(str);
  277. }
  278. void CJds_snakeView::OnButtonStart() 
  279. {
  280. // TODO: Add your command handler code here
  281. start=1;
  282. Init();
  283. }