|
playAlert.content['blue'] = 'https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'; |
|
playAlert.content['green'] = 'https://s3.amazonaws.com/freecodecamp/simonSound2.mp3'; |
|
playAlert.content['red'] = 'https://s3.amazonaws.com/freecodecamp/simonSound3.mp3'; |
|
playAlert.content['yellow'] = 'https://s3.amazonaws.com/freecodecamp/simonSound4.mp3'; |
|
playAlert.content['rrr'] = 'https://cdn.rawgit.com/linuxenko/linuxenko.github.io/master/showcase/freecodecamp/alarm3.wav'; |
|
playAlert.content['win'] = 'https://cdn.rawgit.com/linuxenko/linuxenko.github.io/master/showcase/freecodecamp/win.wav'; |
|
|
|
var app = angular.module('simonApp', []); |
|
app.directive('switchable', function() { |
|
return { |
|
restrict: 'C', |
|
link : function(scope, element, attrs) { |
|
element.on('click', function() { |
|
if (attrs.selected === 'off') { |
|
attrs.$set('selected', 'on'); |
|
} else { |
|
attrs.$set('selected', 'off'); |
|
} |
|
scope.control(attrs.name, attrs.selected); |
|
}); |
|
}, |
|
template : '<span class="slide"></span>' |
|
} |
|
}); |
|
app.directive('playBtn', function() { |
|
return { |
|
restrict : 'A', |
|
link : function(scope, element, attrs) { |
|
function click(delay) { |
|
if (scope.playing !== true) { return; } |
|
playAlert(attrs.color); |
|
element.addClass('animate'); |
|
setTimeout(function() { |
|
element.removeClass('animate'); |
|
}, delay || 1000); |
|
} |
|
|
|
scope.buttons[attrs.color] = { |
|
click : click |
|
}; |
|
|
|
element.on('click', function() { |
|
if (scope.feedback === true) { |
|
scope.onClick(attrs.color); |
|
click(300); |
|
playAlert('s2'); |
|
} |
|
}); |
|
} |
|
} |
|
}); |
|
|
|
app.controller('simonCtrl', function($scope, $q) { |
|
$scope.gameVisible = true; // codepen trick |
|
$scope.display = '-'; |
|
$scope.playing = false; |
|
$scope.strict = false; |
|
$scope.feedback = false; |
|
$scope.level = 1; |
|
$scope.buttons = { blue: {}, red : {}, yellow : {}, green : {}}; |
|
$scope.lastSequence = []; |
|
|
|
|
|
function createSequence() { |
|
var s = []; |
|
var colors = Object.keys($scope.buttons); |
|
var l = $scope.level < 4 ? $scope.level : 3 + Math.round(Math.random() * 3); // make easier )) |
|
|
|
for (var i = 0; i < l; i++) { |
|
s.push(colors[Math.round(Math.random() * 3)]); |
|
} |
|
return s; |
|
} |
|
|
|
function playColor(color) { |
|
return $q(function(resolve) { |
|
setTimeout(function() { |
|
$scope.buttons[color].click(); |
|
resolve(); |
|
}, 2000); |
|
}); |
|
} |
|
|
|
function gameDelay() { |
|
return $q(function(resolve) { |
|
setTimeout(function() { |
|
resolve(); |
|
}, 1000); |
|
}); |
|
} |
|
|
|
function playSequence(seq) { |
|
return seq.reduce(function(p,c) { |
|
return p.then(function() { return playColor(c); }); |
|
}, $q(function(resolve){resolve();})); |
|
} |
|
|
|
function startLevel(level) { |
|
$scope.level = level; |
|
$scope.display = '' + $scope.level; |
|
$scope.lastSequence = createSequence(); |
|
$scope.feedback = false; |
|
//$scope.$apply(); |
|
|
|
gameDelay().then(function() { |
|
playAlert('win'); |
|
playSequence($scope.lastSequence).then(function() { |
|
gameDelay().then(function() { |
|
$scope.feedback = true; |
|
}); |
|
}); |
|
}); |
|
} |
|
|
|
function resetGame() { |
|
$scope.display = '!'; |
|
$scope.level = 1; |
|
$scope.feedback = false; |
|
//$scope.$apply(); |
|
} |
|
|
|
function isWrongAnswer(color) { |
|
return $scope.lastSequence[0] !== color; |
|
} |
|
|
|
$scope.onClick = function(color) { |
|
if (isWrongAnswer(color) === false) { |
|
$scope.lastSequence.shift(); |
|
if ($scope.lastSequence.length === 0) { |
|
startLevel($scope.level + 1); |
|
} |
|
} else { |
|
$scope.feedback = false; |
|
gameDelay().then(function() { |
|
playAlert('rrr'); |
|
if ($scope.strict === true) { |
|
resetGame(); |
|
startLevel(1); |
|
} else { |
|
startLevel($scope.level); |
|
} |
|
}); |
|
} |
|
} |
|
|
|
$scope.control = function(name, val) { |
|
if (name === 'game') { |
|
$scope.playing = val === 'on' ? true : false; |
|
if (val === 'on') { |
|
startLevel(1); |
|
} else { |
|
resetGame(); |
|
$scope.display = '-'; |
|
} |
|
} |
|
|
|
if (name === 'strict') { |
|
$scope.strict = val === 'on' ? true : false; |
|
} |
|
} |
|
}); |