C语言实现简单的推箱子游戏

本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下

项目实现的具体方案:

先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人物,墙壁,箱子目的地,箱子)的图片加载到程序中显示出来。游戏的实现是通过程序读取键盘中输入的字母,后控制加载到程序中的人物图片的移动实现小人的移动,通过人物图片和地板图片交换位置实现人物的行走,如果人物前面是箱子图片,箱子图片前面是地板图片,则人物图片和箱子图片一起移动,直到箱子图片前面是箱子目的地图片则箱子图片将箱子目的地替换,从而实现将箱子推到箱子目的地上。这就是实现游戏的思路,程序中还有各种细节在下面进行讲解。在开始编写程序时先创建一个c++空项目,把cpp文件和地图中相对应的元素图片(人物,墙壁,箱子目的地,箱子)放在同一个目录下面。

1、开始先进行地图大小的实现

(1)我们先初始化图形界面的大小

#define SCREEN_WIDTH 976
#define SCREEN_HEIGHT 549    
 
//窗口初始化
    initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//括号中的是窗口的长和宽为了以后可以方便改变大小所以进行了宏定义

(2)窗口大小初始化完以后进行开始游戏界面的实现

IMAGE bg_img2; //申请一个句柄用来存放图片
    
//游戏开始背景背景图
    loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //将图片blachground.jpg加载到&bg_img2
    GameStarSCREEN(&bg_img2);
 
    Sleep(1000); //休眠1000毫秒
 
//函数GameStarSCREEN的实现
//游戏开始界面
void GameStarSCREEN(IMAGE *bg){
    putimage(0,0,bg); //把图片播放在(0,0)坐标
 
    //设置窗口标题
    HWND window = GetHWnd();//获取窗口
    SetWindowText(window,_T("推箱子 ***"));//设置窗口标题
 
    //设置文本样式及颜色
    settextcolor(WHITE);
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("欢迎进入本人设置的游戏"));
}

游戏开始界面效果

(3)游戏开始界面设置完以后进行游戏操作指南和游戏规则的界面设置

//游戏正在进行界面
void BeingGameSCREEN(){
    //清除界面
    cleardevice();
    //画一个矩形
    rectangle(762,30,952,244);
    settextcolor(WHITE);  //设置字体颜色
    settextstyle(15,0,_T("宋体")); //设置字体的宽度和高度以及字体的类型
    outtextxy(772,40,_T("游戏操作指南:")); //在对应的坐标位置输出引号内的字符串
    outtextxy(772,60,_T("按 W 向上移动"));
    outtextxy(772,75,_T("按 S 向下移动"));
    outtextxy(772,90,_T("按 A 向左移动"));
    outtextxy(772,105,_T("按 D 向右移动"));
    
    outtextxy(772,130,_T("温馨提示:"));
    outtextxy(772,170,_T("请在 58 步以内完成任务"));
    outtextxy(772,200,_T("退出请按 Q"));
 
    rectangle(922,450,762,264);
    outtextxy(772,284,_T("您以走的步数为:"));
}

游戏操作指南效果图

(4)进行游戏地图的实现

先定义一个全局的二维数组用来保存地图中的(人物,墙壁,箱子目的地,箱子)元素

int map[COW][COLUMN]={
    {0,0,0,0,0,0,0,0,0,0,0,0},
    {0,1,0,1,1,1,1,1,1,1,0,0},
    {0,1,4,1,0,2,1,0,2,1,0,0},
    {0,1,0,1,0,1,0,0,1,1,1,0},
    {0,1,0,2,0,1,1,4,1,1,1,0},
    {0,1,1,1,0,3,1,1,1,4,1,0},
    {0,1,2,1,1,4,1,1,1,1,1,0},
    {0,1,0,0,1,0,1,1,0,0,1,0},
    {0,0,0,0,0,0,0,0,0,0,0,0},
};

定义一个枚举类型用来设置地图中的(人物,墙壁,箱子目的地,箱子)元素

