⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snakeview.cpp

📁 一个在Pocket PC上运行的贪食蛇游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SnakeView.cpp : implementation of the CSnakeView class
//

#include "stdafx.h"
#include "Snake.h"
#include "MainFrm.h"
#include "SnakeDoc.h"
#include "SnakeView.h"
#include "InstructionDlg.h"
#include "SettingsDlg.h"
#include "PlayerInfoDlg.h"
#include "SnakeModel.h"
#include "PlayerHistoryDlg.h"
#include "wcedb.h"
#include "GameOverDlg.h"
#include "LevelUpDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

struct Setting_Parameters
{
	int mode;
	int level;
	int mazes;
}Settings;

CCeDBDatabase m_DBPlayer;
CCeDBProp m_pSortProp[2];
const WORD PROP_NAME=100,
		   PROP_SCORE=101;

struct Play_Parameters
{
	POINT body[MAXLEN];
	POINT food;
	POINT extFood;
	POINT stone;
	POINT movFood;

	bool matrix[MAX][MAX];
	bool canChangeDirection;
	int snakeLan;
    int direction;                          
    int score; 
	int numFood;
	int speed;
	int extModeLevel;
	int mfDirection;
	int efType;
	int step;

	bool haveSaved;
}Savings;

/////////////////////////////////////////////////////////////////////////////
// CSnakeView

IMPLEMENT_DYNCREATE(CSnakeView, CFormView)

BEGIN_MESSAGE_MAP(CSnakeView, CFormView)
	//{{AFX_MSG_MAP(CSnakeView)
	ON_WM_TIMER()
	ON_COMMAND(ID_APP_INSTRUCTION, OnAppInstruction)
	ON_COMMAND(ID_GAME_CONTINUE, OnGameContinue)
	ON_COMMAND(ID_GAME_NEW, OnGameNew)
	ON_COMMAND(ID_GAME_PAUSE, OnGamePause)
	ON_COMMAND(ID_GAME_SET, OnGameSet)
	ON_BN_CLICKED(IDC_BUTTON_UP, OnButtonUp)
	ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)
	ON_BN_CLICKED(IDC_BUTTON_DOWN, OnButtonDown)
	ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
	ON_COMMAND(ID_APP_HISTORY, OnAppHistory)
	ON_UPDATE_COMMAND_UI(ID_GAME_PAUSE, OnUpdateGamePause)
	ON_UPDATE_COMMAND_UI(ID_GAME_CONTINUE, OnUpdateGameContinue)
	ON_BN_CLICKED(IDC_BUTTON_TONGUE, OnButtonTongue)
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

void CSnakeView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSnakeView)
	DDX_Text(pDX, IDC_SCORE, m_diplayScore);
	//}}AFX_DATA_MAP
}

BOOL CSnakeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSnakeView diagnostics

#ifdef _DEBUG
void CSnakeView::AssertValid() const
{
	CFormView::AssertValid();
}

void CSnakeView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CSnakeDoc* CSnakeView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSnakeDoc)));
	return (CSnakeDoc*)m_pDocument;
}
#endif //_DEBUG



/////////////////////////////////////////////////////////////////////////////
// CSnakeView construction/destruction

CSnakeView::CSnakeView()
	: CFormView(CSnakeView::IDD)
{
	//{{AFX_DATA_INIT(CSnakeView)
	m_diplayScore = _T("");
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	snake=new CSnakeModel();
	if(snake==NULL)
	{
		AfxMessageBox(_T("Can not create model. exit!"));
		SendMessage(WM_CLOSE);
	}

	isRunning=false;
	isPaused=false;
	begining=true;
	slowOrFast=false;

	blackBrush.CreateSolidBrush(RGB(0,0,0));
	rect.left=FRMWIDTH;
	rect.top=FRMHEIGHT;
	rect.right=MAX*BODYWIDTH+FRMWIDTH;
	rect.bottom=MAX*BODYWIDTH+FRMHEIGHT;
	
	snakeTail.x=-1;
	snakeTail.y=-1;
	extFood.x=-1;
	extFood.y=-1;
	stone.x=-1;
	stone.y=-1;
	movFood.x=-1;
	movFood.y=-1;

	food.x=-1;
	food.y=-1;

	Read();	

	if(Savings.haveSaved)
	{
		snake->food.x=Savings.food.x;
		snake->food.y=Savings.food.y;

		snake->extFood.x=Savings.extFood.x;
		snake->extFood.y=Savings.extFood.y;

		snake->stone.x=Savings.stone.x;
		snake->stone.y=Savings.stone.y;

		snake->movFood.x=Savings.movFood.x;
		snake->movFood.y=Savings.movFood.y;

		for(int i=0;i<MAXLEN;i++)
		{
			snake->body[i].x=Savings.body[i].x;
			snake->body[i].y=Savings.body[i].y;
		}
	
		for(int j=0;j<MAX;j++)
			for(int k=0;k<MAX;k++)
			{
				snake->matrix[j][k]=Savings.matrix[j][k];
			}

		snake->canChangeDirection=Savings.canChangeDirection;
	    snake->snakeLan=Savings.snakeLan;
	    snake->direction=Savings.direction;                          
		snake->score=Savings.score; 
		snake->numFood=Savings.numFood;
		snake->speed=Savings.speed;	
		snake->extModeLevel=Savings.extModeLevel;
		snake->mfDirection=Savings.mfDirection;
		snake->efType=Savings.efType;
		snake->step=Savings.step;
	}
	else
	{
		snake->reset();
	}

	m_nStartSpeed=snake->speed;
}

