- 谢颂臣 的博客
推箱子游戏
- @ 2026-5-4 13:41:47
照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;
}