The official distribution of olcConsoleGameEngine, a tool used in javidx9's YouTube videos and projects
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
videos/OneLoneCoder_GameOfLife.cpp

153 lines
3.7 KiB

/*
OneLoneCoder.com - What are Cellular Automata? John Conway's Game Of Life
"Get lost..." - @Javidx9
Disclaimer
~~~~~~~~~~
I don't care what you use this for. It's intended to be educational, and perhaps
to the oddly minded - a little bit of fun. Please hack this, change it and use it
in any way you see fit. BUT, you acknowledge that I am not responsible for anything
bad that happens as a result of your actions. However, if good stuff happens, I
would appreciate a shout out, or at least give the blog some publicity for me.
Cheers!
Background
~~~~~~~~~~
Sometimes, its worth reflecting on the fact that from simple things can emerge
significant beauty. This is an implementaion of Game Of Life that runs in the console
Author
~~~~~~
Twitter: @javidx9
Blog: www.onelonecoder.com
Video:
~~~~~~
https://youtu.be/E7CxMHsYzSs
Last Updated: 14/07/2017
*/
#include <iostream>
using namespace std;
#include "olcConsoleGameEngine.h"
class OneLoneCoder_GameOfLife : public olcConsoleGameEngine
{
public:
OneLoneCoder_GameOfLife()
{
m_sAppName = L"Game Of Life";
}
private:
int *m_output;
int *m_state;
protected:
// Called by olcConsoleGameEngine
virtual bool OnUserCreate()
{
m_output = new int[ScreenWidth() * ScreenHeight()];
m_state = new int[ScreenWidth() * ScreenHeight()];
memset(m_output, 0, ScreenWidth() * ScreenHeight() * sizeof(int));
memset(m_state, 0, ScreenWidth() * ScreenHeight() * sizeof(int));
for (int i = 0; i < ScreenWidth()*ScreenHeight(); i++)
m_state[i] = rand() % 2;
auto set = [&](int x, int y, wstring s)
{
int p = 0;
for (auto c : s)
{
m_state[y*ScreenWidth() + x + p] = c == L'#' ? 1 : 0;
p++;
}
};
/*
// R-Pentomino
set(80, 50, L" ## ");
set(80, 51, L" ## ");
set(80, 52, L" # ");
// Gosper Glider Gun
set(60, 45, L"........................#............");
set(60, 46, L"......................#.#............");
set(60, 47, L"............##......##............##.");
set(60, 48, L"...........#...#....##............##.");
set(60, 49, L"##........#.....#...##...............");
set(60, 50, L"##........#...#.##....#.#............");
set(60, 51, L"..........#.....#.......#............");
set(60, 52, L"...........#...#.....................");
set(60, 53, L"............##.......................");
// Infinite Growth
set(20, 50, L"########.#####...###......#######.#####");
*/
return true;
}
// Called by olcConsoleGameEngine
virtual bool OnUserUpdate(float fElapsedTime)
{
//this_thread::sleep_for(50ms);
//if (!m_keys[VK_SPACE].bReleased)
// return true;
auto cell = [&](int x, int y)
{
return m_output[y * ScreenWidth() + x];
};
// Store output state
for (int i = 0; i < ScreenWidth()*ScreenHeight(); i++)
m_output[i] = m_state[i];
for (int x = 1; x < ScreenWidth() - 1; x++)
for (int y = 1; y < ScreenHeight() - 1; y++)
{
// The secret of artificial life =================================================
int nNeighbours = cell(x - 1, y - 1) + cell(x - 0, y - 1) + cell(x + 1, y - 1) +
cell(x - 1, y + 0) + 0 + cell(x + 1, y + 0) +
cell(x - 1, y + 1) + cell(x + 0, y + 1) + cell(x + 1, y + 1);
if (cell(x, y) == 1)
m_state[y*ScreenWidth() + x] = nNeighbours == 2 || nNeighbours == 3;
else
m_state[y*ScreenWidth() + x] = nNeighbours == 3;
// ===============================================================================
if (cell(x, y) == 1)
Draw(x, y, PIXEL_SOLID, FG_WHITE);
else
Draw(x, y, PIXEL_SOLID, FG_BLACK);
}
return true;
}
};
int main()
{
// Seed random number generator
srand(clock());
// Use olcConsoleGameEngine derived app
OneLoneCoder_GameOfLife game;
game.ConstructConsole(160, 100, 8, 8);
game.Start();
return 0;
}