C++案例:C++版生命游戏

网友投稿 579 2022-05-29

目录

一、生命游戏

1、生命游戏概述

2、生命演化规则:B3/S23

二、生命游戏C++实现

1、编写头文件life.h

2、编写C++程序life.cpp

3、编写头文件utility.h

4、编写程序文件utility.cpp

5、编写主程序文件main.cpp

6、运行程序,查看结果

三、尝试生命游戏其它初始布局

一、生命游戏

1、生命游戏概述

在研究元胞自动机理论过程中,Conway发明生命游戏(Game of Life、GoL),在上个世纪七十年代风靡一时。

这是0人游戏,即按照初始的设置,游戏自动演化。在类似围棋的棋盘中,每一个格子可以是空格或者存在一个生命/细胞/Cell;每一个格子有8个相邻的格子(正上方、正下方、右侧、左侧、左上方、右上方、左下方以及右下方),相邻的格子中存活的生命数量称为其邻居(neighbor)数。在世代交替时,所有的格子根据其邻居数,诞生新生命、Cell保持存活或者Cell死亡。

2、生命演化规则:B3/S23

一个生命如果恰好有2个或3个邻居,它会存活到下一个世代;否则,会因为孤独或拥挤而死亡。

一个空格,如果恰好有3个邻居,则诞生一个新生命。

二、生命游戏C++实现

在Dev C++里创建项目TheGameOfLife,创建头文件与C++源文件,如下图所示:

1、编写头文件life.h

const int maxrow = 20, maxcol = 60; // grid dimensions

class Life {

public:

void initialize();

void print();

void update();

private:

int grid[maxrow + 2][maxcol + 2]; // allows for two extra rows and columns

int neighbor_count(int row, int col);

};

#define DONE

#include "life.cpp"

2、编写C++程序life.cpp

#ifdef DONE

void Life::initialize()

/*Pre: None

Post: The Life object contains a configuration specified by the user.*/

{

int row, col;

for (row = 0; row <= maxrow + 1; row++)

for (col = 0; col <= maxcol + 1; col++)

grid[row][col] = 0;

cout << "List the coordinates for living cells." << endl;

cout << "Terminate the list with the special pair -1 -1" << endl;

cin >> row >> col;

while (row != -1 || col != -1) {

if (row >=1 && row <= maxrow)

if (col >=1 && col <= maxcol)

grid[row][col] = 1;

else

cout << "Column " << col << " is out of range." << endl;

else

cout << "Row " << row << " is out of range." << endl;

cin >> row >> col;

}

}

void Life::print()

/*Pre: The Life object contains a configuration.

Post: The configuration is written for the user.*/

{

int row, col;

cout << "\nThe current Life configuration is:" << endl;

for (row = 1; row <= maxrow; row++) {

for (col = 1; col <= maxcol; col++)

if (grid[row][col] == 1) cout << '*';

else cout << ' ';

cout << endl;

}

cout << endl;

}

void Life::update()

/*Pre: The Life object contains a configuration

Post: The Life object contains the next generation of configuration.*/

{

int row, col;

int new_grid[maxrow + 2][maxcol + 2];

for (row = 1; row <= maxrow; row++)

for (col = 1; col <= maxcol; col++)

switch(neighbor_count(row, col)) {

case 2:

new_grid[row][col] = grid[row][col]; // Status stays the same.

break;

case 3:

new_grid[row][col] = 1; // Cell is alive.

break;

default:

new_grid[row][col] = 0; // Cell is dead.

}

for (row = 1; row <= maxrow; row++)

for (col = 1; col <= maxcol; col++)

grid[row][col] = new_grid[row][col];

}

int Life::neighbor_count(int row, int col)

/*Pre: The Life object contains a configuration, and the coordinates row and col

define a cell inside its hedge.

Post: The number of living neighbors of the specified cell is returned.*/

{

int i, j;

int count = 0;

for (i = row - 1; i <= row + 1; i++)

for (j = col - 1; j <= col + 1; j++)

count += grid[i][j]; // Increase the count if neighbor is alive.

count -= grid[row][col]; // Reduce count, since cell is not its own neighbor.

return count;

}

#endif

3、编写头文件utility.h

#include

#include

using namespace std;

#include "life.h"

void instructions();

bool user_says_yes();

#define DONE

#include "utility.cpp"

4、编写程序文件utility.cpp

#ifdef DONE

void instructions()

/*Pre: None.

Post: Instructions for using the Life program have been printed.*/

{

cout << "Welcome to Conway's game of Life." << endl;

cout << "This game uses a grid of size " << maxrow << " by " << maxcol << " in which " << endl;

cout << "each cell can either be occupied by an organism or not." << endl;

cout << "The occupied cells change from generation to generation" << endl;

cout << "according to the number of neighboring cells which are alive." << endl;

}

bool user_says_yes()

{

int c;

bool initial_response = true;

do { // Loop until an appropriate input is received.

if (initial_response)

cout << " (y,n)? " << flush;

else

cout << "Respond with either y or n: " << flush;

do { // Ignore white space.

c = cin.get();

} while (c == '\n' || c == ' ' || c == '\t');

initial_response = false;

} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');

return(c == 'y' || c == 'Y');

}

#endif

5、编写主程序文件main.cpp

#include "utility.h"

int main() // Program to play Conway's game of Life

/*Pre: The user supplies an initial configuration of living cells.

Post: The program prints a sequence of pictures showing the changes in the

configuration of living cells according to the rules for the game of Life.

Uses: The class Life and its methods initialize(), print(), and update().

The functions instructions(); user_says_yes().*/

{

Life configuration;

instructions();

configuration.initialize();

cout << "count = " << configuration.neighbor_count(2, 3) << endl;

configuration.print();

cout << "Continue viewing new generations? " << endl;

while (user_says_yes()) {

configuration.update();

configuration.print();

cout << "Continue viewing new generations? " << endl;

}

C++案例:C++版生命游戏

return 0;

}

6、运行程序,查看结果

三、尝试生命游戏其它初始布局

5G游戏 C++

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Java核心面试宝典】Day15、“Java容器”高频面试题总结!✊✊✊
下一篇:MySQL 数据库命名规范.PDF
相关文章