返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现简单的推箱子游戏
  • 167
分享到

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

2024-04-02 19:04:59 167人浏览 八月长安
摘要

本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人

本文实例为大家分享了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、这是本人对推箱子游戏的见解如果有什么错误请指正

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

--结束END--

本文标题: C语言实现简单的推箱子游戏

本文链接: https://lsjlt.com/news/163134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言实现简单的推箱子游戏
    本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人...
    99+
    2024-04-02
  • C语言实现简单的推箱子小游戏
    本文实例为大家分享了C语言实现简单推箱子小游戏的具体代码,供大家参考,具体内容如下 此推箱子游戏可以实现人物移动,箱子移动,人物不出框,自义定文件关卡,重新开始以及回退复位等功能的实...
    99+
    2024-04-02
  • C语言+MySQL实现推箱子游戏
    目录图片素材及源码数据库SQL语句操作数据库C++代码database.hdatabase.cpp推箱子游戏代码box_man.hbox_man.cpp图片素材及源码 下载链接 数据...
    99+
    2024-04-02
  • 用C语言实现推箱子游戏实例
    目录前言游戏效果图游戏开发思路游戏逻辑的分析源代码实现 头文件PushBackGame.c文件test.c文件总结前言 本游戏需要用到的核心技术,如下:二维数组分支语句 技...
    99+
    2024-04-02
  • C语言如何实现推箱子小游戏
    本篇内容介绍了“C语言如何实现推箱子小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现推箱子代码的具体代码,...
    99+
    2023-06-20
  • 如何使用C语言实现推箱子游戏
    这篇文章主要为大家展示了“如何使用C语言实现推箱子游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C语言实现推箱子游戏”这篇文章吧。1.前言推箱子是c语言的一个经典的项目2.游戏效果展...
    99+
    2023-06-29
  • C语言系列之推箱子游戏
    本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下 输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了。...
    99+
    2024-04-02
  • C/C++实现推箱子小游戏
    本文实例为大家分享了C/C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 效果演示 实现功能 如上图所示。按键控制小猪的运动,推箱子到达目的地。 如何实现 1.首先思考要...
    99+
    2024-04-02
  • C语言简单实现三子棋游戏
    本文实例为大家分享了C语言简单实现三子棋游戏的具体代码,供大家参考,具体内容如下 设计思路 1. 二维数组实现棋盘 2. 设计并打印出棋盘 3. 玩家先手 4. 每一次下棋后判断输赢...
    99+
    2024-04-02
  • C语言实现简单五子棋游戏
    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏。 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char ...
    99+
    2024-04-02
  • C语言实现简单的五子棋游戏
    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一、游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游...
    99+
    2024-04-02
  • 用C++实现推箱子小游戏
    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器。 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其...
    99+
    2024-04-02
  • C语言实现简单三子棋小游戏
    三子棋介绍 三子棋,民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。如果两个人都掌握了...
    99+
    2024-04-02
  • C语言实现三子棋简单小游戏
    三子棋 ,也叫井字棋,是一款大家都玩过的经典小游戏,也是一个适合初学c语言的小伙伴练练手的小项目。 1.整个棋盘采用二维数组存储,下棋时只要获取到x,y两个方向的坐标访问二维数组中的...
    99+
    2024-04-02
  • C语言实现简单的五子棋小游戏
    本文实例为大家分享了C语言实现五子棋小游戏的具体代码,供大家参考,具体内容如下 我们需要一个二维数组去储存当前的棋盘状态,然后打印出来。 我们游戏的逻辑是初始化棋盘,打印棋盘,人下棋...
    99+
    2024-04-02
  • 利用c++写一个简单的推箱子小游戏
    效果图 相信各位都肯定完整这种推箱子的小游戏。游戏玩法很简单,那就是一个人把所有的箱子推动到对应的位置那就可以赢了。 那么我们接下来看看这个推箱子的游戏改怎么写 char ma...
    99+
    2024-04-02
  • 怎么用C语言实现游戏项目推箱子效果
    本篇内容主要讲解“怎么用C语言实现游戏项目推箱子效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现游戏项目推箱子效果”吧!直接开始吧首先是我们用二维数组特定的数字描绘出这个地图i...
    99+
    2023-06-25
  • C++怎么实现推箱子小游戏
    这篇文章主要介绍“C++怎么实现推箱子小游戏”,在日常操作中,相信很多人在C++怎么实现推箱子小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现推箱子小游戏”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • 用C语言实现简单五子棋小游戏
    本文实例为大家分享了C语言实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 在vs2019创建新项目,然后添加两个源文件test.c和game.c,接着创建一个头文件game...
    99+
    2024-04-02
  • C语言代码实现简单三子棋游戏
    三子棋是我们小时候经常玩的游戏,今天就分享一下如何用c语言简单实现三子棋吧 编译软件VS2019 c语言实现三子棋运用到了二维数组的知识,在编写三子棋程序时用到了多文件编译(不是必须...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作