【问题标题】:My move algorithm isn't working properly我的移动算法无法正常工作
【发布时间】:2014-01-29 23:18:42
【问题描述】:

经过多次修改,我想我已经确定了我的球员在场上无法正常移动的问题的根源:

 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};

【问题讨论】:

  • 您的实际问题是什么?
  • 这段代码急需重构为几个简单的函数。
  • 我的问题是,在我刚刚发布的代码中,有一个怪癖会阻止场上(数组)上的玩家(即数字)从一个位置移动到另一个位置,我想知道它在哪里来自(哪里。就像我说的,这是我之前提出的问题的后续,重写整个程序(这是其中的一部分)已经引起了一些用户的愤怒。
  • 你知道如何使用你的调试器吗?
  • 如何精确定位特定区域(即流程)?

标签: c arrays random move


【解决方案1】:

当您可以执行以下操作时,通过查看您如何在 for 循环之外声明变量 k: for(int k=0;k &lt; teamsize; ++k) 我猜你和我一样是 C 语言的中级用户。

由于您没有在此处链接您之前发布的问题,因此我仅在此处严格执行此帖子。

我的理解是您在使用两个返回结构数据的数组teamfield 时遇到问题。

是否有可能这两个结构不兼容,或者更糟糕的是非标量数据?

将团队数组编码为二维字段数组时,线性团队数组本质上是一个表达式,其结果必须通过求值得到。尽管您拥有具有 int 返回类型的单个结构数据成员,但团队数组必须具有团队的结构返回类型才能使这些实例成为团队数组的元素。

您可能已经知道,C 的数组本质上是一个指向数组中第一个元素的指针。 C 语言的这种实现表明这两个数组位于两个不同的内存地址空间中。因此,为了获取字段数组中的数据,编译器必须遍历团队数组以获取必要的 int 数据。

仅通过思考过程,逻辑上假设应该将 int 值返回到数组位置括号,以便可以访问正确的字段数组元素。但并非一切都合乎逻辑。

由于这些非标量数​​据点的复杂性,代码很可能无法编译。

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2012-07-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2016-12-18
    相关资源
    最近更新 更多