CSnakeView::~CSnakeView()
{
	Write();
	m_DBPlayer.Close();
	delete snake;
}

// CSnakeView message handlers

void CSnakeView::OnAppInstruction() 
{
	// TODO: Add your command handler code here
	if(isRunning)
	{
		OnGamePause();
		CInstructionDlg instructionDlg;
		instructionDlg.DoModal();
		OnGameContinue();
	}
	else
	{
		CInstructionDlg instructionDlg;
		instructionDlg.DoModal();
	}
}

void CSnakeView::OnGameContinue() 
{
	// TODO: Add your command handler code here
	if(Savings.haveSaved)
	{
		Savings.haveSaved=false;

		if(begining)
		{
			begining=false;
		}

		Invalidate();

		m_nStartSpeed=snake->speed;
		SetTimer(1,m_nStartSpeed,NULL);
	}
	else
	{
		SetTimer(1,m_nStartSpeed,NULL);
	}

	if(!isRunning)
	{
		isRunning=true;
	}
	if(isPaused)
	{
		isPaused=false;
	}

	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_TONGUE)->EnableWindow(1);
}

void CSnakeView::OnGameNew() 
{
	
	// TODO: Add your command handler code here
	Savings.haveSaved=false;

	if(begining)
	{
		begining=false;
	}

	if(isPaused)
	{
		isPaused=false;
	}

	snake->reset();
	Invalidate();

	m_nStartSpeed=snake->speed;
	SetTimer(1,m_nStartSpeed,NULL);

	if(!isRunning)
	{
		isRunning=true;
	}

	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_TONGUE)->EnableWindow(1);	
}

void CSnakeView::OnGamePause() 
{
	// TODO: Add your command handler code here
	KillTimer(1);
	slowOrFast=false;

	if(isRunning)
	{
		isRunning=false;
	}
	if(!isPaused)
	{
		isPaused=true;
	}
	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_TONGUE)->EnableWindow(0);
}

void CSnakeView::OnGameSet() 
{
	// TODO: Add your command handler code here
	if(isRunning)
	{
		OnGamePause();
		CSettingsDlg settingsDlg;
		settingsDlg.DoModal();
		OnGameContinue();
	}
	else
	{
		CSettingsDlg settingsDlg;
		settingsDlg.DoModal();
	}
}

void CSnakeView::OnAppHistory() 
{
	// TODO: Add your command handler code here
	if(isRunning)
	{
		OnGamePause();
		CPlayerHistoryDlg historyDlg;
		historyDlg.DoModal();
		OnGameContinue(); 
	}
	else
	{
		CPlayerHistoryDlg historyDlg;
		historyDlg.DoModal();
	}
}

void CSnakeView::OnButtonUp() 
{
	// TODO: Add your control notification handler code here
	if(snake->canChangeDirection)
	{
		snake->changeDirection(UP);
		snake->canChangeDirection=false;
	}
}

void CSnakeView::OnButtonRight() 
{
	// TODO: Add your control notification handler code here
	if(snake->canChangeDirection)
	{
		snake->changeDirection(RIGHT);
		snake->canChangeDirection=false;
	}
}

void CSnakeView::OnButtonDown() 
{
	// TODO: Add your control notification handler code here
	if(snake->canChangeDirection)
	{
		snake->changeDirection(DOWN);
		snake->canChangeDirection=false;
	}
}

