21xrx.com
2025-04-03 02:03:24 Thursday
文章检索 我的文章 写文章
C++多线程实现的生命游戏代码
2023-06-22 07:26:38 深夜i     --     --
C++ 多线程 生命游戏 实现 代码

生命游戏(Game of Life)是一种细胞自动机,由英国数学家John Horton Conway于1970年发明。生命游戏是一个零玩家游戏,意味着它本质上是由其初始状态所决定的。每个细胞只有两种状态:生或死,每个格子周围八个格子会按照一定的规则进行演化。C++多线程可以很方便地实现生命游戏的代码。

以下是一个简单的C++多线程实现的生命游戏代码:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
const int ROW = 20, COL = 20;
const int STEPS = 10;
void print_board(int board[ROW][COL]) {
  for (int i = 0; i < ROW; i++) {
    for (int j = 0; j < COL; j++) {
      if (board[i][j] == 1)
        cout << "#";
       else
        cout << ".";
      
    }
    cout << endl;
  }
  cout << endl;
}
void update_board(int board[ROW][COL], int row_start, int row_end) {
  int new_board[ROW][COL] = {0};
  for (int i = row_start; i <= row_end; i++) {
    for (int j = 0; j < COL; j++) {
      int neighbors = 0;
      for (int ii = -1; ii <= 1; ii++) {
        for (int jj = -1; jj <= 1; jj++) {
          if (ii == 0 && jj == 0)
            continue;
          
          int ni = i + ii, nj = j + jj;
          if (ni >= 0 && ni < ROW && nj >= 0 && nj < COL && board[ni][nj] == 1) {
            neighbors++;
          }
        }
      }
      if (board[i][j] == 1 && (neighbors < 2 || neighbors > 3)) {
        new_board[i][j] = 0;
      } else if (board[i][j] == 0 && neighbors == 3) {
        new_board[i][j] = 1;
      } else {
        new_board[i][j] = board[i][j];
      }
    }
  }
  for (int i = row_start; i <= row_end; i++) {
    for (int j = 0; j < COL; j++) {
      board[i][j] = new_board[i][j];
    }
  }
}
int main() {
  int board[ROW][COL] = {0};
  board[3][4] = 1;
  board[3][5] = 1;
  board[3][6] = 1;
  board[4][6] = 1;
  board[5][5] = 1;
  thread t1(update_board, board, 0, ROW / 2 - 1);
  thread t2(update_board, board, ROW / 2, ROW - 1);
  for (int i = 0; i < STEPS; i++) {
    t1.join();
    t2.join();
    print_board(board);
    t1 = thread(update_board, board, 0, ROW / 2 - 1);
    t2 = thread(update_board, board, ROW / 2, ROW - 1);
  }
  return 0;
}

在这里,我们首先定义了游戏规格为20*20,迭代次数为10次。接着,我们定义了三个函数:`print_board`、`update_board`和`main`。其中,`print_board`函数用于打印出当前状态的棋盘;`update_board`函数用于更新棋盘上的细胞状态;`main`函数用于初始化棋盘,并启动多线程运行游戏逻辑。

具体实现中,我们使用了两个线程来处理棋盘上的不同区域。每次迭代结束后,在启动新的线程前,我们需要先等待先前的线程结束,然后再打印当前状态的棋盘。

通过多线程实现,我们可以更快地计算出每一次迭代的结果,从而让生命游戏的实现更加高效。

  
  

评论区