C++案例:C++版生命游戏
【摘要】
目录
一、生命游戏
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 <iostream>
-
#include <istream>
-
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;
-
}
-
-
return 0;
-
}
6、运行程序,查看结果
三、尝试生命游戏其它初始布局
文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。
原文链接:howard2005.blog.csdn.net/article/details/79294248
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)