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.

750 lines
16 KiB

var mode = 0;
document.getElementById('playSimpleSet').addEventListener('click', function(){ mode = 0;});
document.getElementById('playSimpleSetLast').addEventListener('click',function(){mode = 1;});
document.getElementById('playSetFour').addEventListener('click',function(){ mode = 2;});
document.getElementById('playSimpleSetFive').addEventListener('click', function(){mode = 3;} );
document.getElementById('playSetFive').addEventListener('click', function(){mode = 4;} );
var Game = {
cards: [],
selected: [],
score: 0,
$board: $('[data-display="game-board"]'),
$score: $('[data-display="score"]'),
$nbSets: $('[data-display="nbSets"]'),
cards1 : [],
selected1: [],
score1: 0 ,
$score1: $('[data-display="score1"]'),
$nbSets1: $('[data-display="nbSets1"]'),
$board1: $('[data-display="game-board1"]'),
cards2 : [],
selected2: [],
score2: 0 ,
$score2: $('[data-display="score2"]'),
$nbSets2: $('[data-display="nbSets2"]'),
$board2: $('[data-display="game-board2"]'),
cards3 : [],
selected3: [],
score3: 0 ,
$score3: $('[data-display="score3"]'),
$nbSets3: $('[data-display="nbSets3"]'),
$board3: $('[data-display="game-board3"]'),
cards4: [],
selected4 : [],
score4: 0,
$score4: $('[data-display="score4"]'),
$nbSets4: $('[data-display="nbSets4"]'),
$board4: $('[data-display="game-board4"]'),
deal: function() {
var self = this;
var dealRequest;
var dealRequest1;
var dealRequest2;
var dealRequest3;
var dealRequest4;
// ajax request to get initial set of cards
dealRequest = $.ajax({
url: 'set.php?action=deal',
type: 'GET',
dataType: 'json',
success: function (data) {
self.cards = data;
self.displayCards.call(self);
self.existingSet();
self.setCardListeners();
self.setPageListeners();
}
});
dealRequest1 = $.ajax({
url: 'set.php?action=deal1',
type: 'GET',
dataType: 'json',
success: function (data) {
self.cards1 = data;
self.displayCards1.call(self);
self.existingSet1();
}
});
dealRequest2 = $.ajax({
url: 'set.php?action=deal2',
type: 'GET',
dataType: 'json',
success: function (data) {
self.cards = data;
self.displayCards2.call(self);
}
});
dealRequest3 = $.ajax({
url: 'set.php?action=deal3',
type: 'GET',
dataType: 'json',
success: function (data) {
self.cards = data;
self.displayCards3.call(self);
}
});
dealRequest4 = $.ajax({
url: 'set.php?action=deal4',
type: 'GET',
dataType: 'json',
success: function (data) {
self.cards = data;
self.displayCards4.call(self);
}
});
},
displayCards: function() {
var self = this;
if (self.cards.length == 0) {
return false;
}
$.each(self.cards, function(index, card){
var cardNode = $('<div>', {
class: "card"
}).appendTo(self.$board);
cardNode.data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill);
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board.append($('<div>'));
}
});
},
displayCards1: function() {
var self = this;
if (self.cards1.length == 0) {
return false;
}
$.each(self.cards1, function(index, card){
var cardNode = $('<div>', {
class: "card"
}).appendTo(self.$board1);
cardNode.data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'border': card.border,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill + ' ' + card.border);
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board1.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board1.append($('<div>'));
}
});
},
displayCards2: function() {
var self = this;
if (self.cards1.length == 0) {
return false;
}
$.each(self.cards2, function(index, card){
var cardNode = $('<div>', {
class: "card"
}).appendTo(self.$board2);
cardNode.data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill );
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board2.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board2.append($('<div>'));
}
});
},
displayCards3: function() {
var self = this;
if (self.cards1.length == 0) {
return false;
}
$.each(self.cards3, function(index, card){
var cardNode = $('<div>', {
class: "card"
}).appendTo(self.$board3);
cardNode.data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'border': card.border,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill + ' ' + card.border);
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board3.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board3.append($('<div>'));
}
});
},
displayCards4: function() {
var self = this;
if (self.cards1.length == 0) {
return false;
}
$.each(self.cards4, function(index, card){
var cardNode = $('<div>', {
class: "card"
}).appendTo(self.$board4);
cardNode.data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'border': card.border,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill + ' ' + card.border);
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board4.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board4.append($('<div>'));
}
});
},
existingSet: function() {
var colors = [];
var shapes =[];
var fills= [];
var numbers= [];
var valid;
var self = this;
var cartes = self.cards;
var cartes1 = cartes;
var cartes2 = cartes;
var cpt=0;
var carte1;
var carte2;
var carte3;
var i, j, k;
for(i=0; i<cartes.length-2; i++) {
for (j = i+1; j < cartes1.length-1; j++) {
for (k = j+1; k < cartes2.length; k++) {
carte1 = cartes[i];
carte2 = cartes1[j];
carte3 = cartes2[k];
colors.splice(0,1,carte1.color);
colors.splice(1,1,carte2.color);
colors.splice(2,1,carte3.color);
shapes.splice(0,1,carte1.shape);
shapes.splice(1,1,carte2.shape);
shapes.splice(2,1,carte3.shape);
fills.splice(0,1,carte1.fill);
fills.splice(1,1,carte2.fill);
fills.splice(2,1,carte3.fill);
numbers.splice(0,1,carte1.number);
numbers.splice(1,1,carte2.number);
numbers.splice(2,1,carte3.number);
valid = self.isSet(colors) && self.isSet(shapes) && self.isSet(fills) && self.isSet(numbers);
if (valid) {
cpt = cpt + 1;
}
}
}
}
this.$nbSets.html(cpt);
},
existingSet1: function() {
var colors = [];
var shapes =[];
var fills= [];
var borders = [];
var numbers= [];
var valid;
var self = this;
var cartes = self.cards1;
var cartes1 = cartes;
var cartes2 = cartes;
var cpt=0;
var carte1;
var carte2;
var carte3;
var i, j, k;
for(i=0; i<cartes.length-2; i++) {
for (j = i+1; j < cartes1.length-1; j++) {
for (k = j+1; k < cartes2.length; k++) {
carte1 = cartes[i];
carte2 = cartes1[j];
carte3 = cartes2[k];
colors.splice(0,1,carte1.color);
colors.splice(1,1,carte2.color);
colors.splice(2,1,carte3.color);
shapes.splice(0,1,carte1.shape);
shapes.splice(1,1,carte2.shape);
shapes.splice(2,1,carte3.shape);
fills.splice(0,1,carte1.fill);
fills.splice(1,1,carte2.fill);
fills.splice(2,1,carte3.fill);
borders.splice(0,1,carte1.border);
borders.splice(1,1,carte2.border);
borders.splice(2,1,carte3.border);
numbers.splice(0,1,carte1.number);
numbers.splice(1,1,carte2.number);
numbers.splice(2,1,carte3.number);
valid = self.isSet(colors) && self.isSet(shapes) && self.isSet(fills) && self.isSet(numbers) && self.isSet(borders) ;
if (valid) {
cpt = cpt + 1;
}
}
}
}
this.$nbSets1.html(cpt);
},
setCardListeners: function() {
var self = this;
// what happens when a card is clicked:
this.$board.on('click', '.card', function(e) {
e.stopImmediatePropagation();
var card = e.currentTarget;
// if card is new, add it, otherwise remove it
var ids = $.map(self.selected, function(el) { return $(el).data("id");});
if (ids.indexOf($(card).data('id')) >= 0) {
self.deselectCard(card);
} else {
self.selectCard(card);
}
if (self.selected.length === 3) {
self.silentSubmission();
}
});
},
setPageListeners: function() {
var self = this;
// if the user clicks on the page outside the game board, clear selected
$(document).on('click', function() {
self.clearSelections.call(self);
});
},
selectCard: function(card) {
$(card).addClass('selected');
this.selected.push(card);
if (this.selected.length > 3) {
this.clearSelections.call(this);
}
},
deselectCard: function(card) {
var self = this;
var index = self.selected.indexOf(card);
if (index > -1) {
self.selected.splice(index, 1);
}
$(card).removeClass('selected');
},
clearSelections: function() {
$.each(this.selected, function(index, card) {
$(card).removeClass('selected');
});
this.selected = [];
},
validateSet: function() {
var self = this;
var colors = $.map(self.selected, function(el) { return $(el).data("color");});
var shapes = $.map(self.selected, function(el) { return $(el).data("shape"); });
var fills= $.map(self.selected, function(el) { return $(el).data("fill"); });
var numbers = $.map(self.selected, function(el) { return $(el).data("number"); });
return (self.isSet(colors) && self.isSet(shapes) && self.isSet(fills) && self.isSet(numbers));
},
validateSet35: function() {
var self = this;
var colors = $.map(self.selected, function(el) { return $(el).data("color");});
var shapes = $.map(self.selected, function(el) { return $(el).data("shape"); });
var fills= $.map(self.selected, function(el) { return $(el).data("fill"); });
var borders= $.map(self.selected, function(el) { return $(el).data("border"); });
var numbers = $.map(self.selected, function(el) { return $(el).data("number"); });
return (self.isSet(colors) && self.isSet(shapes) && self.isSet(fills) && self.isSet(borders) && self.isSet(numbers));
},
validateSet44: function() {
var self = this;
var colors = $.map(self.selected, function(el) { return $(el).data("color");});
var shapes = $.map(self.selected, function(el) { return $(el).data("shape"); });
var fills= $.map(self.selected, function(el) { return $(el).data("fill"); });
var numbers = $.map(self.selected, function(el) { return $(el).data("number"); });
return (self.isSet4(colors) && self.isSet4(shapes) && self.isSet4(fills) && self.isSet4(numbers));
},
validateSet45: function() {
var self = this;
var colors = $.map(self.selected, function(el) { return $(el).data("color");});
var shapes = $.map(self.selected, function(el) { return $(el).data("shape"); });
var fills= $.map(self.selected, function(el) { return $(el).data("fill"); });
var borders= $.map(self.selected, function(el) { return $(el).data("border"); });
var numbers = $.map(self.selected, function(el) { return $(el).data("number"); });
return (self.isSet4(colors) && self.isSet4(shapes) && self.isSet4(borders) && self.isSet4(fills) && self.isSet4(numbers));
},
validateSet55: function() {
var self = this;
var colors = $.map(self.selected, function(el) { return $(el).data("color");});
var shapes = $.map(self.selected, function(el) { return $(el).data("shape"); });
var fills= $.map(self.selected, function(el) { return $(el).data("fill"); });
var borders= $.map(self.selected, function(el) { return $(el).data("border"); });
var numbers = $.map(self.selected, function(el) { return $(el).data("number"); });
return (self.isSet5(colors) && self.isSet5(shapes) && self.isSet5(fills) && self.isSet5(borders) && self.isSet5(numbers));
},
isSet: function(arr) {
var unique = [];
$.each(arr, function(i, el){
if($.inArray(el, unique) === -1) unique.push(el);
});
//console.log(unique);
return unique.length === 1 || unique.length === 3;
},
isSet4: function(arr) {
var unique = [];
$.each(arr, function(i, el){
if($.inArray(el, unique) === -1) unique.push(el);
});
//console.log(unique);
return unique.length === 1 || unique.length === 4;
},
isSet5: function(arr) {
var unique = [];
$.each(arr, function(i, el){
if($.inArray(el, unique) === -1) unique.push(el);
});
//console.log(unique);
return unique.length === 1 || unique.length === 5;
},
silentSubmission: function() {
var valid = this.validateSet();
if (valid) {
this.submitSet();
}
},
submitSet: function() {
var self = this;
var ids = $.map(self.selected, function(el) { return $(el).data("id");});
// ajax request to get initial set of cards
var newCardRequest = $.ajax({
url: 'set.php?action=submit',
type: 'GET',
dataType: 'json',
success: function(data) {
self.clearCards(ids);
// to do - implement game complete check on server
if (!data.gameComplete) {
self.updateCards(data);
self.existingSet();
self.increaseScore();
} else {
self.gameWon();
}
},
error: function() {
console.log(arguments);
}
});
this.clearSelections();
},
clearCards: function(ids) {
// remove submitted cards game's card array and clear the board
var self = this;
this.selected = [];
this.$board.empty();
var cardIds = $.map(self.cards, function(card) { return card.id; });
$.each(ids, function(idx, id) {
var location = cardIds.indexOf(id);
if (location > -1) {
cardIds.splice(location, 1);
self.cards.splice(location, 1);
}
});
},
updateCards: function(newCards) {
this.cards = this.cards.concat(newCards);
this.displayCards();
},
increaseScore: function() {
this.$score.html(++this.score);
},
startRound: function() {
// todo
// reset timer to 30 seconds
},
gameWon: function() {
alert("you won!");
},
gameLost: function() {
alert("you lost :(");
}
};
Game.deal();
/*
var canvases = $('.red');
console.log(canvases);
canvases.each(function(i, c) {
var context = c.getContext('2d');
console.log(c);
drawDiamond(context, 50, 50, 75, 100);
context.fillStyle = "red";
context.fill();
});
function drawDiamond(context, x, y, width, height){
context.save();
context.beginPath();
context.moveTo(x, y);
// top left edge
context.lineTo(x - width / 2, y + height / 2);
// bottom left edge
context.lineTo(x, y + height);
// bottom right edge
context.lineTo(x + width / 2, y + height / 2);
// closing the path automatically creates
// the top right edge
context.closePath();
context.restore();
}
/*
var canvases = $( ".red" );
for (let canvas of canvases) {
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(10, 10, 100, 100);
}
/*
var canvases = document.getElementsByClassName('shape diamond red solid');
console.log(canvases);
for (let canvas of canvases) {
var context = canvas.getContext('2d');
drawDiamond(context, 50, 50, 75, 100);
canvas.fillStyle("#FF0000");
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
function drawDiamond(context, x, y, width, height){
context.save();
context.beginPath();
context.moveTo(x, y);
// top left edge
context.lineTo(x - width / 2, y + height / 2);
// bottom left edge
context.lineTo(x, y + height);
// bottom right edge
context.lineTo(x + width / 2, y + height / 2);
// closing the path automatically creates
// the top right edge
context.closePath();
context.fillStyle = "red";
context.fill();
context.restore();
}*/