2013-04-04 61 views
0

從下面的解決方案看,有人可以告訴我如何實現一個函數來檢查遊戲是否結束?我試圖通過創建「int checkEndGame」循環通過電路板並返回1或0但它不起作用。函數來檢查遊戲是否已結束

頁眉:

#include <iostream> 
#include <string> 
#include <time.h> 

int generations; 
int boardWidth; 
int boardHeight; 

char** board; 
char** boardTmp; 

char deadOrAlive[] = {' ', 'x'}; 
char dead = deadOrAlive[0]; 
char alive = deadOrAlive[1]; 

char lookLeft(int i, int j) 
{ 
    if (i == 0) 
    { 
     return dead; 
    } 

    return board[i - 1][j]; 
} 

char lookRight(int i, int j) 
{ 
    if (i == boardWidth - 1) 
    { 
     return dead; 
    } 

    return board[i + 1][j]; 
} 

char lookUp(int i, int j) 
{ 
    if (j == 0) 
    { 
     return dead; 
    } 

    return board[i][j - 1]; 
} 

char lookDown(int i, int j) 
{ 
    if (j == boardHeight - 1) 
    { 
     return dead; 
    } 

    return board[i][j + 1]; 
} 

char lookUpLeft(int i, int j) 
{ 
    if (i == 0 || j == 0) 
    { 
     return dead; 
    } 

    return board[i - 1][j - 1]; 
} 

char lookUpRight(int i, int j) 
{ 
    if(i == boardWidth - 1 || j == 0) 
    { 
     return dead; 
    } 

    return board[i + 1][j + 1]; 
} 

char lookDownLeft(int i, int j) 
{ 
    if (j == boardHeight - 1 || i == 0) 
    { 
     return dead; 
    } 

    return board[i - 1][j + 1]; 
} 

char lookDownRight(int i, int j) 
{ 
    if (j == boardHeight - 1 || i == boardWidth - 1) 
    { 
     return dead; 
    } 

    return board[i + 1][j + 1]; 
} 

char ans; 

void init(); 
void setBoard(); 
void showBoard(); 
void verifyDeadOrAlive(); 
int getNeighbors(int i, int j); 
void swap(); 
void sleep(unsigned int mseconds); 
int checkEndGame(); 
void playGame(); 

C++:

#include "stdafx.h" 
#include "gameoflife.h" 

using namespace std; 

void init() 
{ 
    cout << "How many generations would you like to cycle through? "; 
    cin >> generations; 

    cout << "Specify a width for the board: "; 
    cin >> boardWidth; 

    cout << "Specify a height for the board: "; 
    cin >> boardHeight; 
} 

void setBoard() 
{ 
    srand(time(0)); 

    board = new char*[boardWidth]; 
    boardTmp = new char*[boardWidth]; 

    for (int i = 0; i < boardWidth; ++i) 
    { 
     board[i] = new char[boardHeight]; 
     boardTmp[i] = new char[boardHeight]; 

     for (int j = 0; j < boardHeight; ++j) 
     { 
      board[i][j] = deadOrAlive[rand() % generations]; 
      boardTmp[i][j] = ' '; 
     } 
    } 
} 

void showBoard() 
{ 
    system("cls"); 

    for (int j = 0; j < boardHeight; ++j) 
    { 
     for (int i = 0; i < boardWidth; ++i) 
     { 
      cout << board[i][j]; 
     } 

     cout << endl; 
    } 
} 

void verifyDeadOrAlive() 
{ 
    for (int j = 0; j < boardHeight; ++j) 
    { 
     for (int i = 0; i < boardWidth; ++i) 
     { 
      int neighbors = getNeighbors(i, j); 

      if (board[i][j] == alive) 
      { 
       if (neighbors < 2 || neighbors > 3) 
       { 
        boardTmp[i][j] = dead; 
       } 
       else 
       { 
        boardTmp[i][j] = alive; 
       } 
      } 
      else 
      { 
       if (neighbors == 3) 
       { 
        boardTmp[i][j] = alive; 
       } 
       else 
       { 
        boardTmp[i][j] = dead; 
       } 
      } 
     } 
    } 

    swap(); 
} 

int getNeighbors(int i, int j) 
{ 
    int x = 0; 

    if (lookLeft(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookRight(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookUp(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookDown(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookUpLeft(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookUpRight(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookDownLeft(i, j) == alive) 
    { 
     x++; 
    } 
    if (lookDownRight(i, j) == alive) 
    { 
     x++; 
    } 

    return x; 
} 

void swap() 
{ 
    char** tmp = board; 
    board = boardTmp; 
    boardTmp = tmp; 
} 

void sleep(unsigned int mseconds) 
{ 
    clock_t goal = mseconds + clock(); 
    while (goal > clock()); 
} 

int checkEndGame() 
{ 
    for (int j = 0; j < boardHeight; ++j) 
    { 
     for (int i = 0; i < boardWidth; ++i) 
     { 
      if (board[i][j] == dead) 
      { 
       return 1; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
    } 
} 

void playGame() 
{ 
    init(); 

    setBoard(); 

    do 
    { 
     showBoard(); 

     sleep(500); 

     verifyDeadOrAlive(); 

     checkEndGame(); 
    } 
    while (checkEndGame == 0); 
} 

int main() 
{ 
    do 
    { 
     playGame(); 

     cout << "Would you like to play again? y/n: "; 
     cin >> ans; 

     system("cls"); 
    } 
    while (ans == 'Y' || ans == 'y'); 

    return 0; 
} 
+0

「它不工作」是不是有幫助問題描述。你期望什麼*精確*實際上發生了什麼? – 2013-04-04 10:35:36

+0

將有助於瞭解將遊戲定義爲「over」的內容。 – Oren 2013-04-04 10:36:56

+0

「swap」功能有什麼作用?它在'verifyDeadOrAlive'中被調用。是否有線程創建在任何地方? – 2013-04-04 10:38:05

回答

2

你想這樣的:

int checkEndGame() 
{ 
    for (int j = 0; j < boardHeight; ++j) 
    { 
     for (int i = 0; i < boardWidth; ++i) 
     { 
      if (board[i][j] == alive) 
       return 0; 
     } 
    } 
    return 1; 
} 

你的函數返回它看到一個細胞,這是不正確的時刻。如果您看到一個活細胞,您可以放棄。但除此之外,你需要檢查每個單元格。

另外:

 checkEndGame(); 
    } 
    while (checkEndGame == 0); 

壞了。 checkEndGame將永遠不會爲零,因爲它是指向函數的指針。你想:

} 
while (checkEndGame() == 0); 
+0

+1,因爲你的判斷是正確的,但是你可以做更多的事情,並解釋爲什麼這會起作用,以及爲什麼OP的解決方案存在缺陷。 – 2013-04-04 10:39:30

0

一個 你函數應該是這樣的:

int checkEndGame() 
{ 
for (int j = 0; j < boardHeight; ++j) 
    { 
    for (int i = 0; i < boardWidth; ++i) 
    { 
     if (board[i][j] == alive){return 0; } 
    } 
    } 

return 1; 
} 

因爲你要麼找到「活」,說比賽還沒有結束,還是要經過孔板然後說遊戲結束了,因爲你沒有發現「活着」。

正如之前所說:

while(checkEndGame==0) 

不運行的功能,看看返回的值,做這樣它所做的就是檢查,如果你函數的內存地址爲0(它除非你指定它,否則絕對不會)。

運行的功能,並看到返回值,你必須寫:

while(checkEndGame()==0) 

(注意「()」結尾)