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

📄 boxman_edit.cpp

📁 这是用VC++编写的推箱子的游戏
💻 CPP
字号:
/*++

Copyright (c) AFE(Active-Free-Elegance)

Module Name:

    BoxMan_Edit.cpp

Abstract:

	the BoxMan-Edit operation-contain Class

Author:

    Weijian Luo (Arthur Luo)   15-Jun-2005

	E-mail: skybluehacker@yahoo.com.cn

Revision History:      1.0

--*/
#include "stdafx.h"
#include "BoxMan_Editer.h"
#include "BoxMan_Edit.h"

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


int MAP_WIDTH =                16;
int MAP_HEIGHT   =             14;
int MAP_SMALL_SQUARE_SIZE  =   20;

//地图状态
#define MAP_BACKGROUP  48  //'0'  对应字符'0'
#define MAP_WHITEWALL  49  //'1'
#define MAP_BLUEWALL   50  //'2'
#define MAP_BALL       51  //'3'
#define MAP_YELLOWBOX  52  //'4'
#define MAP_REDBOX     53  //'5'
#define MAP_MANWALL    54  //'6'
#define MAP_MANBALL    55  //'7'




//假宏定义
int MAX_MISSION_NUM  = 1;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBoxMan_Edit::CBoxMan_Edit()
{
	ClearMap();
	MAX_MISSION_NUM = LoadMaxMissionNum();
}

CBoxMan_Edit::~CBoxMan_Edit()
{

}


void CBoxMan_Edit::LoadMap(int iMissionNum)
{
    CString str;
    str.Format("[%d]", iMissionNum);

	FILE *pFile = fopen("map.info", "rb");
	if (pFile == NULL)
	{
        AfxMessageBox("载入地图文件失败");
        return;
	}

    char cTmp[20];
    fgets(cTmp, 20, pFile);
    while (strncmp(cTmp, str, 3) != 0)
    {
        fgets(cTmp, 20, pFile);
    }

    for (int i = 0; i < MAP_HEIGHT; i++)
        fgets(m_cMap[i], 20, pFile);

    fclose(pFile);
}

void CBoxMan_Edit::SaveMap(void)
{
    CString str;
    str.Format("[%d]", MAX_MISSION_NUM+1);
	
    //最大地图数已经在初始化时候获取

	//打开地图文件
	FILE *pFile = fopen("map.info", "a+t");
	if (pFile == NULL)
	{
        AfxMessageBox("打开地图文件失败");
        return;
	}
	//文件指针移到文件末
	fseek( pFile, 0L, SEEK_END);

	//写入体图头部
	fputs(str,pFile);
	fputs("\n",pFile);

	//写入地图数据体
	char strBuf[200];
    for (int i = 0; i < MAP_HEIGHT; i++)
	{
		memset(strBuf,0,sizeof(strBuf));
		memcpy(strBuf,m_cMap[i],MAP_WIDTH);
        fputs(strBuf, pFile);
		fputs("\n",pFile);

	}

	//关闭地图
    fclose(pFile);
	
	//最大地图数自增
	MAX_MISSION_NUM += 1;
}

int CBoxMan_Edit::LoadMaxMissionNum(void)
{
	int iMissionNum = 1;
    CString str;
    str.Format("[%d]", iMissionNum);
	
	FILE *pFile = fopen("map.info", "rb");
	if (pFile == NULL)
	{
        AfxMessageBox("载入地图文件失败");
        return -1;
	}
	
    char cTmp[20];
	while( !feof(pFile) )//not end of file
	{
		fgets(cTmp, 20, pFile);
		if(strncmp(cTmp, str, 3) == 0)
		{
		    str.Format("[%d]", ++iMissionNum);
		}
	}
    fclose(pFile);

	return iMissionNum-1;
}

CPoint CBoxMan_Edit::GetManPosition()
{
    CPoint manPosition(0, 0);
    for (int i = 0; i < MAP_HEIGHT; i++)
    {
        for (int j = 0; j < MAP_WIDTH; j++)
        {
            if (m_cMap[i][j]==MAP_MANWALL || m_cMap[i][j]==MAP_MANBALL)
            {
                manPosition.x = j;
                manPosition.y = i;
            }
        }
    }
    return manPosition;
}

