C++实现贪吃蛇类

希望对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做个框架,然后添加这两个文件,对相应的键盘按键进行处理,输赢处理……

也是很容易的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值