史上最简单的推箱子(C++版)

#include "stdafx.h"
#include "sokoban.h"
#include "gameDlg.h"
extern CgameDlg *mainDlg;

sokoban *pThis;

int levelArr[6][8] = {
    { 1, 1, 1, 1, 0, 0, 0, 0 },
    { 1, 0, 0, 1, 1, 1, 1, 1 },
    { 1, 0, 2, 0, 0, 3, 0, 1 },
    { 1, 0, 3, 0, 0, 2, 4, 1 },
    { 1, 1, 1, 0, 0, 1, 1, 1 },
    { 0, 0, 1, 1, 1, 1, 0, 0 }
};

sokoban::sokoban()
{
    pThis = this;
}


sokoban::~sokoban()
{
}

struct xSleepObj
{
    int duration;
    HANDLE evenHandle;
};

DWORD WINAPI xSleepThread(LPVOID pWaitTime)
{
    xSleepObj *sleep = (xSleepObj*)pWaitTime;


    Sleep(sleep->duration);
    SetEvent(sleep->evenHandle);


    return 0;
}
// 非阻塞延时
void xSleep(int nWaitInMsecs)
{
    xSleepObj sleep;
    sleep.duration = nWaitInMsecs;
    sleep.evenHandle = CreateEvent(NULL, TRUE, FALSE, NULL);

    DWORD dwThreadId;
    CreateThread(NULL, 0, &xSleepThread, &sleep, 0, &dwThreadId);


    MSG msg;
    while (::WaitForSingleObject(sleep.evenHandle, 0) == WAIT_TIMEOUT)
    {
        // get and dispatch message
        if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
    CloseHandle(sleep.evenHandle);
}

int sokoban::start(){
    
    curRow = 0;
    curCol = 0;
    directPos.x = 0;
    directPos.y = 0;
    
    m_hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc, (LPVOID)this, 0, NULL);

    return 0;
}


DWORD WINAPI sokoban::threadProc(LPVOID lpParam) {

    //sokoban *pThis = (sokoban*)lpParam;
    xSleep(500);    
    pThis->drawMap();
    return 0;
}

int sokoban::drawMap() {
    mainDlg->drawMap(levelArr);
    return 0;
}


void sokoban::moveLeft(){
    TRACE("moveLeft\n");
    canMove(0, -1);
}


void sokoban::moveRight(){
    TRACE("moveRight\n");
    canMove(0, 1);
    
}


void sokoban::moveUp(){
    TRACE("moveUp\n");
    canMove(-1, 0);
    
}


void sokoban::moveDown(){
    TRACE("moveDown\n");
    canMove(1, 0);
    
}

BOOL sokoban::canMove(int row, int col){

    if (isWalkable(pThis->curRow + row, pThis->curCol + col)){
        moveMan(row, col);
        drawMap();
    }else {
        if (isBox((pThis->curRow + row),(pThis->curCol + col))) {
            if (isWalkable((pThis->curRow + 2 * row), (pThis->curCol + 2 * col))) {
                moveBox((pThis->curRow + row), (pThis->curCol + col), row, col);
                moveMan(row, col);
                drawMap();
            }
        }
    }

    
    return TRUE;
}

BOOL sokoban::isWalkable(int row, int col){

    if (levelArr[row][col] % 2 == 0){
        return TRUE;    
    }
    else{
        return FALSE;
    }
    
}

//如果该行列位置被箱子(3,5)所占
BOOL sokoban::isBox(int row, int col){
    int num= levelArr[row][col];
    if (num % 2 == 1 && num > 1){
        return TRUE;
    }
    else{
        return FALSE;
    }
}

void sokoban::moveMan(int row, int col){
    levelArr[curRow + row][curCol + col] += 4;
    levelArr[curRow][curCol] -= 4;
    curRow += row;
    curCol += col;    
}

void sokoban::moveBox(int boxRow, int boxCol, int row, int col){
    levelArr[boxRow + row][boxCol + col] += 3;
    levelArr[boxRow][boxCol] -= 3;
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西部秋虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值