1. 程式人生 > 實用技巧 >Opencv - Conway's Game Of Life(Gosper glider gun)

Opencv - Conway's Game Of Life(Gosper glider gun)

  程式碼:

#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"

using namespace cv;
using std::string;
using std::vector;
using std::pair;

vector<pair<int, int>> points{ {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };

void gameOfLife(Mat& board) {
    Mat copy = board;
    for (int i = 0; i < copy.size().width; i++)
    {
        for (int j = 0; j < copy.size().height; j++)
        {
            int count = 0;
            for (auto p : points)
            {
                int x = i + p.first,
                    y = j + p.second;
                if (x < 0 || x >= copy.size().width || y < 0 || y >= copy.size().height)
                    continue;
                count += (int)copy.at<float>(x, y);
            }
            if ((int)copy.at<float>(i, j) == 1)
            {
                if (count < 2) board.at<float>(i, j) = 0;
                else if (count > 3) board.at<float>(i, j) = 0;
            }
            else
            {
                if (count == 3) board.at<float>(i, j) = 1;
            }
        }
    }
}

int main()
{
    Mat b = Mat::zeros(Size(64, 64), CV_32FC1);
    b.at<float>(9, 13) = 1;
    b.at<float>(9, 14) = 1;
    b.at<float>(10, 12) = 1;
    b.at<float>(10, 16) = 1;
    b.at<float>(11, 11) = 1;
    b.at<float>(11, 17) = 1;
    b.at<float>(12, 11) = 1;
    b.at<float>(12, 15) = 1;
    b.at<float>(12, 17) = 1;
    b.at<float>(12, 18) = 1;
    b.at<float>(13, 11) = 1;
    b.at<float>(13, 17) = 1;
    b.at<float>(14, 12) = 1;
    b.at<float>(14, 16) = 1;
    b.at<float>(15, 13) = 1;
    b.at<float>(15, 14) = 1;

    b.at<float>(7, 25) = 1;
    b.at<float>(8, 23) = 1;
    b.at<float>(8, 25) = 1;
    b.at<float>(9, 21) = 1;
    b.at<float>(9, 22) = 1;
    b.at<float>(10, 21) = 1;
    b.at<float>(10, 22) = 1;
    b.at<float>(11, 21) = 1;
    b.at<float>(11, 22) = 1;
    b.at<float>(12, 23) = 1;
    b.at<float>(12, 25) = 1;
    b.at<float>(13, 25) = 1;

    b.at<float>(9, 35) = 1;
    b.at<float>(9, 36) = 1;
    b.at<float>(10, 35) = 1;
    b.at<float>(10, 36) = 1;

    b.at<float>(11, 1) = 1;
    b.at<float>(11, 2) = 1;
    b.at<float>(12, 1) = 1;
    b.at<float>(12, 2) = 1;
    for (;;)
    {
        gameOfLife(b);
        
        Mat f;
        resize(b, f, Size(600, 600));
        imshow("tv", f);
	if (waitKey(60) == 27) break;
    }
    return 0;
}