修改结构数组时递归
Recursion with array of struct while modifying it
我正在使用 ncurses 库在 C 中重新创建一个名为“Bubble Blast 2”的游戏(在 Play 商店中找到,您可以在 YT 上观看)。
我已经编写了游戏的物理代码,我需要一个代码来计算解决游戏的最少步骤。
游戏中的所有内容都保存在一个结构中,我还需要用它来计算递归函数中的移动。
随着游戏的进行,该结构由游戏物理修改。
递归函数必须(至少我认为)使用相同的游戏物理代码(修改结构)。
如果结构体被游戏物理修改了,我该如何在递归中使用它?
这是游戏结构:
struct game;
typedef struct point {
int x;
int y;
} POINT, *POINT_P;
typedef struct bubble {
POINT point;
int state;
} BUBBLE, *BUBBLE_P;
typedef struct bubbles {
BUBBLE* bubbles;
int length;
int allocated;
} BUBBLES, *BUBBLES_P;
typedef struct projectile {
POINT point;
char direction;
int restoreChar;
int restoreColor;
} PROJECTILE, *PROJECTILE_P;
typedef struct projectiles {
PROJECTILE* projectiles;
int length;
int allocated;
} PROJECTILES, *PROJECTILES_P;
typedef struct game {
BUBBLES bubbles;
PROJECTILES projectiles;
int rows;
int columns;
int selected;
int array[6][5];
int moves;
int minMoves;
bool finished;
bool movesCalc;
} GAME, *GAME_P;
我认为不需要其余代码,因为它只是游戏的物理特性,您只需要知道它会在您玩游戏时修改结构,但我可能错了,如果你认为更多的代码会帮助告诉我,我会尽快添加它。
So how can I use the struct in the recursion if it gets modified by the game physics?
A struct
是一个 对象 就像 int
是一个对象。您可以以相同的方式使用递归。
void foo(object bar) {
bar.member = new_value();
if (condition) {
foo(bar);
}
}
复制一个struct
效率不高,但要改进它,我们需要更多程序细节。
我的问题是如何处理既要保持游戏状态不变又要执行修改游戏状态的模拟的情况。在那种情况下,模拟涉及递归这一事实在很大程度上是无关紧要的。
在问题的一般性层面,有两种可能的解决方案:
复制游戏状态供模拟使用。此副本可能需要也可能不需要完整,具体取决于模拟和状态的详细信息。在递归的情况下,您可能需要也可能不需要在递归时制作额外的副本,这再次取决于模拟和状态的细节。 (相当于:对游戏状态进行备份,模拟完成后恢复。)
编写模拟以恢复它之前所做的更改 returns.
我正在使用 ncurses 库在 C 中重新创建一个名为“Bubble Blast 2”的游戏(在 Play 商店中找到,您可以在 YT 上观看)。
我已经编写了游戏的物理代码,我需要一个代码来计算解决游戏的最少步骤。
游戏中的所有内容都保存在一个结构中,我还需要用它来计算递归函数中的移动。
随着游戏的进行,该结构由游戏物理修改。
递归函数必须(至少我认为)使用相同的游戏物理代码(修改结构)。
如果结构体被游戏物理修改了,我该如何在递归中使用它?
这是游戏结构:
struct game;
typedef struct point {
int x;
int y;
} POINT, *POINT_P;
typedef struct bubble {
POINT point;
int state;
} BUBBLE, *BUBBLE_P;
typedef struct bubbles {
BUBBLE* bubbles;
int length;
int allocated;
} BUBBLES, *BUBBLES_P;
typedef struct projectile {
POINT point;
char direction;
int restoreChar;
int restoreColor;
} PROJECTILE, *PROJECTILE_P;
typedef struct projectiles {
PROJECTILE* projectiles;
int length;
int allocated;
} PROJECTILES, *PROJECTILES_P;
typedef struct game {
BUBBLES bubbles;
PROJECTILES projectiles;
int rows;
int columns;
int selected;
int array[6][5];
int moves;
int minMoves;
bool finished;
bool movesCalc;
} GAME, *GAME_P;
我认为不需要其余代码,因为它只是游戏的物理特性,您只需要知道它会在您玩游戏时修改结构,但我可能错了,如果你认为更多的代码会帮助告诉我,我会尽快添加它。
So how can I use the struct in the recursion if it gets modified by the game physics?
A struct
是一个 对象 就像 int
是一个对象。您可以以相同的方式使用递归。
void foo(object bar) {
bar.member = new_value();
if (condition) {
foo(bar);
}
}
复制一个struct
效率不高,但要改进它,我们需要更多程序细节。
我的问题是如何处理既要保持游戏状态不变又要执行修改游戏状态的模拟的情况。在那种情况下,模拟涉及递归这一事实在很大程度上是无关紧要的。
在问题的一般性层面,有两种可能的解决方案:
复制游戏状态供模拟使用。此副本可能需要也可能不需要完整,具体取决于模拟和状态的详细信息。在递归的情况下,您可能需要也可能不需要在递归时制作额外的副本,这再次取决于模拟和状态的细节。 (相当于:对游戏状态进行备份,模拟完成后恢复。)
编写模拟以恢复它之前所做的更改 returns.