parent
b586979c23
commit
482e0e15f8
@ -0,0 +1,153 @@ |
||||
/*
|
||||
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; |
||||
} |
Loading…
Reference in new issue