2017-02-10 71 views
0

我一直在試圖做這個程序一段時間,但我有一個問題,出於某種原因。 我應該做一個程序,我有一個8 * 8的2D陣列,鼠標位於1 * 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

存在一些問題:你說的程序運行應幾次,但實際上它運行一次。最糟糕的是,當鼠標到達貓,橋,或淹死,程序退出時:

return 0; 

如果你想運行兩次(或你想要的很多次),你應該把一個循環如

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

剛剛在變量聲明之後和網格初始化之前。這樣,每次運行循環時,它都會重新初始化除計數變量之外的所有內容。 然後,你應該用代替break;,這樣內部循環每次發生時都會退出,但程序仍然運行,最後你會用輸出打印輸出結果。

哦,我剛剛看到你打電話給direction,第三和第四個參數表固定爲「4」。

......哦......並且鼠標根本不動。您還應該更新網格中的位置。

+0

感謝您的回覆。我如何更新鼠標的位置?還有我使用的功能是否正確? (我希望這個功能可以改變鼠標的位置) – FlareM

+0

你的意思是「方向」功能嗎?這只是檢查鼠標想要移動的框中的內容,並沒有問題。您應該使用鼠標x和y位置聲明兩個新的int變量,並在所有使用固定4,4的位置使用它們。然後在循環結束時更新鼠標所在的網格位置,更改鼠標的x(或y)值,重新更新網格1. – Dippi

+0

對不起,但我不太瞭解你的點。 – FlareM

0

鼠標不會從初始位置移動,並且鼠標附近的地形是安全的。所以什麼都不會發生。 在代碼中替換Cicle

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謝謝@恩佐,我現在明白了,但該計劃仍然沒有記錄死亡人數,逃跑和溺水事件的最終數字? – FlareM

+0

現在完美,謝謝@Enzo,但是當我運行該程序時,它有時會給我一個調試錯誤,說「運行時檢查失敗#2-S」有什麼想法可能導致這種情況? – FlareM

+0

也出於某種原因,結果是所有的死亡或所有的淹死(超過100次運行),我有一個「逃生」代碼的問題,或者它只是一個渺茫的機會,鼠標逃脫? – FlareM

相關問題