游戏开发的第一步:推箱子

本文展示了一个使用C++编写的2D游戏模拟器,包含撞墙检测、箱子推动判定和得分点设置等功能。玩家通过wsad移动,目标是将所有箱子推到得分点以过关。游戏采用面向过程的编程思想,实现了游戏逻辑和用户输入处理。
摘要由CSDN通过智能技术生成

算是做个记录吧,
支持功能:撞墙检测,箱子推动判定(多个箱子和靠墙),得分点设置等
开发用的面向过程的思想

#include <iostream>
using namespace std;
const int NUM = 10;
struct point {
    int x;
    int y;
}pt[NUM];//表示得分点
struct box {
    int x;
    int y;
}bx[NUM];//表示箱子
const int bxnum = 2;//箱子个数

int px = 1, py = 5;

int tx, ty;//临时坐标
char maze[NUM][NUM] = {
"########",
"# .. p #",
"# oo   #",
"#      #",
"########"
};

void getinput();
void updategame();
void draw();
bool ishit(int x, int y);
bool isbox(int x, int y);

int main()
{
    pt[0].x = 1;
    pt[0].y = 2;
    pt[1].x = 1;
    pt[1].y = 3;
    bx[0].x = 2;
    bx[0].y = 2;
    bx[1].x = 2;
    bx[1].y = 3;

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 8; j++) {
            cout << maze[i][j];
        }
        cout << endl;
    }
    
    while (true) {
        int ret = 1;//游戏结束为1
        getinput();
        updategame();
        draw();
        for (int i = 0; i < bxnum; i++) {
            if (isbox(pt[i].x,pt[i].y)==0) {//只要有一个得分点的位置没有箱子,游戏继续
                ret = 0;
            }
        }
        if (ret == 1) {
            cout << "成功过关!!!" << endl;
            break;
        }
    }

    return 0;
}

bool ishit(int x,int y) {//撞墙
    int ret = 0;//未撞墙
    if (maze[x][y] == '#') {
        ret = 1;
    }
    return ret;
}
bool isbox(int x, int y) {//撞箱子
    int ret = 0;//
    if (maze[x][y] == 'o') {
        ret = 1;
    }
    return ret;
}

void movebox(int x, int y, int afx, int afy) {
    for (int i = 0; i < bxnum; i++) {
        if (bx[i].x == x && bx[i].y == y) {
            bx[i].x = afx;//箱子被推了
            bx[i].y = afy;
        }
    }
}
void getinput()//wsad移动
{   
    int isreturn = 0;
    tx=px, ty=py;
    maze[px][py] = ' ';
    char c;
    cin >> c;
    switch (c) {
        case 'w':
            px -= 1; 
            if (isbox(px, py)) {//推箱子
                if ((isbox(px - 1, py) || ishit(px - 1, py))) { //推不动:1两个箱子,2箱子撞墙
                    isreturn = 1;
                }
                else {//能推动                  
                    movebox(px, py, px - 1, py);
                }                                           
            }
            break;
        case 's':
            px += 1;
            if (isbox(px, py)) {//推箱子
                if ((isbox(px + 1, py) || ishit(px + 1, py))) { //推不动:1两个箱子,2箱子撞墙
                    isreturn = 1;
                }
                else {//能推动                  
                    movebox(px, py, px + 1, py);
                }
            }
            break;
        case 'a':
            py -= 1;
            if (isbox(px, py)) {//推箱子
                if ((isbox(px, py-1) || ishit(px, py-1))) { //推不动:1两个箱子,2箱子撞墙
                    isreturn = 1;
                }
                else {//能推动                  
                    movebox(px, py, px, py-1);
                }
            }
            break;
        case 'd':
            py += 1;
            if (isbox(px, py)) {//推箱子
                if ((isbox(px, py + 1) || ishit(px, py + 1))) { //推不动:1两个箱子,2箱子撞墙
                    isreturn = 1;
                }
                else {//能推动                  
                    movebox(px, py, px, py + 1);
                }
            }
            break;
        default:

            //出错了
            break;
    }
    if (ishit(px, py)) {
        isreturn = 1;
    }
    if (isreturn) {        
        px = tx;
        py = ty;
    }

}

void updategame()
{   
    if (px >= 0 && px < 8 && py >= 0 && py < 8) {//更新p的位置
        maze[px][py] = 'p';
    }
    for (int i = 0; i < bxnum; i++) {//
        if (maze[pt[i].x][pt[i].y]!= 'p'&& maze[pt[i].x][pt[i].y]!='o') {//更新得分点位置
            maze[pt[i].x][pt[i].y] = '.';
        }   
    }
    for (int i = 0; i < bxnum; i++) {//更新箱子位置
        maze[bx[i].x][bx[i].y] = 'o';
    }
    
}
void draw() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 8; j++) {
            cout << maze[i][j];
        }
        cout << endl;
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值