📄 move.cpp
字号:
/***********************************************************
move.cpp
***********************************************************/
#include <windows.h>
#include <windowsx.h>
#include <Commctrl.h>
#include "box.h"
#include "resource.h"
LRESULT CALLBACK PassShow(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int MoveBox(HDC hdc,int fcol,int fcow,int tcol,int tcow);
int MoveDo(HDC hdc,int moved_x,int moved_y);
int MoveUnDo(HDC hdc,int undo_x, int undo_y);
int PassJudge();
void CarrierShow(HDC hdc,int moved_x,int moved_y);
void BrickShow(HDC hdc,int moved_x,int moved_y);
void CarrierShowUndo(HDC hdc,int moved_x,int moved_y);
void BrickShowUndo(HDC hdc,int moved_x,int moved_y);
extern HINSTANCE hInst;
extern HWND hwndMain;
extern HBITMAP hStep;
extern HBITMAP element[13];
extern int nRoom;
extern unsigned char Temp_buf[10][25];
extern unsigned char undo_num;
extern unsigned char pass_flag;
extern unsigned char init_flag;
extern CARR carrier;
int done_num=0;
unsigned char temp_x,temp_y;
unsigned char Temp_Term[40]={0};
unsigned char Temp_Term1[20]={0};
int MoveBox(HDC hdc,int fcol,int fcow,int tcol,int tcow)
{
INT i,j,brick_num;
brick_num = 0;
if(fcol != tcol && fcow != tcow)
return 0;
else{
if(fcol == tcol && fcow == tcow)
return 0;
if(fcol == tcol){
if(fcow > tcow){
for(i=fcow;i>=tcow;i--){
if(Temp_buf[i-1][fcol]==WALL){
if(brick_num==0){
for(j=fcow;j>=i;j--){
MoveDo(hdc,0,-1);
Sleep(100);
}
return 1;
}
else if(brick_num==1){
for(j=fcow;j>i;j--){
MoveDo(hdc,0,-1);
Sleep(100);
}
return 1;
}
}
else if(Temp_buf[i-1][fcol]==BOX ||
Temp_buf[i-1][fcol]==TERM1){
brick_num++;
if(brick_num==2){
for(j=fcow;j>=i;j--){
MoveDo(hdc,0,-1);
Sleep(100);
}
return 1;
}
}
else{
i--;
}
}
for(i=fcow;i>tcow;i--){
MoveDo(hdc,0,-1);
Sleep(100);
}
return 1;
}
else{
for(i=fcow;i<=tcow;i++){
if(Temp_buf[i+1][fcol]==WALL){
if(brick_num==0){
for(j=fcow;j<=i;j++){
MoveDo(hdc,0,1);
Sleep(100);
}
return 1;
}
else if(brick_num==1){
for(j=fcow;j<i;j++){
MoveDo(hdc,0,1);
Sleep(100);
}
return 1;
}
}
else if(Temp_buf[i+1][fcol]==BOX ||
Temp_buf[i+1][fcol]==TERM1){
brick_num++;
if(brick_num==2){
for(j=fcow;j<=i;j++){
MoveDo(hdc,0,1);
Sleep(100);
}
return 1;
}
}
else{
i++;
}
}
for(i=fcow;i<tcow;i++){
MoveDo(hdc,0,1);
Sleep(100);
}
return 1;
}
}
else if(fcow==tcow){
if(fcol > tcol){
for(i=fcol;i>=tcol;i--){
if(Temp_buf[fcow][i-1]==WALL){
if(brick_num==0){
for(j=fcol;j>=i;j--){
MoveDo(hdc,-1,0);
Sleep(100);
}
return 1;
}
else if(brick_num==1){
for(j=fcol;j>i;j--){
MoveDo(hdc,-1,0);
Sleep(100);
}
return 1;
}
}
else if(Temp_buf[fcow][i-1]==BOX||
Temp_buf[fcow][i-1]==TERM1){
brick_num++;
if(brick_num==2){
for(j=fcol;j>=i;j--){
MoveDo(hdc,-1,0);
Sleep(100);
}
return 1;
}
}
else{
i--;
}
}
for(i=fcol;i>tcol;i--){
MoveDo(hdc,-1,0);
Sleep(100);
}
return 1;
}
else if(fcol < tcol){
for(i=fcol;i<=tcol;i++){
if(Temp_buf[fcow][i+1]==WALL){
if(brick_num==0){
for(j=fcol;j<=i;j++){
MoveDo(hdc,1,0);
Sleep(100);
}
return 1;
}
else if(brick_num==1){
for(j=fcol;j<i;j++){
MoveDo(hdc,1,0);
Sleep(100);
}
return 1;
}
}
else if(Temp_buf[fcow][i+1]==BOX ||
Temp_buf[fcow][i+1]==TERM1){
brick_num++;
if(brick_num==2){
for(j=fcol;j<=i;j++){
MoveDo(hdc,1,0);
Sleep(100);
}
return 1;
}
}
else{
i++;
}
}
for(i=fcol;i<tcol;i++){
MoveDo(hdc,1,0);
Sleep(100);
}
return 1;
}
}
}
return 1;
carrier.undo_flag = 0;
}//MoveBox();
int MoveDo(HDC hdc,int moved_x,int moved_y)
{
if((Temp_buf[carrier.y + moved_y][carrier.x +moved_x] == SPACE)
||(Temp_buf[carrier.y + moved_y][carrier.x +moved_x] == TERM))
{
carrier.undo_flag=0;
temp_x = carrier.last_x;
temp_y = carrier.last_y;
carrier.last_x = carrier.x;
carrier.last_y = carrier.y;
carrier.x+=moved_x;
carrier.y+=moved_y;
CarrierShow(hdc,moved_x,moved_y);
}
else if((Temp_buf[carrier.y + moved_y][carrier.x + moved_x] == TERM1)
|| (Temp_buf[carrier.y + moved_y][carrier.x + moved_x] == BOX))
{
if ((Temp_buf[carrier.y+moved_y*2][carrier.x+moved_x*2]==SPACE)
||(Temp_buf[carrier.y+moved_y*2][carrier.x+moved_x*2]==TERM))
{
if (Temp_buf[carrier.y+moved_y*2][carrier.x+moved_x*2]==SPACE)
carrier.undo_flag=1;
if (Temp_buf[carrier.y+moved_y*2][carrier.x+moved_x*2]==TERM)
carrier.undo_flag=2;
carrier.last_x = carrier.x;
carrier.last_y = carrier.y;
carrier.x+=moved_x;
carrier.y+=moved_y;
if( (Temp_buf[carrier.y ][carrier.x ] == BOX)
&& (Temp_buf[carrier.y+moved_y][carrier.x+moved_x] == TERM) )
{
done_num ++;
}
else if( (Temp_buf[carrier.y ][carrier.x ] == TERM1)
&& (Temp_buf[carrier.y+moved_y][carrier.x+moved_x] == SPACE) )
{
done_num --;
}
BrickShow(hdc,moved_x,moved_y);
CarrierShow(hdc,moved_x,moved_y);
}
}
return 1;
}//MoveDo();
void BrickShow(HDC hdc,int moved_x,int moved_y)
{
HDC hMemDC;
if(PassJudge())
{
pass_flag = 1;
Sleep(100);
DialogBox (hInst, MAKEINTRESOURCE(IDD_PASS), hwndMain,(DLGPROC)PassShow);
carrier.undo_flag = 0;
}
else
{
hMemDC=CreateCompatibleDC(hdc);
if(Temp_buf[carrier.last_y+moved_y][carrier.last_x+moved_x]==TERM1)
{
hStep=element[TERM];
SelectObject(hMemDC,hStep);
BitBlt(hdc,(carrier.last_x+moved_x)*CARR_WI,(carrier.last_y+moved_y)*CARR_WI+MENUTOP,CARR_WI,CARR_WI,
hMemDC,0,0,SRCCOPY);
Temp_buf[carrier.last_y+moved_y][carrier.last_x+moved_x]=TERM;
}
else
if(Temp_buf[carrier.last_y+moved_y][carrier.last_x+moved_x]==BOX)
{
hStep=element[SPACE];
SelectObject(hMemDC,hStep);
BitBlt(hdc,(carrier.last_x+moved_x)*CARR_WI,(carrier.last_y+moved_y)*CARR_WI+MENUTOP,CARR_WI,CARR_WI,
hMemDC,0,0,SRCCOPY);
Temp_buf[carrier.last_y+moved_y][carrier.last_x+moved_x]=SPACE;
}
if (Temp_buf[carrier.last_y+moved_y*2][carrier.last_x+moved_x*2]==SPACE)
{
hStep=element[BOX];
SelectObject(hMemDC,hStep);
BitBlt(hdc,(carrier.last_x+moved_x*2)*CARR_WI,(carrier.last_y+moved_y*2)*CARR_WI+MENUTOP,CARR_WI,CARR_WI,
hMemDC,0,0,SRCCOPY);
Temp_buf[carrier.last_y+moved_y*2][carrier.last_x+moved_x*2]=BOX;
}
else if
(Temp_buf[carrier.last_y+moved_y*2][carrier.last_x+moved_x*2]==TERM)
{
hStep=element[TERM1];
SelectObject(hMemDC,hStep);
BitBlt(hdc,(carrier.last_x+moved_x*2)*CARR_WI,(carrier.last_y+moved_y*2)*CARR_WI+MENUTOP,CARR_WI,CARR_WI,
hMemDC,0,0,SRCCOPY);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -