-
Notifications
You must be signed in to change notification settings - Fork 44
hw #48
base: gh-pages
Are you sure you want to change the base?
hw #48
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
.node { | ||
width:50px; | ||
height:50px; | ||
display: inline-block; | ||
margin: 10px; | ||
padding:10px; | ||
cursor:pointer; | ||
background-color: #A0A0A0; | ||
} | ||
|
||
.node span { | ||
font-size:50px; | ||
text-align: center; | ||
visibility: hidden; | ||
display: block; | ||
text-align: center; | ||
} | ||
|
||
.node:hover { | ||
background-color: blue; | ||
} | ||
|
||
.node.active { | ||
background-color: blue; | ||
cursor: default; | ||
} | ||
|
||
.node.active span { | ||
visibility: visible; | ||
} | ||
|
||
|
||
.shake { | ||
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both; | ||
transform: translate3d(0, 0, 0); | ||
backface-visibility: hidden; | ||
perspective: 1000px; | ||
} | ||
|
||
@keyframes shake { | ||
10%, 90% { | ||
transform: translate3d(-1px, 0, 0); | ||
} | ||
|
||
20%, 80% { | ||
transform: translate3d(2px, 0, 0); | ||
} | ||
|
||
30%, 50%, 70% { | ||
transform: translate3d(-4px, 0, 0); | ||
} | ||
|
||
40%, 60% { | ||
transform: translate3d(4px, 0, 0); | ||
} | ||
} | ||
|
||
.flash { | ||
-webkit-animation: flash linear .5s; | ||
animation: flash linear .5s; | ||
} | ||
@-webkit-keyframes flash { | ||
0% { opacity: 1; } | ||
50% { opacity: .1; } | ||
100% { opacity: 1; } | ||
} | ||
@keyframes flash { | ||
0% { opacity: 1; } | ||
50% { opacity: .1; } | ||
100% { opacity: 1; } | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,14 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<title>Memory exercise</title> | ||
<title>Memory exercise</title> | ||
<link rel="stylesheet" type="text/css" href="index.css"></style> | ||
</head> | ||
<body> | ||
Grid: <input id="rows" type="number" placeholder="rows" value="4"> X <input id="columns" type="number" placeholder="rows" value="4"> | ||
<button id="generate">Randomize</button> | ||
<div id="board"></div> | ||
<canvas id="canvasBoard" width="500" height="500"> | ||
<script type="text/javascript" src="index.js"></script> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,225 @@ | ||
function hasClass(el, className) { | ||
if (el.classList) { | ||
return el.classList.contains(className); | ||
} else { | ||
return !!el.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)')); | ||
} | ||
} | ||
|
||
function addClass(el, className) { | ||
if (el.classList) { | ||
el.classList.add(className); | ||
} | ||
else if (!hasClass(el, className)) { | ||
el.className += " " + className; | ||
} | ||
} | ||
|
||
function removeClass(el, className) { | ||
if (el.classList) { | ||
el.classList.remove(className); | ||
} else if (hasClass(el, className)) { | ||
var reg = new RegExp('(\\s|^)' + className + '(\\s|$)'); | ||
el.className=el.className.replace(reg, ' '); | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shows why jQuery is useful, eh? 😉 Did you write these from scratch? If not, please mention your source! |
||
|
||
//board class | ||
var Board = function(x,y, drawingBoard) { | ||
this.checkErrors(x,y,drawingBoard); | ||
this.drawingBoard = drawingBoard; | ||
this.x = x; | ||
this.y = y; | ||
this.activeItems = []; | ||
this.items = this.randomizeBoardPieces(x,y); | ||
drawingBoard.draw(this); | ||
}; | ||
|
||
Board.prototype.checkErrors = function(x,y,drawingBoard) { | ||
if (x <= 0) { | ||
throw new Error('Rows must be greater than 0'); | ||
|
||
} | ||
if (y <= 0) { | ||
throw new Error('Columsn must be greater than 0'); | ||
} | ||
if (x*y % 2 !== 0) { | ||
throw new Error('You really should have an even number of pieces, or you will never win'); | ||
} | ||
if (x*y > 26) { | ||
throw new Error('Currently you can not go higher than alphabet letters. 26 Boxes is Max'); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, since each letter is duplicated, it would be 26*2, right? |
||
}; | ||
|
||
Board.prototype.selectNode = function(index) { | ||
this.activeItems.push(index); | ||
this.compare(); | ||
}; | ||
|
||
Board.prototype.compare = function() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just to make it more clear, I would call this |
||
var items = this.items, activeItems = this.activeItems; | ||
if (activeItems.length === 2 && items[activeItems[0]] === items[activeItems[1]]) { | ||
this.matchSuccess(); | ||
} else if (activeItems.length === 2) { | ||
this.reset(true); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since you're using the same condition twice, I would rewrite as if (activeItems.length === 2) {
if (items[activeItems[0]] === items[activeItems[1]]) {
this.matchSuccess();
} else {
this.reset(true);
}
} There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You might also break that longer conditional out into a function, e.g. |
||
}; | ||
|
||
Board.prototype.matchSuccess = function() { | ||
this.drawingBoard.matchSuccess(); | ||
this.reset(false); | ||
}; | ||
|
||
Board.prototype.randomizeBoardPieces = function(x,y) { | ||
var pieces = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; | ||
var totalNodeSets = x*y/2; | ||
var sets = pieces.splice(0,totalNodeSets); | ||
var nodes = this.shuffleArray(sets.concat(sets)); | ||
return nodes; | ||
}; | ||
|
||
Board.prototype.shuffleArray = function(array) { | ||
var i = 0, j = 0, temp = null; | ||
|
||
for (i = array.length - 1; i > 0; i -= 1) { | ||
j = Math.floor(Math.random() * (i + 1)); | ||
temp = array[i]; | ||
array[i] = array[j]; | ||
array[j] = temp; | ||
} | ||
return array; | ||
}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ditto about citing your source, if you got this from elsewhere. |
||
|
||
Board.prototype.reset = function(removeActiveElements) { | ||
var self = this; | ||
self.activeItems = []; | ||
self.drawingBoard.reset(removeActiveElements); | ||
}; | ||
|
||
var HTMLBoard = function(boardId) { | ||
this.id = boardId; | ||
this.allowClick = true; | ||
this.activeElements = []; | ||
}; | ||
|
||
HTMLBoard.prototype.reset = function(removeActiveElements) { | ||
var self = this; | ||
if (removeActiveElements) { | ||
self.allowClick = false; | ||
self.activeElements.forEach(function(elem) { | ||
|
||
addClass(elem, 'shake'); | ||
}); | ||
|
||
setTimeout(function() { | ||
self.activeElements.forEach(function(elem) { | ||
removeClass(elem, 'active'); | ||
removeClass(elem, 'shake'); | ||
}); | ||
self.activeElements = []; | ||
self.allowClick = true; | ||
}, 500); | ||
} else { | ||
self.activeElements = []; | ||
} | ||
}; | ||
|
||
HTMLBoard.prototype.draw = function(board) { | ||
var self = this; | ||
var html = ''; | ||
html += '<div class="row">'; | ||
board.items.forEach(function(item, index) { | ||
html += '<div data-id="' + index + '" class="node"><span>' + board.items[index] + '</span></div>'; | ||
if ((index+1) % board.y === 0) { | ||
html += '</div>';//close row | ||
html += '<div class="row">'; | ||
} | ||
}); | ||
|
||
html += '</div>'; | ||
document.getElementById(self.id).innerHTML = html; | ||
|
||
|
||
var clickEvent = function() { | ||
var id = Number.parseInt(this.getAttribute('data-id')); | ||
if (self.allowClick && board.activeItems.indexOf(id) === -1) { | ||
addClass(this, 'active'); | ||
self.activeElements.push(this); | ||
board.selectNode(id); | ||
} | ||
}; | ||
|
||
var memoryNodes = document.getElementsByClassName('node'); | ||
for (var m = 0; m < memoryNodes.length; m++) { | ||
memoryNodes[m].addEventListener('click', clickEvent); | ||
} | ||
}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How could you break up this function? |
||
|
||
HTMLBoard.prototype.matchSuccess = function() { | ||
this.activeElements.forEach(function(elem) { | ||
addClass(elem, 'flash'); | ||
}); | ||
}; | ||
|
||
var CanvasBoard = function(boardId) { | ||
this.id = boardId; | ||
this.allowClick = true; | ||
this.activeElements = []; | ||
}; | ||
|
||
CanvasBoard.prototype.reset = function(removeActiveElements) { | ||
var self = this; | ||
if (removeActiveElements) { | ||
self.allowClick = false; | ||
setTimeout(function() { | ||
self.activeElements.forEach(function(elem) { | ||
//reset active leemnts here | ||
}); | ||
self.activeElements = []; | ||
self.allowClick = true; | ||
}, 500); | ||
} else { | ||
self.activeElements = []; | ||
} | ||
}; | ||
|
||
CanvasBoard.prototype.draw = function(board) { | ||
var self = this; | ||
var context = document.getElementById('canvasBoard').getContext("2d"); | ||
|
||
var x =50, y=50, width= 50, height= 50; | ||
|
||
board.items.forEach(function(item, index) { | ||
context.rect(x,y,width,height); | ||
context.stroke(); | ||
//set click listeiner here | ||
x+= 60; | ||
if ((index+1) % board.y === 0) { | ||
x =50; | ||
y+= 60; | ||
} | ||
}); | ||
|
||
}; | ||
|
||
CanvasBoard.prototype.matchSuccess = function() { | ||
this.activeElements.forEach(function(elem) { | ||
//addClass(elem, 'flash'); | ||
//set active style here | ||
}); | ||
}; | ||
|
||
|
||
document.getElementById('generate').addEventListener('click', function() { | ||
var drawingBoard = new HTMLBoard('board'); | ||
//var canvasBoard = new CanvasBoard('canvasBoard'); ability to swap diff displays for any memory grid | ||
|
||
var rows = document.getElementById('rows').value; | ||
var columns = document.getElementById('columns').value; | ||
try { | ||
var board = new Board(rows,columns, drawingBoard); | ||
} catch(err) { | ||
alert(err); | ||
} | ||
|
||
}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this whole file: please be consistent with your indentation! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!