void CSnakeView::OnButtonLeft() 
{
	// TODO: Add your control notification handler code here
	if(snake->canChangeDirection)
	{
		snake->changeDirection(LEFT);
		snake->canChangeDirection=false;
	}
}

void CSnakeView::OnButtonTongue() 
{
	// TODO: Add your control notification handler code here
	snake->hasTongue=true;
	hasTongue=true;
}

void CSnakeView::OnUpdateGamePause(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(isRunning)
	{
		pCmdUI->Enable(true);
	}
	else
	{
		pCmdUI->Enable(false);
	}
}

void CSnakeView::OnUpdateGameContinue(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if((!isRunning)&&Savings.haveSaved)
	{
		pCmdUI->Enable(true);
	}
	else if((!isRunning)&&isPaused)
	{
		pCmdUI->Enable(true);
	}
	else
	{
		pCmdUI->Enable(false);
	}
}

void CSnakeView::OnTimer(UINT nIDEvent) 
{
	CDC *pDC=GetDC();
	int status;	

	snakeTail.x=snake->body[snake->snakeLan-1].x;
	snakeTail.y=snake->body[snake->snakeLan-1].y;

	extFood.x=snake->extFood.x;
	extFood.y=snake->extFood.y;

	stone.x=snake->stone.x;
	stone.y=snake->stone.y;

	movFood.x=snake->movFood.x;
	movFood.y=snake->movFood.y;

	food.x=snake->food.x;
	food.y=snake->food.y;

	step=snake->step;

	status=snake->moveOn();

	if(status==0)
	{
		KillTimer(1);
		if(isRunning)
		{
			isRunning=false;
		}

		CGameOverDlg gameOverDlg;
		gameOverDlg.DoModal();

		//记录对话框(记录玩家信息)
		AppendRecord();

		if(!begining)
		{
			begining=true;
		}

		GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(0);
		GetDlgItem(IDC_BUTTON_UP)->EnableWindow(0);
		GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(0);
		GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(0);
		GetDlgItem(IDC_BUTTON_TONGUE)->EnableWindow(0);
	}
	else if(status==1)
	{
		if(food.x!=snake->food.x||food.y!=snake->food.y)
		{
			erase(pDC,food);
		}

		if(movFood.x!=-1&&movFood.y!=-1)
		{
			erase(pDC,movFood);
		}

		if(extFood.x!=snake->extFood.x&&extFood.y!=snake->extFood.y
			&&extFood.x!=-1&&extFood.y!=-1)
		{
			erase(pDC,extFood);
		}

		if(stone.x!=snake->stone.x&&stone.y!=snake->stone.y
			&&stone.x!=-1&&stone.y!=-1)
		{
			erase(pDC,stone);
		}

		if(snake->step==0&&step!=0)
		{
			KillTimer(1);			
			SetTimer(1,m_nStartSpeed,NULL);

			slowOrFast=false;
		}

		paintScore();
		paint(pDC,status);

		if(hasTongue)
		{
			hasTongue=false;
			paintTongue(pDC);
		}

		if(!snake->canChangeDirection)
		{
			snake->canChangeDirection=true;
		}
	}
	else if(status==2)
	{
		if(movFood.x!=-1&&movFood.y!=-1)
		{
			erase(pDC,movFood);
		}

		paintScore();
		paint(pDC,status);
		erase(pDC,snakeTail);

		if(hasTongue)
		{
			hasTongue=false;
			paintTongue(pDC);
		}

		if(!snake->canChangeDirection)
		{
			snake->canChangeDirection=true;
		}

		if(snake->step!=0)
		{
			if(!slowOrFast)
			{
				slowOrFast=true;

				KillTimer(1);		

				if(snake->step<0)
				{
					SetTimer(1,1000,NULL);
				}
				else
				{
					SetTimer(1,100,NULL);
				}
			}
		}

		if(snake->step==0&&step!=0)
		{
			KillTimer(1);			
			SetTimer(1,m_nStartSpeed,NULL);

			slowOrFast=false;
		}
	}
	else if(status==3)
	{
		paintScore();
		paint(pDC,status);

		if(hasTongue)
		{
			hasTongue=false;
			paintTongue(pDC);
		}
		
		snake->levelUp();

		if(!snake->canChangeDirection)
		{
			snake->canChangeDirection=true;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -