c/c++语言开发共享随机漫步10x10arrays

我有一个问题找出这个问题的算法,已经尝试了几天没有成功,这里是我试图获得的图片:

https://sofzh.miximages.com/c/X70nX.png

这是我的代码尝试了许多不同的解决方案,但总是陷入同一点:(对不起混合语言,重要的部分是英语)

ps我不应该使用函数来解决这个问题只有循环和数组。

经过多次修复后编辑它可以行走但很少崩溃任何想法吗?

#include  #include  #include  int main(void){ char box[10][10]; int i,j; int move,row,col; char letter='A'; srand(time(NULL)); printf("ntSTARTnn"); for(i=0;i < 10 ;i++)/* righe */ { for(j=0;j < 10;j++) /* colonne */ { box[i][j] = '.'; /* assegno . a tutti gli elementi dell array */ if(j == 9) printf("%c%cn", box[i][j]); /* giustifico ogni 10 elementi dell array j(0-9) */ else printf("%c%c", box[i][j]); } } /* LETS START */ printf("nn Inizia il gioconn"); /* random place to start */ row = rand() % 9; col = rand() % 9; box[row][col]= 'A'; while(letter <= 'Z') { if(box[row+1][col] == '.' || box[row-1][col] == '.' || box[row][col+1] == '.' || box[row][col-1] == '.' ) { move=rand() % 4; switch(move){ case 0: /* Going UP */ if((row != 0) && (box[row-1][col] == '.')) { box[row-1][col]=++letter; box[row--][col]; }else{ move=rand() % 4; } case 1:/* Going Down */ if((row != 9) && (box[row+1][col] == '.')) { box[row+1][col]=++letter; box[row++][col]; }else{ move=rand() % 4; } case 2: /*Going Left */ if((col != 0) && (box[row][col-1] == '.')) { box[row][col-1]=++letter; box[row][col--]; }else{ move=rand() % 4; } case 3: /* Going Right */ if((col != 9) && (box[row][col+1] == '.') ) { box[row][col+1]=++letter; box[row][col++]; }else{ move=rand() % 4; } } }else{ printf("nnBloccato a %cnn", letter); break; } } /* FINE */ for(i=0;i<10;i++)/* righe */ { for(j=0;j<10;j++) /* colonne */ { if(j == 9) printf("%c%cn", box[i][j]); /* giustifico ogni 10 elementi dell array j(0-9) */ else printf("%c%c", box[i][j]); } } return 0; } 

    您需要更新循环内的rowcol 。 否则你总是试图从’A’的位置走。

    ……一旦所有4个方向都被填满,你就陷入无限循环

      。  。  。  。  。  。  。  B。  。  。  EAC。  。  。  D.  。 

    即使你更新循环中的rowcol (并纠正==错误),你也必须处理一个问题:假设第一个点(’A’)是左上角,下一个随机方向是东,南,南,西,北。 … 怎么办? ?

      AB。  FC。  ED。  。  。  。 

    当你进入循环。

     int direction = rand()%4; 
     int i=-1; while( ++i < 4 ) { switch(direction) { case 0: if( row-1 >= 0 && box[row-1][col] == '.' ) { --row; i = -1; } break; case 1: if( col+1 < 10 && box[row][col+1] == '.' ) { ++col; i = -1; } break; case 2: if( row+1 < 10 && box[row+1][col] == '.' ) { ++row; i = -1; } break; case 3: if( col-1 >= 0 && box[row][col-1] == '.' ) { --col; i = -1; } break; } if( i != -1 ) { direction = (direction+1)%4; } else { break; } } 
     if( i == 4 ) { break; } 
     box[row][col] = letter; 

    而且……这就是我猜的全部。 这是贪心算法,所以你不需要任何优化(至少我没有看到任何运动要求。

    如果你试图向无效的方向前进,看起来你正在突破你的switch语句,但无论如何你都会增加你的计数器。 如果发生,请尝试检查另一个随机方向。

    它究竟在哪里破裂?

    从我能看到的一眼就可以看出,It_that_walks有可能从女巫身上找到位置:

     ABCD . . IJE . . HGF . 

    J之后的地方?

    不需要&& (box[row][col-1]= '.')

    另外,它是错误的(赋值而不是比较),它应该是: && (box[row][col-1]== '.') (但你不需要它全部)

    当你发现自己无法向某个方向前进时,“重新滚动”随机数并不是一个好主意,因为如果运气不好,你会得到两次相同的数字(甚至是3或4次或更多次) – 所以即使你生成了4个随机数,但都失败了,这并不意味着你被卡住了。

    您可以通过生成一个数字来解决此问题,并尝试从它开始的所有4个可能的方向:

    如果随机数发生器返回0:检查0,1,2,3

    如果随机数发生器返回1:检查1,2,3,0

    如果随机数发生器返回2:检查2,3,0,1

    如果随机数发生器返回3:检查3,0,1,2

    通过以下代码实现:

     desired_move = rand(); success = 0; for (i = 0; i < 4 && !success; ++i) { move = (desired_move + i) % 4; switch (move) { case 0: // Go up if (row > 0 && box[row - 1][col] == '.') { row = row - 1; success = 1; } break; case 1: // Go down ... } } if (!success) // Tried all 4 directions but failed! You are stuck! { goto START_OVER; // or whatever else } 

    请注意,此算法不是非常随机:如果您不能上升,则向右或向左下降的可能性更大。 如果要修复它,可以选择4个方向的随机排列,而不是按顺序检查方向:

     const int permutation_table[24][4] = { {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 2, 1, 3}, ... {3, 2, 1, 0} }; index = rand() % 24; for (i = 0; i < 4; ++i) { move = permutation_table[index][i]; switch (move) { ... // As above } } 

      以上就是c/c++开发分享随机漫步10x10arrays相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549731.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