enum _PROPS{
    WALL_RIGHT, //墙壁为数字0
    FLOOR,    //地板为数字1
    DES,    //箱子目的地为数字2
    MAN,    //人物为数字3
    BOX,    //箱子为数字4
    BOX_HIT,    //把箱子推到箱子目的地为数字5
    MAN_DES, //人站在目的地上为数字6
    ALL //全部道具的数量为数字7
}poc;

地图定义完以后将地图元素加在到二维数组中

#define RATIO 61 //地图元素大小
 
//申请一个全局的一维的数组句柄
IMAGE images[ALL];    
 
    //加载地图元素
    loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true); 
    loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);
    loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);
    loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);
    loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);
    loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);
    loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);
 
//用for循环遍历二维数组,二维数组中相应坐标对应的数字与后来设置的以为数组中对应的枚举值相对应这样方可进行地图的实现
    for(int i=0;i<COW;i++){
        for(int j=0;j<COLUMN;j++){
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图片加载到相应的位置
            if(map[i][j]==MAN){
                   //获取小人在二维数组中的位置
                man.x=i;
                man.y=j;
            }
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
        }
    }

地图实现的效果图

 2、进行游戏控制环节的实现,游戏的控制是通过控制小人的移动实现

所以我们先定义一个全局的结构体来表示小人在地图中的位置

struct _pos{
  int x; //小人的横坐标
  int y; //小人的纵坐标
};
 
struct _pos man;

小人坐标定义好以后我们要获取小人在地图中的坐标才能对小人进行移动,小人的坐标随我们不断移动而改变所以饿哦们要不断获取小人的坐标

for(int i=0;i<COW;i++){
        for(int j=0;j<COLUMN;j++){
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图片加载到相应的位置
            if(map[i][j]==MAN){
                   //获取小人在二维数组中的位置
                man.x=i;
                man.y=j;
            }
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
        }
    }

(1)定义一个枚举类型用来表示移动的方向

//枚举控制地图中小人的运动方向
enum DURATION{
    UP,
    DOWN,
    LEFT,
    RIGHT
};
 
enum DURATION direct;

(2)获取小人位置后对小人进行移动

bool quit=false; //定义一个布尔类型
 
    do{
        if(_kbhit()){ //识别从键盘输入的字母
            char ch=_getch(); //从键盘输入字母
            cnt++;
            Record_Steps(); //记录走过的步数,每次进入识别键盘输入说明移动了一次从而进行步数加一
            if(ch==KEY_UP){
                gameControal(UP);
            }else if(ch==KEY_DOWN){
                gameControal(DOWN);
            }else if(ch==KEY_LEFT){
                gameControal(LEFT);
            }else if(ch==KEY_RIGHT){
                gameControal(RIGHT);
            }else if(ch==KEY_QUIT){
                quit=true;
                GameOverSCREEN(&bg_img);
            }if(isGameOver()){
                quit=true;
                GameOverSCREEN(&bg_img);
            }if(cnt>LEN){
                quit=true;
                FalseGameOverSCREEN(&bg_img1);
            }
        }
        Sleep(100);
    }while(quit==false);

(3)用宏定义表示从键盘输入的字母

#define KEY_UP 'W'
#define KEY_DOWN 'S'
#define KEY_LEFT 'A'
#define KEY_RIGHT 'D'
#define KEY_QUIT 'Q'

(4)接下来进行人物的移动方向的判断

//控制程序运行小人移动和方块移动
void gameControal(enum DURATION direct){
    int x=man.x;
    int y=man.y;
//对向上移动的控制
    if(direct==UP){
        if((x-1)>=STAR&&map[x-1][y]==DES){
            mapChange(x-1,y,MAN_DES);
            mapChange(x,y,FLOOR);
            man.x=x-1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x-1,y,MAN);
            man.x=x-1;
        }else if((x-1)>=STAR&&map[x-1][y]==FLOOR){
            mapChange(x-1,y,MAN);
            mapChange(x,y,FLOOR);
            man.x=x-1;
        }else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN_DES);
                mapChange(x,y,FLOOR);
                man.x=x-1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN);
                mapChange(x,y,DES);
                man.x=x-1;
        }else if((x-1)>=STAR&&map[x-1][y]==BOX){
            if(map[x-2][y]==FLOOR){
            mapChange(x-1,y,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x-2,y,BOX);
            man.x=x-1;
                }else if(map[x-2][y]==DES){
                mapChange(x-1,y,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x-2,y,BOX_HIT);
                man.x=x-1;
            }
        }
