栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用C语言(无GUI)实现推箱子游戏,三种难度地图可选

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用C语言(无GUI)实现推箱子游戏,三种难度地图可选

首先声明,这是本人编程实习课的大作业,肝了大半天,才算是完成了这么一个丑陋但功能尚且完善的小游戏。

笔者目前才大一,代码能力还不怎么样,写这个程序也没花太多时间。因此显然,代码在算法上应该还存在一定的优化空间,代码的格式以及注释也不是那么明了。

接下来有时间的话,应该会再打磨一下。比如完善一下代码和注释,以及尝试一下多文件编程。

欢迎各位大佬多多批评指正!

运行效果:

1.启动程序会进入主界面,可以在主界面选择三个难度不同的地图。具体操作方法如程序所示。

2.进入游戏后的操作方法就和常见的推箱子一样,另外本程序可以退出游戏或返回主页面。

 3.通关后,则会恭喜玩家成功通关,并显示走过了几个有效移动步数。若是按q退出游戏的,则只显示GAME OVER。3秒后程序关闭。

啥也不多说了,上代码:

#include
#include
#include

int MAPs[3][9][11]={{{0,0,0,1,1,1,0,0,0,0,0},
                    {0,0,0,1,4,1,0,0,0,0,0},
                    {0,0,0,1,0,1,1,1,1,1,1},
                    {1,1,1,1,3,2,3,0,0,4,1},
                    {1,4,0,0,3,3,1,1,1,1,1},
                    {1,1,1,1,1,0,1,0,0,0,0},
                    {0,0,0,0,1,0,1,0,0,0,0},
                    {0,0,0,0,1,4,1,0,0,0,0},
                    {0,0,0,0,1,1,1,0,0,0,0}},
                    {
                    {0,1,1,1,1,1,1,1,1,1,0},
                    {0,1,0,0,0,1,0,0,0,1,0},
                    {0,1,0,0,3,0,0,0,0,1,0},
                    {0,1,0,3,0,3,3,3,0,1,1},
                    {0,1,0,0,0,2,0,0,0,0,1},
                    {1,1,0,0,1,1,1,0,3,0,1},
                    {1,0,4,4,0,4,0,0,0,0,1},
                    {1,0,4,4,0,4,4,3,0,1,1},
                    {1,1,1,1,1,1,1,1,1,1,0}},
                    {
                    {0,1,1,1,1,1,1,1,0,0,0},
                    {0,1,0,0,0,0,0,1,1,1,0},
                    {1,1,3,1,1,1,0,0,0,1,0},
                    {1,0,0,0,0,2,3,3,0,1,0},
                    {1,0,4,4,1,0,3,0,1,1,0},
                    {1,1,4,4,1,0,0,0,1,0,0},
                    {1,1,1,1,1,1,1,1,1,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0}}
};//原始的图表,其中 0 代表着空白的地方; 1 代表着墙;2 代表着人;
//3 代表着箱子;4 代表着箱子的终点位置。

int map[9][11];
char difficulties[3][8]={"容易", "中等", "困难"};



//图的变化要靠自己来编写数组,通过数字来进行图的构造。
void drawmap();
int push(int tui);
void print_home(int id);
int win_bool();

int main()//主函数
{
    int ID,choice,step,tui;//ID用于表示所选地图的编号
    home:
    ID=0;
    step=0;
    do{
        print_home(ID);
        choice=getch();
        system("cls");

        switch (choice) {
            case 'w':
            case 72:
                ID--;
                if(ID<0){
                    ID+=3;
                }
                break;
            case 's':
            case 80:
                ID++;
                if(ID>2){
                    ID-=3;
                }
                break;
            default: break;
        }

    } while (choice!='r');//该循环用于现实主页面

    //将选中的矩阵赋值给map
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 11; ++j) {
            map[i][j]=MAPs[ID][i][j];
        }
    }


    do {
        drawmap();
        printf("n使用wasd或↑↓←→来移动小人,直n到把所有箱子都推到目标地点nn"
               "■墙  ♀人  ☆箱子  ◎终点nnn"
               "按h返回主界面重新开始       按q退出游戏");
        tui=getch();
        if(push(tui)){
            step++;
        }
        system("cls");
        if(tui=='h'){//输入h即返回主页面重新开始
            goto home;
        }
    } while (win_bool() && tui!='q');

    printf("GAME OVER n");
    if(!win_bool()){
        printf("恭喜通关n本次共走了%d步",step);
    }
    Sleep(3000);
    return 0;
}


