21xrx.com
2024-12-22 22:51:04 Sunday
登录
文章检索 我的文章 写文章
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`函数用于初始化棋盘,并启动多线程运行游戏逻辑。

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

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

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复