希望对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) snake
class 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;
else
pt.xPos+=len;
break;
case 1:
if(ret)
pt.xPos+=len;
else
pt.xPos-=len;
break;
case 2:
if(ret)
pt.yPos-=len;
else
pt.yPos+=len;
break;
case 3:
if(ret)
pt.yPos+=len;
else
pt.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做个框架,然后添加这两个文件,对相应的键盘按键进行处理,输赢处理……
也是很容易的。