c++小游戏——推箱子(低级版)

背景描述:

有一个同学做大作业做不完了,让我帮他看看,但是代码没加注释,又全部混在一坨,于是我看了半个小时过后无果,当即狠下心自己写一个。于是花费了两个小时,就有了这篇文章。(第一次写小游戏,贼好玩)

复制代码必看:

1.地图可以自己设置,看define就知道地图构成了

2.地图的规格是7 * 7,不要越界(我自己也没试过)

3.游戏通关判定只有两个箱子和两个终点(不要整多了,不然自己改通关判断)

4.游戏一共是3关,想多一点自己改一下结束条件,自己写几个地图

5.由于是clion上面写的,有可能存在字符编码问题(我自己也没有解决),建议大家也用clion,教程CSDN一搜一大把

6.头文件是万能头,没有的自己改

7.好像没啥补充的了。。。想起了再补充吧

下面是代码:

#include "bits/stdc++.h"

using namespace std;

#define  a 0	//
#define  b 1	//■
#define  c 2	//木
#define  d 3	//囗
#define  e 5	//困
#define  f 6	//人
#define  g 9	//囚

int my_map[3][7][7] = {                 //地图初始化
                1,1,1,1,1,1,1,
                1,3,0,0,3,0,1,
                1,1,0,0,0,1,1,
                1,0,0,6,0,0,1,
                1,1,2,0,2,0,1,
                1,1,0,0,0,0,1,
                1,1,1,1,1,1,1,

                1,1,1,1,1,1,1,
                1,3,2,0,3,0,1,
                1,0,0,0,2,1,1,
                1,1,0,6,0,0,1,
                1,1,0,0,0,0,1,
                1,1,0,0,0,1,1,
                1,1,1,1,1,1,1,

                1,1,1,1,1,1,1,
                1,3,2,0,3,0,1,
                1,1,0,0,2,1,1,
                1,0,0,6,0,0,1,
                1,1,0,0,0,0,1,
                1,1,0,0,1,1,1,
                1,1,1,1,1,1,1

        };

int x = 3,y = 3;        //初始位置

void drawing_map(int part) {  //绘制地图
    for(int i = 0;i < 7;i++) {
        for(int j = 0;j < 7;j++) {
            if(my_map[part][i][j] == 0) {
                cout << " ";
            } else if(my_map[part][i][j] == 1) {
                cout << "■";
            } else if(my_map[part][i][j] == 2) {
                cout << "木";
            } else if(my_map[part][i][j] == 3) {
                cout << "口";
            } else if(my_map[part][i][j] == 5) {
                cout << "困";
            } else if(my_map[part][i][j] == 6) {
                cout << "人";
            } else if(my_map[part][i][j] == 9) {
                cout << "囚";
            }
        }
        cout << endl;
    }
    cout << endl;
}

