如何使敌人随机循环并在一定距离内跟随玩家? C ++控制台游戏

时间:2014-03-11 22:28:52

标签: c++ console text-based

我一直坚持试图让Z的随机移动几个小时。我的目标是什么; -

  • 让僵尸(Z)在地图周围随机移动
  • 如果他在一定距离之内,请跟随玩家(M)

我是编程的完全业余爱好者,我一定会感谢你的帮助!这是完整的代码:

#include <iostream>
#include <Windows.h>
#include <time.h>
#include <conio.h>
using namespace std;



inline void Refresh(char q[50][50]){
system("cls");
int i, j;
cout << endl;
for (i = 0; i < 50; i++) {
    cout << "\t";
    for (j = 0; j < 50; j++)
    {
        cout << q[i][j];
    }
    cout << endl;
}
}


int launch(char q[][50], int a1, int a2, int p1, int p2, int x0, int y0);

//**************************Main Function*********************************************
int main(){
char map[50][50] = {
    "#################################################",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#                                               #",
    "#################################################"
};
// my character
int x0 = 1, y0 = 1;



// Randomly make and spawn the holes
int a1, a2;
srand(time(0));
do {
    a1 = rand() % 48 - 1;
    a2 = rand() % 48 - 1;
} while (map[a1][a2] != ' ');
map[a1][a2] = 'O';

// Randomly make and spawn the zombies
int p1, p2;
srand(time(0));
do {
    p1 = rand() % 48 - 1;
    p2 = rand() % 48 - 1;
} while (map[p1][p2] != ' ');
map[p1][p2] = 'Z';


launch(map, a1, a2, p1, p2, x0, y0);

 }


int launch(char q[][50], int a1, int a2, int p1, int p2,int x0, int y0){
int over, x = x0, y = y0;
while (1) // Infinite loop
{
    _getch();

    // UP key
    if (GetAsyncKeyState(VK_UP))
    {
        x = x - 1;
    }
    // DOWN key
    else if (GetAsyncKeyState(VK_DOWN))
    {
        x = x + 1;
    }
    // LEFT key
    else if (GetAsyncKeyState(VK_LEFT))
    {
        y = y - 1;
    }
    // RIGHT key
    else if (GetAsyncKeyState(VK_RIGHT))
    {
        y = y + 1;
    }


    if (x == 0 || x == 50 || y == 0 || y == 50)  
    {
        cout << "Game Over" << endl;
        return 0;
    }

    if (x == p1 && y == p2) { // Touch the zombies
        cout << "Game Over" << endl;
        system("PAUSE");
        return 0;
    }

    if (x == a1 && y == a2) { // Touch the holes
        cout << "Game Over" << endl;
        system("PAUSE");
        return 0;
    }

    else { // the hero just moving around
        q[x0][y0] = ' ';
        q[x][y] = 'M';

        Refresh(q);
    }
    x0 = x;
    y0 = y;

}
return 0;
}

2 个答案:

答案 0 :(得分:1)

您可能缺少的是为僵尸保留一些状态,比在地图中搜索角色'Z'更容易获取。例如,将x,y坐标保存在结构中,并使用它们的数组来表示僵尸。

struct position {
    int x, y;
};

#define NUM_ZOMBIES 5;
struct position zombies[NUM_ZOMBIES];

在main中,你会创建一个围绕当前代码的简单循环来创建僵尸,而不是直接将地图中的角色设置为'Z',你设置僵尸的位置

for (int i=0; i<NUM_ZOMBIES; i++) {
    int p1, p2;
    srand(time(0));
    do {
        p1 = rand() % 48 - 1;
        p2 = rand() % 48 - 1;
    } while (map[p1][p2] != ' ');
    zombies[i] = { .x = p1, .y = p2 };
}

为方便起见,我们也可以使用播放器的位置。

struct position player = {.x = x0, .y = y0 };

然后,您可以更改“刷新”功能,将僵尸绘制到其上,方法是将僵尸添加到地图中,然后再将其打印到屏幕上。

for (int i=0; i<NUM_ZOMBIES; i++) {
    q[[zombies[i].x][zombies[i].y] = 'Z';
}

所以最后一部分是测试它们是否在范围内。你的主循环中有另一个循环,它同样循环遍历所有僵尸,比较与玩家的距离,如果它们在你想要的范围内,你就开始关注

for (int i=0; i<NUM_ZOMBIES; i++) {
    if (in_range(zombies[i], player)) {
        zombie[i] = move_towards(zombies[i], player);
    }
}

我会让你实现in_range和move_towards,但这是他们的原型来帮助你。

bool in_range(struct position zombie, struct position player);
struct position move_towards(struct position zombie, struct position player);

答案 1 :(得分:0)

“我已经尝试了,只有按下按钮才能使其工作”

这是因为您使用_getch()。首先,请注意领先的下划线。这表示该功能是Microsoft扩展。这不是问题的真正原因,但这意味着您的代码只能在Windows上运行。再说一次,你有所有GetAsyncKeyState个电话,所以无论如何这都是给定的。

真正的原因是_getch()可能会等待键盘输入。如果你没有按任何键,则没有任何反应。特别是,_getch()等待时没有(Z)ombie移动。还有另一个Microsoft函数_kbhit会告诉你如果一个键被击中(但不是哪个键);如果没有按键,您可以跳过_getch来电。

但你为什么甚至首先打电话给_getch?您没有使用返回的值。我可以预测会发生一件事情:如果你移除按键限制,你的僵尸会移动很快。你需要另一个限制。