//对向下移动的控制
    }else if(direct==DOWN){
        if((x+1)>=STAR&&map[x+1][y]==DES){
            mapChange(x+1,y,MAN_DES);
            mapChange(x,y,FLOOR);
            man.x=x+1;
        }else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x+1,y,MAN);
            man.x=x+1;
        }else if((x+1)<COW&&map[x+1][y]==FLOOR){
            mapChange(x+1,y,MAN);
            mapChange(x,y,FLOOR);
            man.x=x+1;
        }else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){
                mapChange(x+2,y,BOX);
                mapChange(x+1,y,MAN_DES);
                mapChange(x,y,FLOOR);
                man.x=x+1;
        }else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){
                mapChange(x+2,y,BOX);
                mapChange(x+1,y,MAN);
                mapChange(x,y,DES);
                man.x=x+1;
        }else if((x+1)<COW&&map[x+1][y]==BOX){
            if(map[x+2][y]==FLOOR){
            mapChange(x+1,y,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x+2,y,BOX);
            man.x=x+1;
            }else if(map[x+2][y]==DES){
                mapChange(x+1,y,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x+2,y,BOX_HIT);
                man.x=x+1;
            }
        }
//对向右移动的控制
    }else if(direct==RIGHT){
        if((y+1)>=STAR&&map[x][y+1]==DES){
            mapChange(x,y+1,MAN_DES);
            mapChange(x,y,FLOOR);
            man.y=y+1;
        }else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x,y+1,MAN);
            man.y=y+1;
        }else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){
            mapChange(x,y+1,MAN);
            mapChange(x,y,FLOOR);
            man.y=y+1;
        }else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){
                mapChange(x,y+2,BOX);
                mapChange(x,y+1,MAN_DES);
                mapChange(x,y,FLOOR);
                man.y=y+1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN);
                mapChange(x,y,DES);
                man.x=x-1;
        }else if((y+1)<COLUMN&&map[x][y+1]==BOX){
            if(map[x][y+2]==FLOOR){
            mapChange(x,y+1,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x,y+2,BOX);
            man.y=y+1;
            }else if(map[x][y+2]==DES){
                mapChange(x,y+1,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x,y+2,BOX_HIT);
                man.y=y+1;
            }
        }
//对向左移动的控制
    }else if(direct==LEFT){
        if((y-1)>=STAR&&map[x][y-1]==DES){
            mapChange(x,y-1,MAN_DES);
            mapChange(x,y,FLOOR);
            man.y=y-1;
        }else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x,y-1,MAN);
            man.y=y-1;
        }else if((y-1)>=0&&map[x][y-1]==FLOOR){
            mapChange(x,y-1,MAN);
            mapChange(x,y,FLOOR);
            man.y=y-1;
        }else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){
                mapChange(x,y-2,BOX);
                mapChange(x,y-1,MAN_DES);
                mapChange(x,y,FLOOR);
                man.y=y-1;
        }else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){
                mapChange(x,y-2,BOX);
                mapChange(x,y-1,MAN);
                mapChange(x,y,DES);
                man.y=y-1;
        }else if((y-1)>=0&&map[x][y-1]==BOX){
            if(map[x][y-2]==FLOOR){
            mapChange(x,y-1,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x,y-2,BOX);
            man.y=y-1;
            }else if(map[x][y-2]==DES){
                mapChange(x,y-1,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x,y-2,BOX_HIT);
                man.y=y-1;
            }
        }
    }
}

(5)对人物移动方向判断后进行地图中元素位置进行改变才能真正实现人物的移动

//改变地图元素
void mapChange(int line,int colum,enum _PROPS poc){
    map[line][colum]=poc;
    putimage(colum*RATIO,line*RATIO,&images[poc]);
}

3、人物控制结束以后进行游戏结束界面的设计

(1)在规定步数内完成游戏的背景

//游戏结束背景
void GameOverSCREEN(IMAGE *bg){
    cleardevice();
    putimage(0,0,bg);
    settextcolor(WHITE);
    RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒"));
    outtextxy(LINE2,COW2,_T("请按Q退出游戏"));
}

效果图

(1)不在规定步数内完成游戏背景

//游戏非正常结束背景
void FalseGameOverSCREEN(IMAGE *bg){
    cleardevice();
    putimage(0,0,bg);
    settextcolor(WHITE);
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("小菜鸡这都完成不了真蠢"));
    outtextxy(LINE2,COW2,_T("请按Q退出游戏"));
}

效果图

4、具体代码实现

(1)头文件编写

#define LINE1 366 
#define COW1 183
#define LINE2 427
#define COW2 244
 
#define RATIO 61
#define LEN 100
#define STAR 0
 
#define SCREEN_WIDTH 976
#define SCREEN_HEIGHT 549
 
#define COW 9
#define COLUMN 12
 
#define KEY_UP 'W'
#define KEY_DOWN 'S'
#define KEY_LEFT 'A'
#define KEY_RIGHT 'D'
#define KEY_QUIT 'Q'
 
int cnt=STAR;
 
//枚举优化代码表示道具
enum _PROPS{
    WALL_RIGHT,
    FLOOR,
    DES,
    MAN,
    BOX,
    BOX_HIT,
    MAN_DES,
    ALL
}poc;
 
//enum _PROPS poc;
 
//小人在二维数组中的位置
struct _pos{
  int x;
  int y;
};
 
struct _pos man;
 
//窗口初始化
IMAGE images[ALL];
 
//地图的实现
int map[COW][COLUMN]={
    {0,0,0,0,0,0,0,0,0,0,0,0},
    {0,1,0,1,1,1,1,1,1,1,0,0},
    {0,1,4,1,0,2,1,0,2,1,0,0},
    {0,1,0,1,0,1,0,0,1,1,1,0},
    {0,1,0,2,0,1,1,4,1,1,1,0},
    {0,1,1,1,0,3,1,1,1,4,1,0},
    {0,1,2,1,1,4,1,1,1,1,1,0},
    {0,1,0,0,1,0,1,1,0,0,1,0},
    {0,0,0,0,0,0,0,0,0,0,0,0},
};
 
//判断游戏是否结束
//return->false 游戏未结束 return->true 游戏结束
int isGameOver(){
    for(int i=0;i<COW;i++){
        for(int j=0;j<COLUMN;j++){
            if(map[i][j]==DES) return false;
        }
    }
    return true;
}
 
//游戏结束背景
void GameOverSCREEN(IMAGE *bg){
    cleardevice();
    putimage(0,0,bg);
    settextcolor(WHITE);
    RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒"));
    outtextxy(LINE2,COW2,_T("请按Q退出游戏"));
}
 
//游戏非正常结束背景
void FalseGameOverSCREEN(IMAGE *bg){
    cleardevice();
    putimage(0,0,bg);
    settextcolor(WHITE);
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("小菜鸡这都完成不了真蠢"));
    outtextxy(LINE2,COW2,_T("请按Q退出游戏"));
}
 
//游戏开始界面
void GameStarSCREEN(IMAGE *bg){
    putimage(0,0,bg);
 
    //设置窗口标题
    HWND window = GetHWnd();//获取窗口
    SetWindowText(window,_T("推箱子 ***"));//设置窗口标题
 
    //设置文本样式及颜色
    settextcolor(WHITE);
    settextstyle(20,0,_T("宋体"));
    outtextxy(LINE1,COW1,_T("欢迎进入本人设置的游戏"));
}
 
//游戏正在进行界面
void BeingGameSCREEN(){
    //清除界面
    cleardevice();
    //画一个矩形
    rectangle(762,30,952,244);
    settextcolor(WHITE);
    settextstyle(15,0,_T("宋体"));
    outtextxy(772,40,_T("游戏操作指南:"));
    outtextxy(772,60,_T("按 W 向上移动"));
    outtextxy(772,75,_T("按 S 向下移动"));
    outtextxy(772,90,_T("按 A 向左移动"));
    outtextxy(772,105,_T("按 D 向右移动"));
    
    outtextxy(772,130,_T("温馨提示:"));
    outtextxy(772,170,_T("请在 58 步以内完成任务"));
    outtextxy(772,200,_T("退出请按 Q"));
 
    rectangle(922,450,762,264);
    outtextxy(772,284,_T("您以走的步数为:"));
}
 