void step(int *judge,int part) {           //每一步操作
    char key = getchar();        //键盘输入
    switch (key) {                 //判断输入是什么以及是否正确
        case 'D' :
        case 'd' :
            if (my_map[part][x][y + 1] == 0) {    //是否为空
                if (my_map[part][x][y] == 9) {  //是否当前为囚
                    my_map[part][x][y + 1] = 6;
                    my_map[part][x][y] = 3;
                    y++;
                } else {
                    my_map[part][x][y + 1] = 6;
                    my_map[part][x][y] = 0;
                    y++;
                }
            } else if (my_map[part][x][y + 1] == 1) {  //是否为墙
                cout << "Wrong move!" << endl;
            } else if (my_map[part][x][y + 1] == 2) {  //是否为木
                if (my_map[part][x][y] == 9) {      //是否当前为囚
                    if (my_map[part][x][y + 2] == 0) {
                        my_map[part][x][y + 2] = 2;
                        my_map[part][x][y + 1] = 6;
                        my_map[part][x][y] = 3;
                        y++;
                    } else if (my_map[part][x][y + 2] == 3) {
                        my_map[part][x][y + 2] = 5;
                        my_map[part][x][y + 1] = 6;
                        my_map[part][x][y] = 0;
                        y++;
                    } else {
                        cout << "Wrong move!" << endl;
                    }
                } else {
                    if (my_map[part][x][y + 2] == 0) {
                        my_map[part][x][y + 2] = 2;
                        my_map[part][x][y + 1] = 6;
                        my_map[part][x][y] = 0;
                        y++;
                    } else if (my_map[part][x][y + 2] == 3) {
                            my_map[part][x][y + 2] = 5;
                            my_map[part][x][y + 1] = 6;
                            my_map[part][x][y] = 0;
                            y++;
                        } else {
                            cout << "Wrong move!" << endl;
                        }
                    }
                } else if (my_map[part][x][y + 1] == 3) {  //是否为目的地
                    if (my_map[part][x][y] == 9) {      //是否当前为囚
                        my_map[part][x][y + 1] = 9;
                        my_map[part][x][y] = 9;
                        y++;
                    } else {
                        my_map[part][x][y + 1] = 9;
                        my_map[part][x][y] = 0;
                        y++;
                    }
                } else {
                    cout << "Wrong move!" << endl;
                }
                break;
                case 'w':
                case 'W' :
                    if (my_map[part][x - 1][y] == 0) {    //是否为空
                        if (my_map[part][x][y] == 9) {  //是否当前为囚
                            my_map[part][x - 1][y] = 6;
                            my_map[part][x][y] = 3;
                            x--;
                        } else {
                            my_map[part][x - 1][y] = 6;
                            my_map[part][x][y] = 0;
                            x--;
                        }
                    } else if (my_map[part][x - 1][y] == 1) {  //是否为墙
                        cout << "Wrong move!" << endl;
                    } else if (my_map[part][x - 1][y] == 2) {  //是否为木
                        if (my_map[part][x][y] == 9) {      //是否当前为囚
                            if (my_map[part][x - 2][y] == 0) {
                                my_map[part][x - 2][y] = 2;
                                my_map[part][x - 1][y] = 6;
                                my_map[part][x][y] = 3;
                                x--;
                            } else if (my_map[part][x - 2][y] == 3) {
                                my_map[part][x - 2][y] = 5;
                                my_map[part][x - 1][y] = 6;
                                my_map[part][x][y] = 0;
                                x--;
                            } else {
                                cout << "Wrong move!" << endl;
                            }
                        } else {
                            if (my_map[part][x - 2][y] == 0) {
                                my_map[part][x - 2][y] = 2;
                                my_map[part][x - 1][y] = 6;
                                my_map[part][x][y] = 0;
                                x--;
                            } else if (my_map[part][x - 2][y] == 3) {
                                my_map[part][x - 2][y] = 5;
                                my_map[part][x - 1][y] = 6;
                                my_map[part][x][y] = 0;
                                x--;
                            } else {
                                cout << "Wrong move!" << endl;
                            }
                        }
                    } else if (my_map[part][x - 1][y] == 3) {  //是否为目的地
                        if (my_map[part][x][y] == 9) {      //是否当前为囚
                            my_map[part][x - 1][y] = 9;
                            my_map[part][x][y] = 9;
                            x--;
                        } else {
                            my_map[part][x - 1][y] = 9;
                            my_map[part][x][y] = 0;
                            x--;
                        }
                    } else {
                        cout << "Wrong move!" << endl;
                    }
            break;
        case 'a' :
        case 'A' :
            if (my_map[part][x][y - 1] == 0) {    //是否为空
                if (my_map[part][x][y] == 9) {  //是否当前为囚
                    my_map[part][x][y - 1] = 6;
                    my_map[part][x][y] = 3;
                    y--;
                } else {
                    my_map[part][x][y - 1] = 6;
                    my_map[part][x][y] = 0;
                    y--;
                }
            } else if (my_map[part][x][y - 1] == 1) {  //是否为墙
                cout << "Wrong move!" << endl;
            } else if (my_map[part][x][y - 1] == 2) {  //是否为木
                if (my_map[part][x][y] == 9) {      //是否当前为囚
                    if (my_map[part][x][y - 2] == 0) {
                        my_map[part][x][y - 2] = 2;
                        my_map[part][x][y - 1] = 6;
                        my_map[part][x][y] = 3;
                        y--;
                    } else if (my_map[part][x][y - 2] == 3) {
                        my_map[part][x][y - 2] = 5;
                        my_map[part][x][y - 1] = 6;
                        my_map[part][x][y] = 0;
                        y--;
                    } else {
                        cout << "Wrong move!" << endl;
                    }
                } else {
                    if (my_map[part][x][y - 2] == 0) {
                        my_map[part][x][y - 2] = 2;
                        my_map[part][x][y - 1] = 6;
                        my_map[part][x][y] = 0;
                        y--;
                    } else if (my_map[part][x][y - 2] == 3) {
                        my_map[part][x][y - 2] = 5;
                        my_map[part][x][y - 1] = 6;
                        my_map[part][x][y] = 0;
                        y--;
                    } else {
                        cout << "Wrong move!" << endl;
                    }
                }
            } else if (my_map[part][x][y - 1] == 3) {  //是否为目的地
                if (my_map[part][x][y] == 9) {      //是否当前为囚
                    my_map[part][x][y - 1] = 9;
                    my_map[part][x][y] = 9;
                    y--;
                } else {
                    my_map[part][x][y - 1] = 9;
                    my_map[part][x][y] = 0;
                    y--;
                }
            } else {
                cout << "Wrong move!" << endl;
            }
            break;
        case 's' :
        case 'S' :
            if (my_map[part][x + 1][y] == 0) {    //是否为空
                if (my_map[part][x][y] == 9) {  //是否当前为囚
                    my_map[part][x + 1][y] = 6;
                    my_map[part][x][y] = 3;
                    x++;
                } else {
                    my_map[part][x + 1][y] = 6;
                    my_map[part][x][y] = 0;
                    x++;
                }
            } else if (my_map[part][x + 1][y] == 1) {  //是否为墙
                cout << "Wrong move!" << endl;
            } else if (my_map[part][x + 1][y] == 2) {  //是否为木
                if (my_map[part][x][y] == 9) {      //是否当前为囚
                    if (my_map[part][x + 2][y] == 0) {
                        my_map[part][x + 2][y] = 2;
                        my_map[part][x + 1][y] = 6;
                        my_map[part][x][y] = 3;
                        x++;
                    } else if (my_map[part][x + 2][y] == 3) {
                        my_map[part][x + 2][y] = 5;
                        my_map[part][x + 1][y] = 6;
                        my_map[part][x][y] = 0;
                        x++;
                    } else {
                        cout << "Wrong move!" << endl;
                    }
                } else {
                    if (my_map[part][x + 2][y] == 0) {
                        my_map[part][x + 2][y] = 2;
                        my_map[part][x + 1][y] = 6;
                        my_map[part][x][y] = 0;
                        x++;
                    } else if (my_map[part][x + 2][y] == 3) {
                        my_map[part][x + 2][y] = 5;
                        my_map[part][x + 1][y] = 6;
                        my_map[part][x][y] = 0;
                        x++;
                    } else {
                        cout << "Wrong move!" << endl;
                    }
                }
            } else if (my_map[part][x + 1][y] == 3) {  //是否为目的地
                if (my_map[part][x][y] == 9) {      //是否当前为囚
                    my_map[part][x + 1][y] = 9;
                    my_map[part][x][y] = 9;
                    x++;
                } else {
                    my_map[part][x + 1][y] = 9;
                    my_map[part][x][y] = 0;
                    x++;
                }
            } else {
                cout << "Wrong move!" << endl;
            }
            break;
    }
    int counter = 0;
    for(int i = 0;i < 7;i++) {     //判断是否通关
        for(int j = 0;j < 7;j++) {
            if(my_map[part][i][j] == 5) {
               counter++;
            }
        }
    }
    if(counter == 2) {
        *judge = 1;
    }
}

void gaming(int part) {         //游戏主体程序
    system("cls");
    int judge = 0;
    cout << "Part " << part + 1 << ": " << endl;
    while(judge == 0) {
        drawing_map(part);
        step(&judge,part);
    }
    x = 3;      //重置!!!很重要
    y = 3;
}



int main() {
    int part = 0;        //关卡计数
    while(true) {
        if(part == 3) {
            cout << "恭喜你通关了!" << endl;
            break;
        }
        gaming(part);
        part++;
    }
    return 0;
}

Ps : 代码中step函数写得很冗余,我自己都看得眼花缭乱,鉴于我水平就那样,将就看吧

(不是屎山!!!可以改动的!!!但是你要有足够的耐心和细致力)