void CBoxMan_Edit::DrawMap(CDC* pDC)
{
    int i, j, x, y;
    for (i = 0; i < MAP_HEIGHT; i++)
    {
        for (j = 0; j < MAP_WIDTH; j++)
        {// pDC->TextOut(j * 10, i * 15, m_cMap[i][j]);
            x = j * 20;
            y = i * 20;
            switch (m_cMap[i][j])
            {
            case MAP_BACKGROUP://0
                DrawBackGroup(x, y, pDC);
                break;
            case MAP_WHITEWALL://1
                DrawWhiteWall(x, y, pDC);
                break;
            case MAP_BLUEWALL://2
                DrawBlueWall(x, y, pDC);
                break;
            case MAP_BALL://3
                DrawBall(x, y, pDC);
                break;
            case MAP_YELLOWBOX://4
                DrawYellowBox(x, y, pDC);
                break;
            case MAP_REDBOX://5
                DrawRedBox(x, y, pDC);
                break;
            case MAP_MANWALL://6
                DrawManWall(x, y, pDC);
                break;
            case MAP_MANBALL://7
                DrawManBall(x, y, pDC);
                break;
            }
        }
    }
}

void CBoxMan_Edit::DrawBackGroup(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 0);
    pDC->FillSolidRect(x, y, 20, 20, clr);
}

void CBoxMan_Edit::DrawWhiteWall(int x, int y, CDC* pDC)
{
    COLORREF clr1 = RGB(255, 255, 255);
    COLORREF clr2 = RGB(48, 48, 48);
    COLORREF clr3 = RGB(192, 192, 192);
    pDC->FillSolidRect(x, y, 19, 19, clr1);
    pDC->FillSolidRect(x + 1, y + 1, 19, 19, clr2);
    pDC->FillSolidRect(x + 1, y + 1, 18, 18, clr3);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);
}

void CBoxMan_Edit::DrawBlueWall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);
}

void CBoxMan_Edit::DrawBall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);
    pDC->Ellipse(x, y, x + 20, y + 20);
    pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);
}

void CBoxMan_Edit::DrawYellowBox(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(255, 255, 0);
    pDC->FillSolidRect(x, y, 20, 20, clr);
    COLORREF clr2 = RGB(255, 192, 0);
    pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);
    COLORREF clr3 = RGB(0, 0, 0);
    pDC->SetPixel(x + 3, y + 3, clr3);
    pDC->SetPixel(x + 17, y + 3, clr3);
    pDC->SetPixel(x + 3, y + 17, clr3);
    pDC->SetPixel(x + 17, y + 17, clr3);
}

void CBoxMan_Edit::DrawRedBox(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(255, 255, 0);
    pDC->FillSolidRect(x, y, 20, 20, clr);
    COLORREF clr2 = RGB(255, 0, 0);
    pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);
    COLORREF clr3 = RGB(0, 0, 0);
    pDC->SetPixel(x + 3, y + 3, clr3);
    pDC->SetPixel(x + 17, y + 3, clr3);
    pDC->SetPixel(x + 3, y + 17, clr3);
    pDC->SetPixel(x + 17, y + 17, clr3);
}

void CBoxMan_Edit::DrawManWall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);                   //蓝色墙
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);

    pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头

    pDC->MoveTo(x + 2, y + 11);                      //人手
    pDC->LineTo(x + 18, y + 11);

    pDC->MoveTo(x + 10, y + 10);                     //人身体
    pDC->LineTo(x + 10, y + 12);

    pDC->MoveTo(x + 2, y + 20);                      //人脚
    pDC->LineTo(x + 10, y + 12);
    pDC->LineTo(x + 18, y +20);
}

void CBoxMan_Edit::DrawManBall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);                   //球
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);
    pDC->Ellipse(x, y, x + 20, y + 20);
    pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);

    pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头

    pDC->MoveTo(x + 2, y + 11);                      //人手
    pDC->LineTo(x + 18, y + 11);

    pDC->MoveTo(x + 10, y + 10);                     //人身体
    pDC->LineTo(x + 10, y + 12);

    pDC->MoveTo(x + 2, y + 20);                      //人脚
    pDC->LineTo(x + 10, y + 12);
    pDC->LineTo(x + 18, y +20);
}



void CBoxMan_Edit::UpdateMap(UINT nChar)
{
    int x1, y1, x2, y2, x3, y3;

    x1 = m_ptManPosition.x;
    y1 = m_ptManPosition.y;

    switch (nChar)
    {
    case VK_UP:
        x2 = x1;
        y2 = y1 - 1;
        x3 = x1;
        y3 = y1 - 2;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
    case VK_DOWN:
        x2 = x1;
        y2 = y1 + 1;
        x3 = x1;
        y3 = y1 + 2;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
    case VK_LEFT:
        x2 = x1 - 1;
        y2 = y1;
        x3 = x1 - 2;
        y3 = y1;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
    case VK_RIGHT:
        x2 = x1 + 1;
        y2 = y1;
        x3 = x1 + 2;
        y3 = y1;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
    case 82:  //R  replay this mission
    case 114: //r  replay this mission
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
        break;
    case 113:  //F2  play next mission
        m_iMissionNum = m_iMissionNum + 1;
        if (m_iMissionNum > MAX_MISSION_NUM)
            m_iMissionNum = 1;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
        break;
    case 112:  //F1  play forward mission

        m_iMissionNum = m_iMissionNum - 1;
        if (m_iMissionNum < 1)
            m_iMissionNum = MAX_MISSION_NUM;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
    }
}

