📄 snakeview.cpp
字号:
// 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 + -