MFC写贪吃蛇主文件代码(奇迹冬瓜)

来源:互联网 发布:sql怎么查询重复数据 编辑:程序博客网 时间:2024/06/02 10:29

因为第一次发博文的代码粘贴混乱,特此重新发一次

(一)游戏截图

(二)主要部分代码

// 贪吃蛇测试Dlg.cpp : 实现文件//#include "stdafx.h"#include "贪吃蛇测试.h"#include "贪吃蛇测试Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()// C贪吃蛇测试Dlg 对话框C贪吃蛇测试Dlg::C贪吃蛇测试Dlg(CWnd* pParent /*=NULL*/): CDialog(C贪吃蛇测试Dlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void C贪吃蛇测试Dlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(C贪吃蛇测试Dlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()// C贪吃蛇测试Dlg 消息处理程序BOOL C贪吃蛇测试Dlg::OnInitDialog(){CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码score=0;judge=0;direction=1;speed=200;    CWnd *pWnd=GetDlgItem(IDC_Test);    pWnd->SetWindowPos(NULL,200,40,360,280,NULL);    CreateThread(NULL,0,play,this,0,NULL);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void C贪吃蛇测试Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void C贪吃蛇测试Dlg::OnPaint(){CPaintDC dc(this);    CBitmap bmp;    bmp.LoadBitmap(IDB_BITMAP1);    CDC dcMemory;    dcMemory.CreateCompatibleDC(&dc);//创建内存dc    CBitmap *pOldBmp=dcMemory.SelectObject(&bmp);    CRect rect;    GetClientRect(rect);    dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY); CWnd *pWnd=GetDlgItem(IDC_Test);    CDC *pDC=pWnd->GetDC();    //DrawTransparentSquare();CBrush br(RGB(0,255,0));//创建背景色笔刷       pDC->SelectObject(&br);pDC->MoveTo(20,20);pDC->LineTo(20,260);pDC->MoveTo(20,260);pDC->LineTo(340,260);pDC->MoveTo(340,260);pDC->LineTo(340,20);pDC->MoveTo(340,20);pDC->LineTo(20,20);}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR C贪吃蛇测试Dlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void C贪吃蛇测试Dlg::DrawTransparentSquare(){CWnd *pWnd=GetDlgItem(IDC_Test);    CDC *pDC=pWnd->GetDC();CRect OldRect(200,40,600,400);    InvalidateRect(&OldRect,FALSE);UpdateWindow();CBrush br(RGB(0,255,0)),br1(RGB(255,255,0));for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(3==wall[i][j].Status){pDC->SelectObject(&br); pDC->Rectangle(wall[i][j].arr[0].x,wall[i][j].arr[0].y,wall[i][j].arr[1].x,wall[i][j].arr[1].y);}if(5==wall[i][j].Status){pDC->SelectObject(&br1);pDC->Rectangle(wall[i][j].arr[0].x,wall[i][j].arr[0].y,wall[i][j].arr[1].x,wall[i][j].arr[1].y);}}}br.DeleteObject();br1.DeleteObject();pWnd->ReleaseDC(pDC);}DWORD WINAPI play(LPVOID lpParam) {  C贪吃蛇测试Dlg *c=(C贪吃蛇测试Dlg*)lpParam;     // CWnd *pWnd=GetDlgItem(IDC_Test);  //pWnd->InvalidateRect();  c->InitData(); // c->ChageData(c->Sava,c->wall);  c->NextFoot(&c->next);  while(c->JudgeBoundary(c->next))  {  if(1==c->judge)  {  ::AfxMessageBox("暂停-恢复.");  }  c->judge=0;  c->ShowSpeed(); if(!c->JudgeFood())  {    c->RandFood();  }  c->DrawTransparentSquare();  if(c->JudgeCollision(c->next))      {  break;      }  else if(c->JudgeEatFood(c->next))  {  c->score+=10;  c->ShowScores();  if(50!=c->speed&&0==c->k%5)  {  c->speed-=30;  }  c->IncreaseLength();  }  else  {  c->move();  }  c->NextFoot(&c->next);  ::Sleep(c->speed);  } ::AfxMessageBox("游戏结束!");  return TRUE;}void C贪吃蛇测试Dlg::InitData(){k=1;for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){wall[i][j].arr[0].x=i*10;wall[i][j].arr[0].y=j*10;wall[i][j].arr[1].x=(i+1)*10;wall[i][j].arr[1].y=(j+1)*10;if((i>=1&&i<=34)&&(j>=1&&j<=26)){if(12==i&&(j>=16&&j<=18)){wall[i][j].Status=3;wall[i][j].Sort=k++;}else{wall[i][j].Status=1;wall[i][j].Sort=-1;}}else{wall[i][j].Status=2;wall[i][j].Sort=-1;}}}k-=1;}void C贪吃蛇测试Dlg::move(){for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(1==wall[i][j].Sort){switch(direction){   case 1:wall[i][j-1].Status=3;wall[i][j-1].Sort=0;break;   case 2:wall[i][j+1].Status=3;wall[i][j+1].Sort=0;break;   case 3:wall[i-1][j].Status=3;wall[i-1][j].Sort=0;break;   case 4:wall[i+1][j].Status=3;wall[i+1][j].Sort=0;break;}}}}for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(3==wall[i][j].Status){//wall[i][j-1].Status=3;wall[i][j].Sort++;}if(k+1==wall[i][j].Sort){wall[i][j].Status=1;wall[i][j].Sort=-1;}}}}int C贪吃蛇测试Dlg::JudgeBoundary(Data next)//OK{//::AfxMessageBox("pass");if(2==next.Status){::AfxMessageBox("撞墙\n╭(╯^╰)╮\n囧.");return 0;}return 1;}BOOL C贪吃蛇测试Dlg::PreTranslateMessage(MSG* pMsg){      if (pMsg-> message == WM_KEYDOWN) { if(pMsg-> wParam== VK_UP) { if(2!=direction) { direction=1; } } if(pMsg-> wParam== VK_DOWN) { if(1!=direction) { direction=2; } } if(pMsg-> wParam== VK_LEFT) { if(4!=direction) { direction=3; }     } if(pMsg-> wParam== VK_RIGHT) { if(3!=direction) { direction=4; } } if(pMsg->wParam=='A'||pMsg->wParam=='a') { judge=1; } }return CDialog::PreTranslateMessage(pMsg);}int C贪吃蛇测试Dlg::JudgeCollision(Data next){if(3==next.Status&&next.Sort>1){::AfxMessageBox("自残啦\n╭(╯^╰)╮\n囧.");return 1;}return 0;}void C贪吃蛇测试Dlg::RandFood(){CreateThread(NULL,0,Rand,this,0,NULL);}int C贪吃蛇测试Dlg::JudgeFood(){for(int i=0;i<36;i++){for(int j=0;j<28;j++){if(5==wall[i][j].Status){//::AfxMessageBox("有");return 1;}}}//::AfxMessageBox("没");return 0;}void C贪吃蛇测试Dlg::IncreaseLength(){for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(1==wall[i][j].Sort){switch(direction){   case 1:wall[i][j-1].Status=3;wall[i][j-1].Sort=0;break;   case 2:wall[i][j+1].Status=3;wall[i][j+1].Sort=0;break;   case 3:wall[i-1][j].Status=3;wall[i-1][j].Sort=0;break;   case 4:wall[i+1][j].Status=3;wall[i+1][j].Sort=0;break;}}}}for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(3==wall[i][j].Status){//wall[i][j-1].Status=3;wall[i][j].Sort++;}}}k++;}DWORD WINAPI Rand(LPVOID lpParam) {  C贪吃蛇测试Dlg *c=(C贪吃蛇测试Dlg*)lpParam; int i,j,flag=0;srand((unsigned)time(NULL));do{i=rand()%36;j=rand()%28;if(3==c->wall[i][j].Status||i<=1||i>=34||j<=1||j>=26){flag=1;}::Sleep(10);}while(1==flag);c->wall[i][j].Status=5;return 1;}void C贪吃蛇测试Dlg::ChageData(Data (*Sa)[28], Data (*Sb)[28]){for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){Sa[i][j]=Sb[i][j];}}}int C贪吃蛇测试Dlg::JudgeEatFood(Data next){if(5==next.Status){//::AfxMessageBox("OK2");return 1;}return 0;}void C贪吃蛇测试Dlg::NextFoot(Data *next)//OK{for(int i=0;i<36;i+=1){for(int j=0;j<28;j+=1){if(1==wall[i][j].Sort){switch(direction){   case 1:*next=wall[i][j-1];break;   case 2:*next=wall[i][j+1];break;   case 3:*next=wall[i-1][j];break;   case 4:*next=wall[i+1][j];break;}//CString str1,str2;//str1.Format("%d",next->Status);//::AfxMessageBox(str1);}}}}void C贪吃蛇测试Dlg::ShowScores(){CString as;as.Format("%d",score);GetDlgItem(IDC_EDIT1)->SetWindowText(as);}void C贪吃蛇测试Dlg::ShowSpeed(){CString as;as.Format("%d",speed);GetDlgItem(IDC_EDIT2)->SetWindowText(as);}


 

原创粉丝点击