经过多次修改,我想我已经确定了我的球员在场上无法正常 move 的问题根源:
for (t = 1; t <= ROUNDS; t++){
if (t % 10 == 0) {
print_game (field);
}
if (teamsize > 1){
for (m = 0; m < SIZE_TEAM; m++){
if (team [m].presence == 1){
if (team [m].direction == East){
if (team [m].y == 24){
if (field [team [m].x][team [m].y - 1] != 0){
rem (field [team [m].x][team [m].y - 1], teamsize);
field [team [m].x][team [m].y - 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y - 1] = team [m].id;
}
}
if (field [team [m].x][team [m].y + 1] != 0) {
rem (field [team [m].x][team [m].y + 1], teamsize);
field [team [m].x][team [m].y + 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y + 1] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == West){
if (team [m].y == 0){
if (field [team [m].x][team [m].y + 1] != 0){
rem (field [team [m].x][team [m].y + 1], teamsize);
field [team [m].x][team [m].y + 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y + 1] = team [m].id;
}
}
if (field [team [m].x][team [m].y - 1] != 0) {
rem (field [team [m].x][team [m].y - 1], teamsize);
field [team [m].x][team [m].y - 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y - 1] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == North){
if (team [m].x == 0){
if (field [team [m].x + 1][team [m].y] != 0){
rem (field [team [m].x + 1][team [m].y], teamsize);
field [team [m].x + 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x + 1][team [m].y] = team [m].id;
}
if (field [team [m].x - 1][team [m].y] != 0){
rem (field [team [m].x - 1][team [m].y], teamsize);
field [team [m].x - 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x - 1][team [m].y] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == South){
if (team [m].x == 24){
if (field [team [m].x - 1][team [m].y] != 0){
rem (field [team [m].x - 1][team [m].y], teamsize);
field [team [m].x - 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x - 1][team [m].y] = team [m].id;
}
if (field [team [m].x + 1][team [m].y] != 0){
rem (field [team [m].x + 1][team [m].y], teamsize);
field [team [m].x + 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x + 1][team [m].y] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
}
}
}
}
}
}
print_game (field);
return 0;
}
我怎么知道这一点?嗯,我测试了部分代码,结果很好。只有当我包含这个巨大的循环时,事情才变得复杂。 不管怎样,如果您发现任何怪癖,请告诉我。
另外,这是我的 rem 函数:
int rem (int id, int teamsize){
int k;
for (k = 0; k < teamsize; k++){
if (team [k].id == id){
team [k].presence = 0;
}
}
}
还有我的枚举:
enum move_direction {East = 1, West = 2, North = 3, South = 4};
最佳答案
通过查看如何在 for 循环之外声明变量 k,您可以执行以下操作:
for(int k=0;k < teamsize; ++k)
我猜你和我一样是 C 语言的中级用户。
由于您尚未在此处链接之前发布的问题,因此我仅在此处严格遵循此帖子。
我的理解是,您在返回结构数据的两个数组 team
时遇到了问题。和field
.
这两个结构是否可能不兼容,甚至更糟糕的非标量数据?
当你将团队数组编码为二维字段数组时,线性团队数组本质上是一个表达式,其结果必须通过求值得出。尽管您拥有 int 返回类型的各个结构数据成员,但团队数组必须具有团队的结构返回类型,以便这些实例成为团队数组的元素。
你可能已经知道,C 的数组本质上是一个指向数组中第一个元素的指针。 C语言的这种实现表明两个数组位于两个不同的内存地址空间。因此,为了检索 field 数组中的数据,编译器必须遍历到 team 数组以检索必要的 int 数据。
仅通过思考过程,可以逻辑地假设 int 值应返回到数组位置括号,以便可以访问正确的字段数组元素。但并非所有事情都按逻辑进行。
由于这些非标量数据点非常复杂,代码很可能无法编译。
关于c - 我的 move 算法无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21444782/