C++实现贪吃蛇类

来源:互联网 发布:带点小黄的网络电影 编辑:程序博客网 时间:2024/05/16 19:29

希望对C++初学者了解OOP有一定的帮助,本人也是菜鸟欢迎批评指教。

废话少说,上代码:

#ifndef SNAKE_H_#define SNAKE_H_#include <deque>#include <iostream>#include "windows.h"#include <string>using namespace std;typedef struct{int xPos;int yPos;    int derect;//方向0、1、2、3依次表示左\右\上\下}MPOINT;//class _declspec(dllexport) snakeclass snake{public:MPOINT ptHead;MPOINT ptTail;public:deque<MPOINT> que;MPOINT GetHeadPt()const;MPOINT GetTailPt()const;private:int headDerect;int tailDerect;int length;bool IsMoving;void SetTailPos();//根据蛇头位置确定蛇尾位置public:snake();snake(MPOINT& pt,int& len);virtual ~snake();void AddLength(int& num);void SetMoveDerection(int& flag);bool StartMove();bool StopMove();bool IsSnakeMoving()const;MPOINT GetHeadPos()const;MPOINT GetTailPos()const;void ShowSnake()const;string GetPointDerection(const MPOINT& pt)const;//移动左边点pt,len为移动的距离,ret默认为true即移动方向与点的运动方向相同void MovePoint(MPOINT& pt,int len=1,bool ret=true);//unsigned int timerid;private:HANDLE hThread;};#endif;

由于是在控制台应用程序上试运行,就添加了一个线程函数:

#include "stdafx.h"#include "snake.h"#include "stdio.h"#include "conio.h"bool operator==(MPOINT& pt1,MPOINT& pt2){if((pt1.xPos==pt2.xPos)&&(pt1.yPos==pt2.yPos))return true;return false;}//int count=0;UINT timerid;UINT Thread(PVOID   pvoid)  {  snake* pSnake=(snake*)pvoid;    MSG   msg;      PeekMessage(&msg,   NULL,   WM_USER,   WM_USER,   PM_NOREMOVE);   timerid=SetTimer(NULL,111,500,NULL);     BOOL   bRet;      int   count   =0;      while(   (bRet   =   GetMessage(   &msg,   NULL,   0,   0   ))   !=   0)      {            if   (bRet   ==   -1)          {              //   handle   the   error   and   possibly   exit          }          else              if(msg.message==WM_TIMER)              {  if(pSnake->IsSnakeMoving()){//MessageBox(NULL,_T("FFT"),_T("ffff"),MB_YESNO);pSnake->MovePoint(pSnake->ptHead);//->GetHeadPos());pSnake->MovePoint(pSnake->ptTail);//GetTailPos());int count=pSnake->que.size();if(count){MPOINT pt=pSnake->que.at(count-1);if(pSnake->GetTailPos()==pt)pSnake->que.pop_back();}}cout<<endl;pSnake->ShowSnake();//else//KillTimer(NULL,timerid);            }              else              {                  TranslateMessage(&msg);                    DispatchMessage(&msg);                }      }  
    return   0;  }   //////////////////////////////////////////////////////////////////////////////////////////////////snake::snake()//默认构造函数:hThread(NULL){ptHead.xPos=ptHead.yPos=100;ptHead.derect=0;length=4;IsMoving=false;SetTailPos();//DWORD   dwThreadId;       //hThread=CreateThread(NULL,0,Thread,0,0,&dwThreadId);hThread=AfxBeginThread(Thread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);}snake::snake(MPOINT &pt, int &len):hThread(NULL),IsMoving(false){ptHead=pt;length=len;SetTailPos();hThread=AfxBeginThread(Thread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);//DWORD   dwThreadId;      // hThread=CreateThread(NULL,0,Thread,0,0,&dwThreadId);}snake::~snake(){if(hThread!=NULL){//CloseHandle(hThread);DWORD dwCode;GetExitCodeThread(hThread,&dwCode);if(dwCode==STILL_ACTIVE){TerminateThread(hThread,dwCode);CloseHandle(hThread);hThread=NULL;}cout<<"成功调用析构函数,结束了线程"<<endl;}}void snake::MovePoint(MPOINT& pt,int len,bool ret){int dir=pt.derect;switch(dir){case 0:if(ret)pt.xPos-=len;elsept.xPos+=len;break;case 1:if(ret)pt.xPos+=len;elsept.xPos-=len;break;case 2:if(ret)pt.yPos-=len;elsept.yPos+=len;break;case 3:if(ret)pt.yPos+=len;elsept.yPos-=len;break;default:break;}}void snake::AddLength(int& num){this->MovePoint(ptTail,num,false);}void snake::SetMoveDerection(int& flag){int n;n=flag%4;ptTail.derect=n;que.push_front(ptHead);}bool snake::StartMove(){if(IsMoving){cout<<"贪吃蛇正在移动……"<<endl;return false;}IsMoving=true;//SetTimer(NULL,1,1000,NULL); //timerid=SetTimer(NULL,111,3000,NULL);/*cout<<"线程"<<endl;while(IsMoving){MovePoint(ptHead);MovePoint(ptTail);int count=que.size();if(count){MPOINT pt=que.at(count-1);if(ptTail==pt)que.pop_back();}}*/return true;}bool snake::StopMove(){cout<<"=======================================================================\n";cout<<"开始结束线程……"<<endl;if(!IsMoving){cout<<"贪吃蛇已经停止移动了"<<endl;return false;}IsMoving=false;cout<<"贪吃蛇停止移动"<<endl;return true;}void snake::SetTailPos(){ptTail=ptHead;MovePoint(ptTail,length,false);}MPOINT snake::GetHeadPt()const{return ptHead;}MPOINT snake::GetTailPt()const{return ptTail;}bool snake::IsSnakeMoving()const{if(IsMoving)return true;return false;}MPOINT snake::GetHeadPos()const{return ptHead;}MPOINT snake::GetTailPos()const{return ptTail;}void snake::ShowSnake()const{cout<<"蛇头当前位置为:("<<ptHead.xPos<<","<<ptHead.yPos<<")"<<this->GetPointDerection(ptHead)<<endl;cout<<"蛇尾当前位置为:("<<ptTail.xPos<<","<<ptTail.yPos<<")"<<this->GetPointDerection(ptTail)<<endl;}string snake::GetPointDerection(const MPOINT &pt) const{string str;switch(pt.derect){case 0:str="方向向左";break;case 1:str="方向向右";break;case 2:str="方向向上";break;case 3:str="相方向下";break;}return str;}

如果需要实现贪吃蛇游戏的话,可以用MFC做个框架,然后添加这两个文件,对相应的键盘按键进行处理,输赢处理……

也是很容易的。

原创粉丝点击