void CBoxMan_Edit::UpdateMap(int x1, int y1, int x2, int y2, int x3, int y3)
{
    switch (m_cMap[y2][x2])
    {
    case MAP_BACKGROUP:           //wrong map
        AfxMessageBox("wrong map");
        break;
    case MAP_WHITEWALL:          //do nothing
        
        break;
    case MAP_BLUEWALL:           //can go
        m_cMap[y2][x2] = MAP_MANWALL;
        if (m_cMap[y1][x1] == MAP_MANWALL)
            m_cMap[y1][x1] = MAP_BLUEWALL;
        else if (m_cMap[y1][x1] == MAP_MANBALL)
            m_cMap[y1][x1] = MAP_BALL;
        m_ptManPosition.x = x2;
        m_ptManPosition.y = y2;

        break;

    case MAP_BALL:               //can go
        m_cMap[y2][x2] = MAP_MANBALL;
        if (m_cMap[y1][x1] == MAP_MANWALL)
            m_cMap[y1][x1] = MAP_BLUEWALL;
        else if (m_cMap[y1][x1] == MAP_MANBALL)
            m_cMap[y1][x1] = MAP_BALL;        
        m_ptManPosition.x = x2;
        m_ptManPosition.y = y2;

        break;

    case MAP_YELLOWBOX:          //under judge
        if (m_cMap[y3][x3] == MAP_BALL)   // can go
        {
            m_cMap[y3][x3] = MAP_REDBOX;
            m_cMap[y2][x2] = MAP_MANWALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;

        }
        else if (m_cMap[y3][x3] == MAP_BLUEWALL) //can go
        {
            m_cMap[y3][x3] = MAP_YELLOWBOX;
            m_cMap[y2][x2] = MAP_MANWALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;

        }
        break;

    case MAP_REDBOX:             //under judge
        if (m_cMap[y3][x3] == MAP_BALL)   // can go
        {
            m_cMap[y3][x3] = MAP_REDBOX;
            m_cMap[y2][x2] = MAP_MANBALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;

        }
        else if (m_cMap[y3][x3] == MAP_BLUEWALL) //can go
        {
            m_cMap[y3][x3] = MAP_YELLOWBOX;
            m_cMap[y2][x2] = MAP_MANBALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;

        }        
        break;

    case MAP_MANWALL:            //wrong map
        AfxMessageBox("wrong map");
        break;

    case MAP_MANBALL:            //wrong map
        AfxMessageBox("wrong map");
        break;
    }
}

bool CBoxMan_Edit::IsFinish()
{
    bool bFinish = true;
    for (int i = 0; i < MAP_HEIGHT; i++)
    {
        for (int j = 0; j < MAP_WIDTH; j++)
        {
            if (m_cMap[i][j] == MAP_BALL || m_cMap[i][j] == MAP_MANBALL)
                bFinish = false;
        }
    }
    return bFinish;
}

BOOL CBoxMan_Edit::ChangeMissionNum(int iNum)
{
	if((iNum>MAX_MISSION_NUM)||(iNum<1))
	{
		return FALSE;
	}
	else
	{
        m_iMissionNum = iNum;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
		return TRUE;
	}
}

int  CBoxMan_Edit::GetNowMissionNum(void)
{
	return m_iMissionNum;
}

void CBoxMan_Edit::ChangeMap(int x, int y, int iState)
{
            m_cMap[y][x] = iState;	
}

void CBoxMan_Edit::ClearMap(void)
{
	for(int x=0; x< MAP_WIDTH; x++)
		for(int y=0; y<MAP_HEIGHT; y++)
		{
            m_cMap[y][x] = MAP_BACKGROUP;	
		}
}


void CBoxMan_Edit::DrawMouseCursor(int x, int y, int iState, CDC *pDC)
{
	switch (iState)
	{
	case MAP_BACKGROUP://背景
		DrawBackGroup(x, y, pDC);
		break;
	case MAP_WHITEWALL://墙
		DrawWhiteWall(x, y, pDC);
		break;
	case MAP_BLUEWALL://通道
		DrawBlueWall(x, y, pDC);
		break;
	case MAP_BALL://目的地
		DrawBall(x, y, pDC);
		break;
	case MAP_YELLOWBOX://箱子
		DrawYellowBox(x, y, pDC);
		break;
	case MAP_REDBOX://箱子
		DrawRedBox(x, y, pDC);
		break;
	case MAP_MANWALL://人在目的地
		DrawManWall(x, y, pDC);
		break;
	case MAP_MANBALL://人在通道
		DrawManBall(x, y, pDC);
		break;
	}
}

⌨️ 快捷键说明

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