diff options
author | Mark Powers <markppowers0@gmail.com> | 2020-04-07 14:17:24 -0500 |
---|---|---|
committer | Mark Powers <markppowers0@gmail.com> | 2020-04-07 14:17:24 -0500 |
commit | 1bffb064e2414ced5b1924a4f9fbd822a09c718e (patch) | |
tree | f0e4a0a8d9a6f4f58619329bf408fe9bf7d1dd4c /src/math/static/kings-corner.js |
Initial commit
Diffstat (limited to 'src/math/static/kings-corner.js')
-rw-r--r-- | src/math/static/kings-corner.js | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/src/math/static/kings-corner.js b/src/math/static/kings-corner.js new file mode 100644 index 0000000..c182b56 --- /dev/null +++ b/src/math/static/kings-corner.js @@ -0,0 +1,357 @@ +var kings_corner = { + suit_color: { + "C": "black", + "S": "black", + "H": "red", + "D": "red" + }, + value_to_num: { + "A": 0, + "2": 1, + "3": 2, + "4": 3, + "5": 4, + "6": 5, + "7": 6, + "8": 7, + "9": 8, + "10": 9, + "J": 10, + "Q": 11, + "K": 12 + }, + selected: [], + selected_positions: [], + status: "", + state: -1, + shuffle: function (a) { + var j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + }, + canBePlayedOn: function (bottom, top, board_position) { + if (top == undefined) { + return false; + } + if (bottom == undefined) { + return top.value == "K" || board_position < 4; + } + if (this.suit_color[bottom.suit] != this.suit_color[top.suit]) { + return this.value_to_num[bottom.value] - this.value_to_num[top.value] == 1; + } else { + return false; + } + }, + findBoardPosition(cards) { + var board_position; + for (var index = 0; index < this.board.length; index++) { + if (this.board[index] == cards) { + board_position = index; + } + } + return board_position + }, + canPlayBoardHand: function (cards, hand) { + var bottom = cards[cards.length - 1]; + var board_position = this.findBoardPosition(cards); + return this.canBePlayedOn(bottom, hand, board_position) + }, + canPlay: function () { + if (this.selected_positions[0] == "board" + && this.selected_positions[1] == "hand") { + return this.canPlayBoardHand(this.selected[0], this.selected[1]) + } else if (this.selected_positions[1] == "board" + && this.selected_positions[0] == "hand") { + return this.canPlayBoardHand(this.selected[1], this.selected[0]) + } else if (this.selected_positions[0] == "board" + && this.selected_positions[1] == "board") { + + var cards1 = this.selected[1]; + var cards2 = this.selected[0]; + var top = cards1[0] + var bottom = cards2[cards2.length - 1] + var board_position = this.findBoardPosition(cards2); + if (this.canBePlayedOn(bottom, top, board_position)) { + return true; + } + top = cards2[0] + bottom = cards1[cards1.length - 1] + board_position = this.findBoardPosition(cards1); + if (this.canBePlayedOn(bottom, top, board_position)) { + return true; + } + } + return false; + }, + setup: function () { + this.deck = []; + Object.keys(this.value_to_num).forEach((value) => { + Object.keys(this.suit_color).forEach((suit) => { + kings_corner.deck.push({ suit: suit, value: value }); + }) + }) + this.shuffle(this.deck); + this.board = [[this.deck.pop()], [this.deck.pop()], + [this.deck.pop()], [this.deck.pop()], + [], [], [], []] + this.hand = [] + this.other_hand = [] + for (var i = 0; i < 7; i++) { + this.hand.push(this.deck.pop()); + this.other_hand.push(this.deck.pop()); + } + this.hand.push(this.deck.pop()); + }, + removeCard: function (arr, c) { + return arr.filter((card) => { + return !(card.value == c.value && card.suit == c.suit); + }) + }, + play: function () { + if (this.selected.length != 2) { + this.state = 1 + } else if (this.canPlay()) { + if (this.selected_positions[0] == "board" && this.selected_positions[1] == "hand") { + var cards = this.selected[0]; + var top = this.selected[1]; + cards.push(top); + this.hand = this.removeCard(this.hand, top) + } else if (this.selected_positions[1] == "board" && this.selected_positions[0] == "hand") { + var cards = this.selected[1]; + var top = this.selected[0]; + cards.push(top); + this.hand = this.removeCard(this.hand, top) + } else if (this.selected_positions[0] == "board" && this.selected_positions[1] == "board") { + var cards1 = this.selected[1]; + var cards2 = this.selected[0]; + var top = cards1[0] + var bottom = cards2[cards2.length - 1] + var board_position = this.findBoardPosition(cards2); + if (this.canBePlayedOn(bottom, top, board_position)) { + while (this.selected[1].length > 0) { + this.selected[0].push(this.selected[1].shift()); + } + return; + } + top = cards2[0] + bottom = cards1[cards1.length - 1] + board_position = this.findBoardPosition(cards1); + if (this.canBePlayedOn(bottom, top, board_position)) { + while (this.selected[0].length > 0) { + this.selected[1].push(this.selected[0].shift()); + } + return; + } + } + } else { + console.log("no play") + } + }, + other_play: function () { + var madePlay = true + var playedCards = []; + while (madePlay && this.other_hand.length > 0) { + madePlay = false; + for (var i = 0; i < this.other_hand.length; i++) { + let card = this.other_hand[i] + for (var index = 0; index < this.board.length; index++) { + var top = card; + var cards = this.board[index]; + var bottom = cards[cards.length - 1]; + if (this.canBePlayedOn(bottom, top, index)) { + cards.push(card); + this.other_hand = this.removeCard(this.other_hand, card) + playedCards.push(card); + console.log(madePlay) + madePlay = true + break; + } + + } + if (madePlay) { + break; + } + } + for (var index1 = 0; index1 < this.board.length; index1++) { + for (var index2 = 0; index2 < this.board.length; index2++) { + var cards1 = this.board[index1]; + var cards2 = this.board[index2]; + var top = cards1[0] + var bottom = cards2[cards2.length - 1] + var board_position = this.findBoardPosition(cards2); + if (index1 >= 4) { + continue + // dont move a king to the left + } + if (this.canBePlayedOn(bottom, top, board_position)) { + while (cards1.length > 0) { + cards2.push(cards1.shift()); + } + break; + } + } + } + } + + if (playedCards.length == 0) { + this.status = "They played nothing" + } else { + this.status = "They played " + for (var index = 0; index < playedCards.length - 1; index++) { + this.status += `${playedCards[index].value} of ${playedCards[index].suit}, ` + } + this.status += `${playedCards[playedCards.length - 1].value} of ${playedCards[playedCards.length - 1].suit}` + } + }, +}; +kings_corner.updateCallback = function () { + if (kings_corner.state == -1){ // setup + kings_corner.setup(); + kings_corner.state = 0 + } else if (kings_corner.state == 0) { // player turn + if (kings_corner.hand.length == 0) { + kings_corner.status = "You win!" + kings_corner.state = 2 + return; + } + } else if (kings_corner.state == 1) { // other turn + kings_corner.other_hand.push(kings_corner.deck.pop()); + kings_corner.other_play(); + if (kings_corner.other_hand.length == 0) { + kings_corner.status = "You lose!" + kings_corner.state = 3 + return; + } + kings_corner.state = 0 + kings_corner.hand.push(kings_corner.deck.pop()); + } else if (kings_corner.state == 2 || kings_corner.state == 3) { + // nothing + } +} +kings_corner.drawCallback = function () { + if(kings_corner.state < 0){ + return; + } + ctx.fillStyle = "#99b3ff"; + ctx.fillRect(0, 0, width, height); + + font(26) + ctx.fillStyle = "lime"; + ctx.fillRect(5, 5, 90, 40); + ctx.fillStyle = "black" + if (kings_corner.selected.length != 2) { + ctx.fillText("Pass", 10, 30); + } else { + ctx.fillText("Play", 10, 30); + } + + ctx.fillStyle = "black" + ctx.fillText("You", 10, 240) + kings_corner.hand.forEach((card, i) => { + if (kings_corner.selected.includes(card)) { + ctx.fillStyle = "#CCC" + } else { + ctx.fillStyle = "white"; + } + ctx.fillRect(i * 75 + 100, 210, 70, 120); + ctx.fillStyle = kings_corner.suit_color[card.suit] + ctx.fillText(card.suit, i * 75 + 105, 250) + ctx.fillText(card.value, i * 75 + 105, 230) + }) + + ctx.fillStyle = "black" + ctx.fillText("Other", 10, 360) + kings_corner.other_hand.forEach((card, i) => { + ctx.fillStyle = "blue" + ctx.fillRect(i * 75 + 100, 340, 70, 120); + }) + + ctx.fillStyle = "black" + ctx.fillText(kings_corner.status, 100, 500) + + ctx.fillStyle = "black" + ctx.fillText("Board", 10, 120) + kings_corner.board.forEach((cards, i) => { + if (kings_corner.selected.includes(cards)) { + ctx.fillStyle = "#CCC" + } else { + ctx.fillStyle = "white"; + } + ctx.fillRect(i * 75 + 100, 80, 70, 120); + ctx.fillStyle = "black" + // var card = kings_corner.board[i]; + var top = cards[cards.length - 1]; + var bottom = cards[0]; + if (top != undefined) { + ctx.fillStyle = kings_corner.suit_color[top.suit] + ctx.fillText(top.suit, i * 75 + 105, 160) + ctx.fillText(top.value, i * 75 + 105, 180) + + if (top != bottom) { + ctx.fillStyle = kings_corner.suit_color[bottom.suit] + ctx.fillText(bottom.suit, i * 75 + 105, 120) + ctx.fillText(bottom.value, i * 75 + 105, 100) + } + } + }) + if(kings_corner.state >= 2){ + kings_corner.state = -1; + switchState(menu); + } +} +kings_corner.mouseDownCallback = function (e) { + if(kings_corner.state != 0){ + return; + } + + if (5 < e.x && e.x < 95 && 5 < e.y && e.y < 95) { + kings_corner.play(); + return + } + + var new_selected = false + kings_corner.hand.forEach((card, i) => { + if (i * 75 + 100 < e.x && e.x < i * 75 + 170 && + 210 < e.y && e.y < 330) { + + kings_corner.selected.unshift(card); + if (kings_corner.selected.length > 2) { + kings_corner.selected.pop(); + } + kings_corner.selected_positions.unshift("hand"); + if (kings_corner.selected_positions.length > 2) { + kings_corner.selected_positions.pop(); + } + new_selected = true + } + }) + + kings_corner.board.forEach((cards, i) => { + if (i * 75 + 100 < e.x && e.x < i * 75 + 170 && + 80 < e.y && e.y < 200) { + + kings_corner.selected.unshift(cards); + if (kings_corner.selected.length > 2) { + kings_corner.selected.pop(); + } + kings_corner.selected_positions.unshift("board"); + if (kings_corner.selected_positions.length > 2) { + kings_corner.selected_positions.pop(); + } + new_selected = true + } + }) + + if (!new_selected) { + kings_corner.selected = [] + kings_corner.selected_positions = [] + } +} +kings_corner.mouseUpCallback = function (e) { + +}
\ No newline at end of file |