2017-02-10 7 views
0

私はしばらくの間このプログラムをやろうとしてきましたが、何らかの理由で問題があります。 私は、島の中心に位置するマウスが8 * 8の2D配列を持ち、1 * 1の2D水配列と別の固定位置にある猫で囲まれたプログラムを作成することになっていますマウス)マウスは移動ごとに1つのタイルを移動でき、斜めに移動することはできません。 移動は、0,1,2,3(各数字は方向を表します)に制限された乱数ジェネレータによって決まります。マウスは100回の移動が許可され、ゲームが停止すると、マウスが猫に突き当たり(死)、右側の中央にある(脱出)、または水に入る(溺れる)ブリッジを横切ると停止するプログラムは数回実行され、死亡、脱出、溺死の回数を記録することになっています。しかし、プログラムを実行しようとするたびに死亡はゼロ、脱出はゼロ、死亡はゼロになります。ここ が私のコードです:なぜ私のコードはゲームの結果を記録できないのですか?

#include<iostream> 
#include<stdlib.h> 
#include <time.h> 
using namespace std; 
#define N 9 
#define M 9 
int direction(int x, int A[M][N], int row, int col) 
{ 
    int m; 
    if (x == 0) 
     m = A[row - 1][col]; //North 
    if (x == 1) 
     m = A[row+1][col]; //South 
    if (x == 2) 
     m = A[row][col - 1]; //West 
    if (x == 3) 
     m = A[row][col + 1]; //East 
    return m; 
} 

int main() 
{ 

    int v, S1, S2, S3, S4; 
    int Mouse, Cat, Bridge; 
    int death = 0, escape = 0, drown = 0; 
    int A[M][N]; 
    for (int a = 0;a < 10;a++) 
    { 
     for (int i = 0;i < M;i++) 
      S1 = A[i][0] = 4; 
     for (int i = 0;i < M;i++) 
      S2 = A[i][8] = 4; 
     for (int j = 0;j < N;j++) 
      S3 = A[0][j] = 4; 
     for (int j = 0;j < N;j++) 
      S4 = A[8][j] = 4; 
     for (int i = 1;i < M;i++) 
     { 
      for (int j = 1;j < N;j++) 
       A[i][j] = 0; 
     } 
     Mouse = A[4][4] = 1; //mouse 
     Cat = A[5][2] = 2; //cat 
     Bridge = A[4][8] = 3; //bridge 
     srand((unsigned)time(NULL)); 
     for (int b = 0;b < 100;b++) 
     { v = rand() % 4; 
      int m=direction(v, A, 4, 4); 
      if (m == Cat) 
      { 
       death++; 
       break; 
      } 
      else if (m == Bridge) 
      { 
       escape++; 
       break; 
      } 
      else if (m == S1 || m == S2 || m == S3 || m == S4) 
      { 
       drown++; 
       break; 
      } 
     } 
    } 
    cout << "The mouse died " << death << " times and escaped " << escape << " times and drowned " << drown << " times" << endl; 
    return 0; 
    } 
+1

に置き換えてください。私は、他の選択肢は潜在的に致命的であることを理解することができます。 – dlatikay

+0

本当に、マウスが死んでも何も印刷せずにプログラムを終了したいですか?そうでなければ、あなたのループの中にある 'return 0;'のいくつかを取り除く必要があります。 – drescherjm

+0

デバッガに精通し、コードをステップ実行します。意味論的なエラーの大半を簡単に見つけて修正することができます。 C++固有のものが残っている場合は、あなたの投稿を編集してください。 – dlatikay

答えて

-1

いくつかの問題があります:あなたは、プログラムが数回実行する必要があると述べたが、実際には一度だけ実行されます。すべての最悪のマウスは猫、ブリッジに到達、または溺れたときに、プログラムはで終了します。あなたは(あなたが望むようかのように何回も)を2回、それを実行したい場合は

return 0; 

、あなたが入れなければなりません変数の宣言の直後で、グリッドの初期化の前にループのように。

for (int a = 0;a < 2;a++) 

このように、ループを実行するたびに、カウント変数以外のすべてを再初期化します。 return(0)break;に置き換える必要があります。何か起こるたびにプログラムが実行されるたびに内側のループが終了するので、最後にカウントした出力が表示されます。

ああ、ちょうどdirectionに電話して、3番目と4番目のパラメータが「4」に固定されていることがわかりました。

...ああ...マウスはまったく動かない。グリッド内の位置も更新する必要があります。

+0

あなたの返事をありがとう。マウスの位置を更新するにはどうすればよいですか?また、私は正しい機能を使用していますか? (私はその機能がマウスの位置を変えることを望んでいた) – FlareM

+0

"方向"の意味ですか?それは、マウスが移動したいボックスに何が入っているかを確認するだけです。それは問題ありません。マウスのxとyの位置で2つの新しいint変数を宣言し、固定された4,4を使用しているすべての場所でそれらを使用する必要があります。ループの最後で、マウスの位置が0の場合はグリッドの位置を更新し、マウスのx(またはy)の値を変更した場合は、グリッドを1で再更新してください。 – Dippi

+0

申し訳ありませんが、ポイント。 – FlareM

0

マウスは初期位置から移動することはなく、マウスの近くの地形は安全です。だから何も起こりません。 コード内の小文字を

int x = 4,y=4;  // Mouse coords 
    for (int b = 0;b < 100;b++) 
    { v = rand() % 4; 
     int m=direction(v, A, x, y); 
     if (m == Cat) 
     { 
      death++; 
      break; 
     } 
     else if (m == Bridge) 
     { 
      escape++; 
      break; 
     } 
     else if (m == S1 || m == S2 || m == S3 || m == S4) 
     { 
      drown++; 
      break; 
     } 
     // Nothing happened, move the mouse 
     A[x][y] = 0;   // Clear the actual mouse location 
     if(v==0) x--; 
     if(v==1) x++; 
     if(v==2) y--; 
     if(v==4) y++; 
     A[x][y] = 1;  // Mark the mouse on the map 

    } 
+0

ohhありがとう@Enzo、私は今それを得るが、プログラムはまだ死者の数を記録していない、エスケープと終わりに溺れる? – FlareM

+0

これは完璧に今、@ Enzoに感謝していますが、プログラムを実行すると、時には "Run-time Check Failure#2-S"というデバッグエラーが発生します。 – FlareM

+0

また何らかの理由で結果がすべての死亡またはすべての死亡(100回以上の実行)である場合、「エスケープ」コードに問題があるのですか、それともマウスが脱出する可能性がありますか? – FlareM

関連する問題