C 修复我的代码中矩形的重叠,指针也有问题

C 修复我的代码中矩形的重叠,指针也有问题,c,C,我正在做一个项目,其中包括开发一个类似nethack的游戏,我只能用C语言编写(至少现在是这样)。我的想法是需要创建由句点('.')组成的房间。这些房间需要随机放置在终端中,我有一个网格(基本上是地牢)。我已经写了一些代码,希望你能更多地帮助我解决我的问题。代码发布在下面,我将详细解释它,并在下面解释我的问题 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdboo

我正在做一个项目,其中包括开发一个类似nethack的游戏,我只能用C语言编写(至少现在是这样)。我的想法是需要创建由句点('.')组成的房间。这些房间需要随机放置在终端中,我有一个网格(基本上是地牢)。我已经写了一些代码,希望你能更多地帮助我解决我的问题。代码发布在下面,我将详细解释它,并在下面解释我的问题

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include "dungeon.h"

#define HEIGHT 105
#define WIDTH 160
#define N 10

/*Declared the functions that I created.*/
void createDungeon();
bool doOverlap(point l1, point r1, point l2, point r2);
void makeRoom(room aRoom);

int main() {
    srand(time(NULL));
    createDungeon();
    return 0;
}
/*
* Created a function that initializes the dungeon. Each room struct
* has four points that make up the room, and are assigned.
*/
void createDungeon() {
    char dungeonGrid[HEIGHT][WIDTH];
    //room *rooms = malloc(10 * sizeof(room));
    //room *rooms_t = malloc(10 * sizeof(room));
    room rooms[N];
    int i, y, x, q, r, f;
    int a;
    int counter = 0;

    makeRoom(rooms[counter]);

    for (int i = 1; i < 10; i++) {
        makeRoom(rooms[i]);

        if (doOverlap(rooms[i].top_left, rooms[i].bottom_right, rooms[counter].top_left, rooms[counter].bottom_right)) {
            makeRoom(rooms[i]);
            counter++;
        }
    }


    /*for (i = 0; i < 10; i++) {
        int height = (rand() % (10 + 1 - 5)) + 5;
        int width = (rand() % (15 + 1 - 7)) + 7;

        int randomY = (rand() % (105 + 1 - 0)) + 0;
        int randomX = (rand() % (160 + 1 - 0)) + 0;

        rooms[i].top_left.y = randomY;
        rooms[i].top_left.x = randomX;
        rooms[i].top_right.y = randomY;
        rooms[i].top_right.x = randomX + width;
        rooms[i].bottom_left.y = randomY + height;
        rooms[i].bottom_left.x = randomX;
        rooms[i].bottom_right.y = randomY + height;
        rooms[i].bottom_right.x = randomX + width;


    /*Created two for loops that goes through the dungeon grid and puts a space.*/
    for (y = 0; y < HEIGHT; y++) {
        for (x = 0; x < WIDTH; x++) {
            dungeonGrid[y][x] = ' ';
        }
    }
    /*Created three for loops that go through the dungeon grid and assigns a '.' for each
    * point in the room to the grid.
    */
    for (y = 0; y < HEIGHT; y++) {
        for (x = 0; x < WIDTH; x++) {
            for (a = 0; a < 10; a++) {
                if (rooms[a].top_left.y <= y && y <= rooms[a].bottom_left.y && rooms[a].top_left.x <= x && rooms[a].top_right.x >= x) {
                    dungeonGrid[y][x] = '.';
                }
            }
        }
    }

    /*These two for loops print out every character that it finds in the dungeon grid.*/
    for (y = 0; y < HEIGHT; y++) {
        for (x = 0; x < WIDTH; x++) {
            printf("%c", dungeonGrid[y][x]);
        }
        printf("\n");
    }

}


/*Created a boolean method that deals with the rooms overlapping that takes in
* 4 points, l1 = top left point and r1 = bottom right point of the first rectangle,
* l2 = top left point, and r2 = bottom right point of the second rectangle.
*/
bool doOverlap(point l1, point r1, point l2, point r2) {
    if (l1.x > r2.x || l2.x > r1.x) {
        return false;
    }

    if (l1.y < r2.y || l2.y < r1.y) {
        return false;
    }

    return true;
}

void makeRoom(room aRoom)
{
    int height = (rand() % (10 + 1 - 5)) + 5;
    int width = (rand() % (15 + 1 - 7)) + 7;

    int randomY = (rand() % (105 + 1 - 0)) + 0;
    int randomX = (rand() % (160 + 1 - 0)) + 0;

    aRoom.top_left.y = randomY;
    aRoom.top_left.x = randomX;
    aRoom.top_right.y = randomY;
    aRoom.top_right.x = randomX + width;
    aRoom.bottom_left.y = randomY + height;
    aRoom.bottom_left.x = randomX;
    aRoom.bottom_right.y = randomY + height;
    aRoom.bottom_right.x = randomX + width;
}

正如您的标题所暗示的,问题在于您正在将数据的副本传递给makeRoom函数,而不是实际数据的指针,因此makeRoom函数中的更改不会反映在调用函数中

您可以重写makeRoom函数以接受并使用指针,如:

void makeRoom(room *aRoom)
{
    int height = (rand() % (10 + 1 - 5)) + 5;
    int width = (rand() % (15 + 1 - 7)) + 7;

    int randomY = (rand() % (105 + 1 - 0)) + 0;
    int randomX = (rand() % (160 + 1 - 0)) + 0;

    aRoom->top_left.y = randomY;
    aRoom->top_left.x = randomX;
    aRoom->top_right.y = randomY;
    aRoom->top_right.x = randomX + width;
    aRoom->bottom_left.y = randomY + height;
    aRoom->bottom_left.x = randomX;
    aRoom->bottom_right.y = randomY + height;
    aRoom->bottom_right.x = randomX + width;
}
然后调用它时,通过引用传递元素,如:

makeRoom(&rooms[counter]);

感谢你用C语言写的所有东西——你拥有了你所需要的所有控件。注意——虽然不是错误,C的标准编码风格避免了使用
camelCase
MixedCase
变量名,而保留了所有小写的名称,以便与宏和常量一起使用。好吧。。。它实际上仍然是按值传递的(这是C的全部功能),但您将结构的地址作为参数传递,因此函数中指针的副本包含与原始指针相同的地址,允许在调用者中进行更改(更多的是模拟按引用传递
:)
好的,我明白了,我很难理解这个错误:错误:在非结构或联合中请求成员“top_right”。top_right.x=randomX+width;我得到了房间的所有分数,我想这与我如何从结构中检索信息有关,但我不是sure@DavidC.Rankin这似乎是不必要的迂腐。我的意思是,你是对的,地址本身是一个值,但该地址是我们关心的数据的引用。不,使用第一个答案中的逻辑,我认为你在函数中的条件应该是
if(l1.x=l2.x&&l1.y>=r2.y&&r1.y抱歉,我认为我在前面的评论中犯了一个错误。我认为应该是:
(l1.x=l2.x&&l1.y=l2.y)
此外,我认为您希望您的循环逻辑更像:for(I=0;I<10;{makeRoom(&rooms[I]);bool overlap=false;for(counter=0;countermakeRoom(&rooms[counter]);