//记录小人走过的步数
void Record_Steps(){
    char str[16];
    settextstyle(40,0,_T("宋体"));
    sprintf(str,"%d",cnt);
    outtextxy(820,350,str);
}
 
//枚举控制地图中小人的运动方向
enum DURATION{
    UP,
    DOWN,
    LEFT,
    RIGHT
};
 
enum DURATION direct;
 
//改变地图元素
void mapChange(int line,int colum,enum _PROPS poc){
    map[line][colum]=poc;
    putimage(colum*RATIO,line*RATIO,&images[poc]);
}
 
//控制程序运行小人移动和方块移动
void gameControal(enum DURATION direct){
    int x=man.x;
    int y=man.y;
    if(direct==UP){
        if((x-1)>=STAR&&map[x-1][y]==DES){
            mapChange(x-1,y,MAN_DES);
            mapChange(x,y,FLOOR);
            man.x=x-1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x-1,y,MAN);
            man.x=x-1;
        }else if((x-1)>=STAR&&map[x-1][y]==FLOOR){
            mapChange(x-1,y,MAN);
            mapChange(x,y,FLOOR);
            man.x=x-1;
        }else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN_DES);
                mapChange(x,y,FLOOR);
                man.x=x-1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN);
                mapChange(x,y,DES);
                man.x=x-1;
        }else if((x-1)>=STAR&&map[x-1][y]==BOX){
            if(map[x-2][y]==FLOOR){
            mapChange(x-1,y,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x-2,y,BOX);
            man.x=x-1;
                }else if(map[x-2][y]==DES){
                mapChange(x-1,y,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x-2,y,BOX_HIT);
                man.x=x-1;
            }
        }
    }else if(direct==DOWN){
        if((x+1)>=STAR&&map[x+1][y]==DES){
            mapChange(x+1,y,MAN_DES);
            mapChange(x,y,FLOOR);
            man.x=x+1;
        }else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x+1,y,MAN);
            man.x=x+1;
        }else if((x+1)<COW&&map[x+1][y]==FLOOR){
            mapChange(x+1,y,MAN);
            mapChange(x,y,FLOOR);
            man.x=x+1;
        }else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){
                mapChange(x+2,y,BOX);
                mapChange(x+1,y,MAN_DES);
                mapChange(x,y,FLOOR);
                man.x=x+1;
        }else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){
                mapChange(x+2,y,BOX);
                mapChange(x+1,y,MAN);
                mapChange(x,y,DES);
                man.x=x+1;
        }else if((x+1)<COW&&map[x+1][y]==BOX){
            if(map[x+2][y]==FLOOR){
            mapChange(x+1,y,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x+2,y,BOX);
            man.x=x+1;
            }else if(map[x+2][y]==DES){
                mapChange(x+1,y,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x+2,y,BOX_HIT);
                man.x=x+1;
            }
        }
    }else if(direct==RIGHT){
        if((y+1)>=STAR&&map[x][y+1]==DES){
            mapChange(x,y+1,MAN_DES);
            mapChange(x,y,FLOOR);
            man.y=y+1;
        }else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x,y+1,MAN);
            man.y=y+1;
        }else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){
            mapChange(x,y+1,MAN);
            mapChange(x,y,FLOOR);
            man.y=y+1;
        }else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){
                mapChange(x,y+2,BOX);
                mapChange(x,y+1,MAN_DES);
                mapChange(x,y,FLOOR);
                man.y=y+1;
        }else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
                mapChange(x-2,y,BOX);
                mapChange(x-1,y,MAN);
                mapChange(x,y,DES);
                man.x=x-1;
        }else if((y+1)<COLUMN&&map[x][y+1]==BOX){
            if(map[x][y+2]==FLOOR){
            mapChange(x,y+1,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x,y+2,BOX);
            man.y=y+1;
            }else if(map[x][y+2]==DES){
                mapChange(x,y+1,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x,y+2,BOX_HIT);
                man.y=y+1;
            }
        }
    }else if(direct==LEFT){
        if((y-1)>=STAR&&map[x][y-1]==DES){
            mapChange(x,y-1,MAN_DES);
            mapChange(x,y,FLOOR);
            man.y=y-1;
        }else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){
            mapChange(x,y,DES);
            mapChange(x,y-1,MAN);
            man.y=y-1;
        }else if((y-1)>=0&&map[x][y-1]==FLOOR){
            mapChange(x,y-1,MAN);
            mapChange(x,y,FLOOR);
            man.y=y-1;
        }else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){
                mapChange(x,y-2,BOX);
                mapChange(x,y-1,MAN_DES);
                mapChange(x,y,FLOOR);
                man.y=y-1;
        }else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){
                mapChange(x,y-2,BOX);
                mapChange(x,y-1,MAN);
                mapChange(x,y,DES);
                man.y=y-1;
        }else if((y-1)>=0&&map[x][y-1]==BOX){
            if(map[x][y-2]==FLOOR){
            mapChange(x,y-1,MAN);
            mapChange(x,y,FLOOR);
            mapChange(x,y-2,BOX);
            man.y=y-1;
            }else if(map[x][y-2]==DES){
                mapChange(x,y-1,MAN);
                mapChange(x,y,FLOOR);
                mapChange(x,y-2,BOX_HIT);
                man.y=y-1;
            }
        }
    }
}

