aboutsummaryrefslogtreecommitdiff
path: root/src/math/static/kings-corner.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/static/kings-corner.js')
-rw-r--r--src/math/static/kings-corner.js357
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