//打印主界面的函数
void print_home(id){
    printf("                推箱子小游戏      nnn");
    printf("请选择地图:nn");

    for (int i = 0; i < 3; ++i) {
        if(i==id){
            printf("                  %s *nn", difficulties[i]);
        } else{
            printf("                  %snn", difficulties[i]);
        }
    }

    printf("n按ws或↑↓来选择难度        按Enter进入地图");

}

//把图形刻画出来
void drawmap()
{
    win_bool();//调用输赢的函数
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<11;j++)
        {
            switch(map[i][j])
            {
                case 0:
                    printf("  "); //空白的地方
                    break;
                    case 1:
                        printf("■"); //墙
                        break;
                        case 2:
                            printf("♀"); //人
                            break;
                            case 3:
                                printf("☆"); //箱子
                                break;
                                case 4:
                                    printf("◎"); //终点地方
                                    break;
                                    case 6:
                                        printf("♂");//人加终点位置
                                        break;
                                        case 7:
                                            printf("★") ;//箱子加终点位置
                                            break;
            }
        }
        printf("n");
    }
}


//进行小人的移动,整个移动的过程就是数组变化的过程
int push(tui)
{
    int row,caw=0,success=0;//行和列

    for(int i=0;i<9;i++){//该处循环用于确定人的位置
        for (int j=0;j<11;j++)
        {
            if(map[i][j]==2||map[i][j]==6)
            {
                row=i;
                caw=j;
            }
        }
    }

    switch(tui)
    {//上
        case 'w':
            case 72:
                // 1.人的前面是空地;
                // 2.人的前面是终点位置;
                // 3.人的前面是箱子
                //3.1.箱子的前面是空地;
                //3.2.箱子的前面是终点位置。
                if(map[row - 1][caw] == 0 || map[row - 1][caw] == 4)
                {
                    map[row][caw]-=2;
                    map[row - 1][caw]+=2;
                    success=1;
                }
                else if(map[row - 1][caw] == 3 || map[row - 1][caw] == 7)
                {
                    if(map[row - 2][caw] == 0 || map[row - 2][caw] == 4)
                    {
                        map[row][caw]-=2;
                        map[row - 1][caw]-=1;
                        map[row - 2][caw]+=3;
                        success=1;
                    }
                }
                break;

                //下
                case 's':
                    case 80://键值
                    if(map[row + 1][caw] == 0 || map[row + 1][caw] == 4)
                    {
                        map[row][caw]-=2;
                        map[row + 1][caw]+=2;
                        success=1;
                    }

                    else if(map[row + 2][caw] == 0 || map[row + 2][caw] == 4)
                    {
                        if(map[row + 1][caw] == 3 || map[row + 1][caw] == 7)
                        {
                            map[row][caw]-=2;
                            map[row + 1][caw]-=1;
                            map[row + 2][caw]+=3;
                            success=1;
                        }
                    }
                    break;
                    //左
                    case 'a':
                        case 75:
                            if(map[row][caw - 1] == 0 || map[row][caw - 1] == 4)
                            {
                                map[row][caw]-=2;
                                map[row][caw - 1]+=2;
                                success=1;
                            }

                            else if(map[row][caw - 2] == 0 || map[row][caw - 2] == 4)
                            {
                                if(map[row][caw - 1] == 3 || map[row][caw - 1] == 7)
                                {
                                    map[row][caw]-=2;
                                    map[row][caw - 1]-=1;
                                    map[row][caw - 2]+=3;
                                    success=1;
                                }
                            }
                            break;
                            //右
                            case 'd':
                                case 77:
                                    if(map[row][caw + 1] == 0 || map[row][caw + 1] == 4)
                                    {
                                        map[row][caw]-=2;
                                        map[row][caw + 1]+=2;
                                        success=1;
                                    }

                                    else if(map[row][caw + 2] == 0 || map[row][caw + 2] == 4)
                                    {
                                        if(map[row][caw + 1] == 3 || map[row][caw + 1] == 7)
                                        {
                                            map[row][caw]-=2;
                                            map[row][caw + 1]-=1;
                                            map[row][caw + 2]+=3;
                                            success=1;
                                        }
                                    }
                                    break;
        default:break;

    }
    return success;
}

//用于判断是否成功
int win_bool()
{
    int k = 0;//初始化
    for(int i=0;i<9;i++)
    {
        for (int j=0;j<11;j++)
        {
            if(map[i][j]==3)
                k++;
        }
    }
    if(k==0){
        return 0;
    } else{
        return 1;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号