(2)main文件的实现

#include<graphics.h>
#include<stdlib.h>
#include<iostream>
#include<Windows.h>
#include<MMSystem.h>
#include<conio.h>
#pragma comment(lib,"winmm.lib")
 
#include "box.h"
 
using namespace std;
 
int main(void){
 
    //申请一个句柄
    IMAGE bg_img;
    IMAGE bg_img1;
    IMAGE bg_img2;
 
    //窗口初始化
    initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
 
    //游戏开始背景背景图
    loadimage(&bg_img2,_T("blachground.jpg"),732,549,true);
    GameStarSCREEN(&bg_img2);
 
    Sleep(1000);
 
    //游戏正在进行界面
    BeingGameSCREEN();
 
    //加载游戏未在规定规则内完成的背景
    loadimage(&bg_img1,_T("blackground.jpg"),732,549,true);
 
    //加载游戏在规定规则内完成的背景图
    loadimage(&bg_img,_T("blackground.jpg"),732,549,true);
 
    //加载背景音乐
    mciSendString(_T("play 南方.mp3 repeat"), 0, 0, 0);
 
    //加载地图元素
    loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);
    loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);
    loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);
    loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);
    loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);
    loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);
    loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);
 
    for(int i=0;i<COW;i++){
        for(int j=0;j<COLUMN;j++){
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
            if(map[i][j]==MAN){
                   //获取小人在二维数组中的位置
                man.x=i;
                man.y=j;
            }
            putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
        }
    }
 
    bool quit=false;
 
    do{
        if(_kbhit()){
            char ch=_getch();
            cnt++;
            Record_Steps();
            if(ch==KEY_UP){
                gameControal(UP);
            }else if(ch==KEY_DOWN){
                gameControal(DOWN);
            }else if(ch==KEY_LEFT){
                gameControal(LEFT);
            }else if(ch==KEY_RIGHT){
                gameControal(RIGHT);
            }else if(ch==KEY_QUIT){
                quit=true;
                GameOverSCREEN(&bg_img);
            }if(isGameOver()){
                quit=true;
                GameOverSCREEN(&bg_img);
            }if(cnt>LEN){
                quit=true;
                FalseGameOverSCREEN(&bg_img1);
            }
        }
        Sleep(100);
    }while(quit==false);
 
    system("pause");
 
    //游戏结束释放资源
    closegraph();
 
    return 0;
}

