2015-06-07 122 views
-1
#include <iostream> 
using namespace std; 

char **create_2darray(int rows, int cols){ 
    char **a; 
    a = new char *[rows]; 
    for(int i = 0;i<rows;i++){ 
     a[i]=new char[cols]; 
    } 
    return a; 
} 
char **set_2darry(int rows, int cols, char** array){ 
    char ** a = array; 
    for(int i = 0; i < rows; i++){ 
     for(int x = 0; x < cols; x++){ 
      a[i][x]= ' '; 
     } 
    } 
    return a; 
} 

char **locate_array(char ** a, int rows, int cols){ 
    a[rows][cols] = '*'; 
    return a; 
} 
char **determine(char ** a, int rows, int cols){ 
    int counter; 
    int n[1000]; 

    for(int i = 0; i< rows;i++){ 
     for(int x = 0; x< cols; x++){ 

      if(i == 0 && x == 0){ 
       if(a[i][x] == '*'){ 
        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 

        if(a[i][x+1] == '*'){ 
         n[counter]++; 

        } 
        if(a[i+1][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else if(i == 0 && x == cols-1){ 
       if(a[i][x] == '*'){ 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x-1] == '*'){ 
         n[counter]++; 
        } 

        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 
       } 

      } 
      else if(i == rows-1 && x == 0){ 
       if(a[i][x] == '*'){ 
        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i-1][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else if(i == rows-1 && x == cols-1){ 
       if(a[i][x] == '*'){ 
        if(a[i-1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 

        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else if(i == rows-1){ 
       if(a[i][x] == '*'){ 
        if(a[i-1][x-1] == '*'){ 
         n[counter]++; 

        } 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 

        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 

        if(a[i-1][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 

      } 
      else if(i == 0){ 
       if(a[i][x] == '*'){ 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 

        if(a[i][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else if(x == 0){ 
       if(a[i][x] == '*'){ 
        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i-1][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else if(x == cols-1){ 
       if(a[i][x] == '*'){ 
        if(a[i-1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 
       } 
      } 
      else { 
       if(a[i][x] == '*'){ 
        if(a[i-1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x-1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i-1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x] == '*'){ 
         n[counter]++; 
        } 
        if(a[i-1][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i][x+1] == '*'){ 
         n[counter]++; 
        } 
        if(a[i+1][x+1] == '*'){ 
         n[counter]++; 
        } 
       } 

      } 
      counter++; 
        } 
    } 
    counter = 0; 
    for(int i = 0; i< rows;i++){ 
     for(int x = 0; x< cols; x++){ 

      if(n[counter] > 3){ 
       a[i][x] = ' '; 
      } 
      else if(n[counter] == 0 || n[counter] == 1){ 
       a[i][x] = ' '; 
      } 
      else if(n[counter] == 3){ 
       a[i][x] = '*'; 
      } 
      counter++; 
     } 
    } 

     return a; 
} 

struct GOL{ 
    char** table; 
    int gen; 
    int rows; 
    int cols; 
}; 

void print_2darray(char** a, int rows, int cols){ 
    for(int i = 0; i < rows; i++){ 
     for(int x = 0; x < cols; x++){ 
      cout << a[i][x]; 
     } 
     cout << endl; 
    } 
} 

在康威生命遊戲的三個主要規則(三種主要的生活和死亡的規則):無法確定「遊戲人生」康威的正確

  1. 如果一個被佔領的細胞擁有0或1鄰居,它孤獨的死亡。
  2. 如果一個被佔用的單元有三個以上的鄰居,它會死於過度擁擠。
  3. 如果一個空單元正好有三個被佔用的相鄰單元,則會出現一個新單元來替換空單元。

順便說一下,鄰居是直接在上面,下面,右邊,左邊,右上和左邊對角線上方,右下方對角線下方的單元格。

我無法正確打印「生命遊戲」,我知道我的判斷函數有一些問題;但我不知道那裏的錯誤是..

+0

如果其中一個給定的答案是問題的接受答案,那麼您應該通過單擊答案旁邊的空白複選標記來接受它,以便它變爲綠色。如果你找到了不同的解決方案,那麼你應該在這裏描述並接受它。 – Dialecticus

回答

0

首先,變量countn必須在使用前進行初始化:

int counter = 0; 
int n[1000] = {0}; 

其次,你只檢查佔用的單元格(規則1和2)但沒有檢查空單元的代碼(規則3)。

儘管可以對現有代碼進行更改,但我的建議是編寫新代碼,以便它採用完全不同的邏輯。而不是檢查相鄰小區對當前小區的影響,更好地計算當前小區對相鄰小區的影響。 (與活細胞相鄰的陣列n中的所有細胞增加1)。代碼看起來更簡單。

對現有代碼的更改非常簡單。刪除所有if(a[i][x] == '*'),以便對活動和死亡細胞進行相鄰活細胞的計數。

0

通過讓遊戲板變得無限 - 也就是說,它可以讓你自己的生活變得更加簡單。

#include <vector> 
#include <iostream> 

struct Grid 
{ 
    std::vector< std::vector<char> > m_grid; 
    size_t m_width, m_height; 
    size_t m_turns; 

    Grid(size_t width_, size_t height_) 
     : m_width(width_), m_height(height_) 
     , m_turns(0) 
    { 
     m_grid.resize(m_width); 
     for (size_t x = 0; x < m_width; ++x) { 
      m_grid[x].resize(m_height); 
      std::fill(m_grid[x].begin(), m_grid[x].end(), ' '); 
     } 
    } 

    char& at(int w_, int h_) 
    { 
     size_t x = static_cast<size_t>((w_ + m_width) % m_width); 
     size_t y = static_cast<size_t>((h_ + m_height) % m_height); 
     return m_grid[x][y]; 
    } 

    int count(int w_, int h_) 
    { 
     return (at(w_, h_) == ' ') ? 0 : 1; 
    } 

    void turn() 
    { 
     std::vector< std::vector<char> > newGrid; 
     newGrid.resize(m_width); 
     for (size_t x = 0; x < m_width; ++x) { 
      newGrid[x].resize(m_height); 
      for (size_t y = 0; y < m_height; ++y) { 
       int counter = count(x - 1, y - 1) + count(x - 1, y) + count(x - 1, y + 1) + 
        count(x, y - 1) + count(x, y + 1) + 
        count(x + 1, y - 1) + count(x + 1, y) + count(x + 1, y + 1); 
       if (m_grid[x][y] == '*') 
        newGrid[x][y] = (counter >= 2 && counter <= 3) ? '*' : ' '; 
       else 
        newGrid[x][y] = (counter == 3) ? '*' : ' '; 
      } 
     } 
     m_grid = newGrid; 

     ++m_turns; 
    } 

    void paint() 
    { 
     std::cout << "Turns: " << m_turns << "\n"; 
     for (size_t x = 0; x < m_width; ++x) { 
      for (size_t y = 0; y < m_height; ++y) { 
       std::cout << at(x, y); 
      } 
      std::cout << "\n"; 
     } 
     std::cout << "\n"; 
    } 
}; 

int main() 
{ 
    Grid g(8, 8); 

    g.at(3, 2) = '*'; 
    g.at(3, 3) = '*'; 
    g.at(3, 4) = '*'; 
    g.at(2, 4) = '*'; 
    g.at(1, 3) = '*'; 

    for (size_t i = 0; i < 5; ++i) { 
     g.paint(); 
     g.turn(); 
    } 
    g.paint(); 
} 

儘管此代碼的工作和生產工作遊戲的生活,我已經無數避免C++成語和設施,這讓代碼非常ineffcient。如果你把它作爲測試答案,你可能會得到一個非常可疑的講師。希望它能爲您提供能夠讓您編寫自己的實現的材料。

例如:這段代碼每次都複製整個m_grid我們turn()。這可以通過使用兩個m_grid並在它們之間切換來改善。