Influence

3 min read Original article ↗
gameGrid = function(gridSize) { var i; window.a = []; this.size = gridSize; this.map = []; for (i = 0; i < this.size; i++) { this.map[i] = []; } }; //Initial configuration is built by using the Math.random() function. //For this sample, I used N for NCSU, U for UNC, D for Duke. gameGrid.prototype.randomConfig = function() { var y, x, i; for (y = 0; y < this.size; y++) { for (x = 0; x < this.size; x++) { var rand = Math.random() * 90; if (Math.floor(rand) > 60) { i = "D"; } else if (Math.floor(rand) > 30 && Math.floor(rand)<60 ) { i = "U"; } else { i = "N"; } x = x % this.size; y = y % this.size; this.map[x][y] = i; } } }; //We assume that the grid has no borders. gameGrid.prototype.get = function(x, y) { x = (this.size + x) % this.size; y = (this.size + y) % this.size; return this.map[x][y]; }; gameGrid.prototype.neighborFan = function(x, y) { var count = {"U": 0 , "N": 0, "D":0 }; count[this.get(x + 1, y + 1)] += 1; count[this.get(x + 1, y)] += 1; count[this.get(x + 1, y - 1)] += 1; count[this.get(x , y - 1)] += 1; count[this.get(x - 1, y - 1)] += 1; count[this.get(x - 1, y)] += 1; count[this.get(x - 1, y + 1)] += 1; count[this.get(x, y + 1)] += 1; return count; }; //Rules are below. They are // 1. Camaraderie : If I have atleast 4 fans of the same team. I do not change. Else, // 2. Influence: If I am surrounded by fans of opponent teams, I pick the largest fanbase. // 3. Indesicion: If I am surrounded by fans of opponent teams and two of them are equal, I pick randomly. // Fun fact: For Camaraderie I started out with atleast 3 of the same team, but this is more interesting visually. gameGrid.prototype.generateStep = function() { var i, x, y, newMap = []; for (i = 0; i < this.size; i++) { newMap[i] = []; } for (y = 0; y < this.size; y++) { for (x = 0; x < this.size; x++) { newMap[x][y] = this.get(x, y); if (this.neighborFan(x,y)[this.get(x,y)] > 3) { newMap[x][y] = this.get(x,y); } else { var maxProp = null, data = this.neighborFan(x,y), maxVal = -1; for (var school in data) { if (data[school] > maxVal) { maxVal = data[school]; maxProp = school; } else if (data[school] === maxVal){ var coinToss = Math.floor( Math.random() * 2 ); if (coinToss > 0) { maxVal = data[school]; maxProp = school; } } }; newMap[x][y] = maxProp; } } } this.map = newMap; }; var test = new gameGrid(30, 30); test.randomConfig(); var table = document.getElementById('output'); var plot = function() { table.innerHTML = ""; for (var r = 0; r < test.map.length; r++) { var row = table.insertRow(-1); for (var c = 0; c < test.map[r].length; c++) { var cell = row.insertCell(-1); cell.appendChild(document.createTextNode(test.map[r][c] )); if (test.map[r][c] === "N") { cell.style.backgroundColor= "#CC0000"; } else if (test.map[r][c] === "D") { cell.style.backgroundColor= "#001A57"; } else { cell.style.backgroundColor="#56A0D3"; } } } }; var timeStep = function() { test.generateStep(); plot(); }; window.timeStep = timeStep; plot();