5、这是本人对推箱子游戏的见解如果有什么错误请指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言游戏项目球球大作战实现流程

    目录 项目代码 1.结构体 2.初始化 3.绘制函数 4.玩家控制函数 5.吃食物函数 6.电脑移动函数 7.主函数 总结 序 时间在流去,我们在长大 嗨,这里是狐狸~~ 今天是2022年1月11日,今天突然发现好久没有给你们更新项目了,今天来教大家一个新的项目,一个游戏项目——球球大作战. 球球大作战在宇宙深处一片遍布着荆棘之花的神秘星云中,生活着一群名叫“波拉哩”(译名“球球”)的奇特生物.他们外表萌萌,却有着勇敢的心.他们是天生的战斗种族,为战斗而生,为战斗而亡. 传说中,这群波拉哩的共同

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

  • c语言实现简单的五子棋游戏

    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一.游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游戏 2.1 显示棋盘,玩家1下棋,判断游戏结果2.2 显示棋盘,玩家2下棋,判断游戏结果  3.判断游戏结果 有4种结果,玩家1赢,玩家2赢,平局,继续游戏若结果为玩家1赢或玩家2赢或平局,则显示结果,退回菜单界面,不再循环下棋        若结果为继续,则循环2.1和2.2 4.选择退出,则退出游戏 二.图片解说

  • C语言扑克牌游戏示例

    目录 一. 设计目的 二. 设计内容与要求 三. 设计思路 四. 实现过程 五. 结论与改进 一. 设计目的 扑克牌是我们从小玩到大的纸牌类小游戏,我们有各种玩法跟不同的规则.我之所以选择的这个扑克牌,是因为我觉得可以提高我的编程逻辑能力跟运用循环的能力.还能让我自由运用所学知识完成我的项目设计的需求,对我综合能力的能力很有挑战! 二. 设计内容与要求 (1)设计内容:扑克牌游戏. (2)介绍扑克牌:一副没有大小王的52张牌,该牌从大到小的顺序为:2.3.4.5.6.7.8.9.10.J.Q.K

  • 基于C语言实现简易三子棋游戏

    用C语言写三子棋的具体代码,供大家参考,具体内容如下 1.头文件 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //标识符定义 #define ROW 3 #define COL 3 //函数定义 //棋盘初始化 void init_board(char board[ROW][COL], int row, int col); //打印棋盘 void display_board(char

  • 用C语言实现推箱子游戏实例

    目录 前言 游戏效果图 游戏开发思路 游戏逻辑的分析 源代码实现 头文件 PushBackGame.c文件 test.c文件 总结 前言 本游戏需要用到的核心技术,如下: 二维数组分支语句 技术难点: 二维数组的应用和游戏的判断逻辑 只要会以上的技术的萌新都能做出很棒的游戏,博主本身也是一枚小白,如果源代码的某些地方有不足,请大佬在评论区指出. 游戏效果图 实际游玩效果图​​​​​ 游戏开发思路 分析游戏逻辑,再根据游戏分析游戏代码逻辑写出伪代码,再分析可能存在的问题,最后一步才是开发游戏. 游

  • C语言实现井字棋游戏(人机对弈)

    井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名. 题目分析 : 要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么? 1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来: 2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为‘ ’(空格): 3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下.在这

  • c语言实现可自定义的游戏地图

    本文实例为大家分享了c语言实现可自定义的游戏地图的具体代码,供大家参考,具体内容如下 博主相信每个人都有想做游戏的冲动,那么本文将给出一个用c语言制作的可自定义大小的游戏地图(包含player,撞墙设置).废话不多说,直接给出全代码! 1.完整代码 #include<stdio.h> #include<windows.h> #include<conio.h>    //this is the add function  int drawroom(int length,i

  • 用c语言实现《狼人杀》游戏发牌系统

    目录 1.前言 2.程序效果 3.完整代码 总结 1.前言 新年将至,亲戚朋友在家中免不了玩一下桌游,狼人杀确实是一个不错选择.那么针对正常的狼人杀玩法(8人局和12人局),博主利用一上午时间做了一个<狼人杀自动发牌系统>(可查看游戏教程和人物属性).接下来就直接看程序效果和完整代码吧! 2.程序效果 3.完整代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<window

  • C语言实现简单的推箱子游戏

    本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人物,墙壁,箱子目的地,箱子)的图片加载到程序中显示出来.游戏的实现是通过程序读取键盘中输入的字母,后控制加载到程序中的人物图片的移动实现小人的移动,通过人物图片和地板图片交换位置实现人物的行走,如果人物前面是箱子图片,箱子图片前面是地板图片,则人物图片和箱子图片一起移动,直到箱子图片前面是箱子目的地图片则箱子图片将箱

  • C语言实现简单的推箱子小游戏

    本文实例为大家分享了C语言实现简单推箱子小游戏的具体代码,供大家参考,具体内容如下 此推箱子游戏可以实现人物移动,箱子移动,人物不出框,自义定文件关卡,重新开始以及回退复位等功能的实现,由于系统或版本问题,关卡和人物及物体未做美化处理,希望美化的可自行美化. 1.所用到的宏 #include <stdio.h> #include <stdlib.h> #include <getopt.h> #define MAX_ROWS 16 #define MAX_CLOS 16

  • C语言实现简单推箱子游戏

    使用C语言实现超简单的推箱子游戏,供大家参考,具体内容如下/p> 感谢您打开了这篇文章,下面我将讲述一下推箱子是如何实现的. 另外附赠适配该程序简单好用 专属推箱子地图编辑器 让您在16 * 16大地图的条件下也能轻松编辑地图. 链接:地图编辑器 本程序在没有检测到地图文件的情况下也能独自运行!代码中储存了推箱子游戏第一关的标准地图,让您在没有地图文件的情况下也能熟悉整个程序的流程! 当然,拥有地图文件会也会获得更好的游戏体验,请自行编辑. 废话不多说! 下面进入技术环节: C语言版 多功能推箱

  • C语言实现推箱子游戏

    每天学习一点点,每天容易一点点.一个简单的C语言程序,用来复习c语言,代码通俗易懂.有什么问题望各位不吝赐教. 本文用最简单的C语言语句写个推箱子的程序,分享给大家: /******************************************* 用最简单的C语言语句写个推箱子的程序. ********************************************/ #include <stdio.h> #include <conio.h> #include&l

  • 基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可. 2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可. #include<stdio.h> #include<stdlib.h> #include<windows.h> #includ

  • C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码,供大家参考,具体内容如下 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图. 手动设置地图 用'0'表示空格,"1"表示墙,"2"表示箱子,"3"表示人,"4"表示终点 这样可以提高代码的移植性 如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了 int

  • C语言系列之推箱子游戏

    本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下 输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了. #include <stdio.h> #include <conio.h> //键盘输入函数库 //0:空地 1:墙 2:箱子要放的位置 5:人与星号重叠5:箱子与星号重叠 3:人+-3 4:箱子:+-4 int map[10][10] = {1,1,1,1,1,1,1,1,1,1, 1,0,0,0,

  • C语言+MySQL实现推箱子游戏

    目录 图片素材及源码 数据库SQL语句 操作数据库C++代码 database.h database.cpp 推箱子游戏代码 box_man.h box_man.cpp 图片素材及源码 下载链接 数据库SQL语句 create database box_man if not exists; use box_man; create table users ( id int not null auto_increment, username varchar(64) not null, passwor

  • 用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> //行和列 #define ROW 10 #define COL 11 /* run this program using the console pauser or add your own getch, system(&quo

  • C语言实现推箱子游戏的地图编辑器

    推箱子地图编辑器,供大家参考,具体内容如下 由于我在写推箱子的时候苦于没有地图可以试验程序运行效果,而且去搜了好长时间都没有找到一个储存16*16地图版本的推箱子关卡数据信息的文件. 于是想到了写了一个地图编辑器用来自己设计地图的想法. 原本以为这个伟大的创意只有我才想的出来,结果搜索后才发现还有很多人有着与我相同的想法. 但,其他人写的编辑器大部分都不是C语言版本的,而这一个是C语言版本的. 另外说明一下,该编辑器的想法完全是我个人想法写出来的,不敢保证编辑习惯符合别人的习惯. 但本着,能够实

随机推荐