主页

照B站某位up主做的,有些改动

这是个萝莉,你要做的是踩爆他

更新纪录:

2026.5.3

开始做

2026.5.4

完工,开始改进

2026.5.17

增加复位功能


最新代码
//推箱子 
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define MP_ROW 10
#define MP_COL 10

//地图 
char mp[MP_ROW][MP_COL]={
	1,1,1,1,1,1,1,1,1,1,
	1,4,0,0,0,0,0,0,4,1,
	1,0,3,0,0,0,4,0,0,1,
	1,0,0,0,4,0,0,0,0,1,
	1,0,0,4,0,0,0,0,0,1,
	1,0,0,0,3,0,3,0,0,1,
	1,0,0,0,2,0,0,0,0,1,
	1,0,0,3,0,0,0,0,0,1,
	1,4,0,0,0,0,0,0,4,1,
	1,1,1,1,1,1,1,1,1,1
};

//备份 
char mp2[MP_ROW][MP_COL];
void mp2_(){
	for(int i=0;i<MP_ROW;i++){
		for(int j=0;j<MP_COL;j++){
			mp2[i][j]=mp[i][j];
		}
	}
}

enum {mp_null,mp_wall,mp_man,mp_box,mp_de,mp_manandde=6,mp_boxandde=7}; 
enum {up='w',down='s',left='a',right='d',res='r'};

void drawgame();
void playgame(); 
bool iswin();
void play();
void reset();
int main(){
	mp2_(); 
	reset();
	play();
	return 0;
} 

//过程 
void play(){
	drawgame();
	while(1){
		playgame();
		drawgame();
		if(iswin()){
			printf("\n游戏胜利\n");
			break;
		}
	}
}

//复位 
void reset(){
    for(int i=0;i<MP_ROW;i++){
        for(int j=0;j<MP_COL;j++){
            mp[i][j]=mp2[i][j];
        }
    }
}

//绘制地图 
void drawgame(){
	system("cls");
	printf("w a s d移动,r复位\n\n");
	for(int i=0;i<MP_ROW;i++){
		for(int j=0;j<MP_COL;j++){
			switch(mp[i][j]){
				case mp_null:
					printf("  ");
					break;
				case mp_wall:
					printf("墙");
					break;
				case mp_man:
					printf("人");
					break;
				case mp_box:
					printf("箱");
					break; 
				case mp_de:
					printf("地");
					break;
				case mp_manandde:
					printf("人");
					break; 
				case mp_boxandde:
					printf("箱");
					break;
			}
		}
		printf("\n");
	}
}

//控制人
void playgame(){
	int x,y;//人坐标 
	//找初始位置
	for(int i=0;i<MP_ROW;i++){
		for(int j=0;j<MP_COL;j++){
			if(mp[i][j]==mp_man || mp[i][j]==mp_manandde){
				x=i;
				y=j;
			}
		}
	} 
	
	//移动 
	switch(_getch()){
		case up:
			if(mp[x-1][y]==mp_null || mp[x-1][y]==mp_de){
				mp[x-1][y]+=2;
				mp[x][y]-=2;
			}else if(mp[x-1][y]==mp_box || mp[x-1][y]==mp_boxandde){
				if(mp[x-2][y]==mp_null || mp[x-2][y]==mp_de){
					mp[x-2][y]+=3;
					mp[x-1][y]-=1;
					mp[x][y]-=2;
				}
			}
			break;
		case down:
			if(mp[x+1][y]==mp_null || mp[x+1][y]==mp_de){
				mp[x+1][y]+=2;
				mp[x][y]-=2;
			}else if(mp[x+1][y]==mp_box || mp[x+1][y]==mp_boxandde){
				if(mp[x+2][y]==mp_null || mp[x+2][y]==mp_de){
					mp[x+2][y]+=3;
					mp[x+1][y]-=1;
					mp[x][y]-=2;
				}
			}
			break;
		case left:
			if(mp[x][y-1]==mp_null || mp[x][y-1]==mp_de){
				mp[x][y-1]+=2;
				mp[x][y]-=2;
			}else if(mp[x][y-1]==mp_box || mp[x][y-1]==mp_boxandde){
				if(mp[x][y-2]==mp_null || mp[x][y-2]==mp_de){
					mp[x][y-2]+=3;
					mp[x][y-1]-=1;
					mp[x][y]-=2;
				}
			}
			break;
		case right:
			if(mp[x][y+1]==mp_null || mp[x][y+1]==mp_de){
				mp[x][y+1]+=2;
				mp[x][y]-=2;
			}else if(mp[x][y+1]==mp_box || mp[x][y+1]==mp_boxandde){
				if(mp[x][y+2]==mp_null || mp[x][y+2]==mp_de){
					mp[x][y+2]+=3;
					mp[x][y+1]-=1;
					mp[x][y]-=2;
				}
			}
			break;
		case res:
			reset();
        	break;
	}
} 

//是否成功
bool iswin(){
	for(int i=0;i<MP_ROW;i++){
		for(int j=0;j<MP_COL;j++){
			if(mp[i][j]==mp_box){
				return false;
			}
		}
	} 
	return true;
}