利用VS中C++控制台实现小游戏---推箱子

#include <Windows.h>
#include <iostream>

using namespace std;

#define KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code)&0X8000?1:0)

//场景内节点相关结构体
struct SData
{
    int nPlayX;
    int nPlayY;
    int nPlayXB;
    int nPlayYB;
};

//游戏界面状态常量
enum GameState
{
    E_GS_MENU,
    E_GS_START,
    E_GS_SET,
    E_GS_EXIT,
};

//游戏菜单状态常量
enum MenuState
{
    E_MS_START,
    E_MS_SET,
    E_MS_EXIT,
};

int main()
{
    //游戏地图数组
    int nGameMap[15][20] =
    {
        1,1,1,1,1,1,1,1,1,1,1,1,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,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    };
    //游戏菜单状态
    int nMenuState = 0;
    //游戏界面状态
    int nGameState = 0;
    //创建玩家结构体
    SData play;
    //玩家坐标
    play.nPlayX = 2;
    play.nPlayY = 2;
    //玩家之前坐标
    play.nPlayXB = 2;
    play.nPlayYB = 2;
    //创建箱子结构体
    SData arrBox[3];
    //箱子坐标
    arrBox[0].nPlayX = 5;
    arrBox[0].nPlayY = 10;
    arrBox[1].nPlayX = 7;
    arrBox[1].nPlayY = 7;
    arrBox[2].nPlayX = 17;
    arrBox[2].nPlayY = 12;
    //记录被推动箱子编号
    int nBoxTemp = 0;

    while (true)
    {
        CONSOLE_CURSOR_INFO cursor; //定义结构体 控制台光标信息
        cursor.bVisible = 0; //设置不显示
        cursor.dwSize = 1;
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor); //设置光标信息
        COORD coord = { 0,0 };
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
        Sleep(100);

        //向下移动游戏菜单选项光标
        if (KEY_DOWN(VK_DOWN))
        {
            nMenuState++;
            if (nMenuState > 2)
            {
                nMenuState = 0;
            }
        }

        //向上移动游戏菜单选项光标
        if (KEY_DOWN(VK_UP))
        {
            nMenuState--;
            if (nMenuState < 0)
            {
                nMenuState = 2;
            }
        }

        //游戏菜单界面
        if (E_GS_MENU == nGameState)
        {
            //切换到游戏开始选项
            if (E_MS_START == nMenuState)
            {
                cout << "->游戏开始" << endl;
                cout << "  游戏设置" << endl;
                cout << "  游戏结束" << endl;
                //点击回车 进入游戏开始界面
                if (KEY_DOWN(VK_RETURN))
                {
                    nGameState = 1;
                    system("cls");
                }
            }

            //切换到游戏设置选项
            if (E_MS_SET == nMenuState)
            {
                cout << "  游戏开始" << endl;
                cout << "->游戏设置" << endl;
                cout << "  游戏结束" << endl;
                //点击回车 进入游戏设置界面
                if (KEY_DOWN(VK_RETURN))
                {
                    nGameState = 2;
                    system("cls");
                }
            }

            //切换到游戏结束选项
            if (E_MS_EXIT == nMenuState)
            {
                cout << "  游戏开始" << endl;
                cout << "  游戏设置" << endl;
                cout << "->游戏结束" << endl;
                //点击回车 进入游戏结束界面
                if (KEY_DOWN(VK_RETURN))
                {
                    nGameState = 3;
                    system("cls");
                }
            }
        }

        //游戏开始界面
        if (E_GS_START == nGameState)
        {
            //记录玩家之前坐标
            play.nPlayXB = play.nPlayX;
            play.nPlayYB = play.nPlayY;

            //记录箱子之前坐标
            for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
            {
                arrBox[i].nPlayXB = arrBox[i].nPlayX;
                arrBox[i].nPlayYB = arrBox[i].nPlayY;
            }

            //方向键控制玩家坐标
            if (KEY_DOWN(VK_UP))
            {
                play.nPlayY--;
            };

            if (KEY_DOWN(VK_DOWN))
            {
                play.nPlayY++;
            };

            if (KEY_DOWN(VK_LEFT))
            {
                play.nPlayX--;
            };

            if (KEY_DOWN(VK_RIGHT))
            {
                play.nPlayX++;
            };

            //实现推箱子
            for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
            {
                if (arrBox[i].nPlayX == play.nPlayX && arrBox[i].nPlayY == play.nPlayY)
                {
                    nBoxTemp = i;
                    arrBox[i].nPlayX += play.nPlayX - play.nPlayXB;
                    arrBox[i].nPlayY += play.nPlayY - play.nPlayYB;
                    break;
                }
            }

            //如果箱子进入墙,则返回箱子和玩家之前坐标
            if (1 == nGameMap[arrBox[nBoxTemp].nPlayY][arrBox[nBoxTemp].nPlayX])
            {
                arrBox[nBoxTemp].nPlayX = arrBox[nBoxTemp].nPlayXB;
                arrBox[nBoxTemp].nPlayY = arrBox[nBoxTemp].nPlayYB;
                play.nPlayX = play.nPlayXB;
                play.nPlayY = play.nPlayYB;
            }

            //如果箱子和箱子重合,则返回箱子和玩家之前坐标
            for (int i = 0; i < sizeof(arrBox) / sizeof(SData); i++)
            {
                if (i == nBoxTemp)
                {
                    continue;
                }
                if (arrBox[i].nPlayX == arrBox[nBoxTemp].nPlayX && arrBox[i].nPlayY == arrBox[nBoxTemp].nPlayY)
                {
                    arrBox[nBoxTemp].nPlayX = arrBox[nBoxTemp].nPlayXB;
                    arrBox[nBoxTemp].nPlayY = arrBox[nBoxTemp].nPlayYB;
                    play.nPlayX = play.nPlayXB;;
                    play.nPlayY = play.nPlayYB;
                }
            }


            //如果玩家进入墙,则返回玩家之前坐标
            if (1 == nGameMap[play.nPlayY][play.nPlayX])
            {
                play.nPlayX = play.nPlayXB;
                play.nPlayY = play.nPlayYB;
            }


            //渲染地图
            for (int i = 0; i < 15; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    //判断箱子位置
                    bool bBoxSet = false;
                    for (int k = 0; k < sizeof(arrBox) / sizeof(SData); k++)
                    {
                        if (i == arrBox[k].nPlayY && j == arrBox[k].nPlayX)
                        {
                            bBoxSet = true;
                        }
                    }
                    //初始化地图边界
                    if (1 == nGameMap[i][j])
                    {
                        cout << "■";
                    }
                    //初始化玩家
                    else if (i == play.nPlayY && j == play.nPlayX)
                    {
                        cout << "你";
                    }
                    //初始化箱子
                    else if (bBoxSet)
                    {
                        cout << "盒";
                    }
                    else
                    {
                        cout << "  ";
                    }
                }
                cout << endl;
            }
            //点击ESC 返回游戏菜单
            if (KEY_DOWN(VK_ESCAPE))
            {
                nGameState = 0;
                system("cls");
            }
        }

        //游戏设置界面
        if (E_GS_SET == nGameState)
        {
            cout << "这是设置" << endl;
            //点击ESC 返回游戏菜单
            if (KEY_DOWN(VK_ESCAPE))
            {
                nGameState = 0;
                system("cls");
            }
        }

        //游戏退出界面
        if (E_GS_EXIT == nGameState)
        {
            break;
        }
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值