-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
157 lines (129 loc) · 5.09 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
"use strict";
function startGame() {
const initialHeap = +document.getElementById("initialHeap").value;
const k = +document.getElementById("k").value;
const turnOrder = document.getElementById("turnOrder").value;
const currentPlayer = document.getElementById("currentPlayer")
const dialog = document.getElementById("dialog");
const dialogText = document.getElementById("dialogText");
if (!Number.isInteger(initialHeap) || initialHeap < 1) {
dialogText.innerHTML = "Invalid initial heap size";
dialog.showModal();
return;
} else if (!Number.isInteger(k) || k < 1 || k > initialHeap) {
dialogText.innerHTML = "Invalid k";
dialog.showModal();
return;
}
showAndHide("game", "paramInput");
updateHeap(initialHeap);
document.getElementById("maxPerMove").innerHTML = k;
if (turnOrder == "twoHumans") {
currentPlayer.innerHTML = "Player 1's";
showAndHide("playerInput", "computerOutput");
} else if (turnOrder == "humanFirst") {
currentPlayer.innerHTML = "your";
showAndHide("playerInput", "computerOutput");
} else {
computerTurn1(initialHeap, k);
}
}
function playerTurn() {
const currentPlayer = document.getElementById("currentPlayer");
let currentHeap = +document.getElementById("currentHeap").innerHTML.replace(/\D/g, '');
let maxPerMove = +document.getElementById("maxPerMove").innerHTML;
const playerMove = +document.getElementById("playerMove").value;
const dialog = document.getElementById("dialog");
const dialogText = document.getElementById("dialogText");
document.getElementById("playerMove").value = "";
if (!Number.isInteger(playerMove) || playerMove < 1 || playerMove > maxPerMove) {
dialogText.innerHTML = "Invalid move";
dialog.showModal();
return;
}
currentHeap -= playerMove;
if (currentHeap == 0) {
if (currentPlayer.innerHTML == "Player 1's") {
dialogText.innerHTML = "Player 1 wins!";
} else if (currentPlayer.innerHTML == "Player 2's") {
dialogText.innerHTML = "Player 2 wins!";
} else {
dialogText.innerHTML = "You win! Well played.";
}
dialog.showModal();
stopGame();
return;
}
updateHeap(currentHeap);
if (currentHeap < maxPerMove) {
maxPerMove = currentHeap;
document.getElementById("maxPerMove").innerHTML = maxPerMove;
}
if (currentPlayer.innerHTML == "Player 1's") {
currentPlayer.innerHTML = "Player 2's";
} else if (currentPlayer.innerHTML == "Player 2's") {
currentPlayer.innerHTML = "Player 1's";
} else {
computerTurn1(currentHeap, maxPerMove);
}
}
/* This function is in two parts so the player can see what the computer did before continuing. */
function computerTurn1(currentHeap, maxPerMove) {
const currentPlayer = document.getElementById("currentPlayer");
const computerMove = document.getElementById("computerMove");
let bestMove;
currentPlayer.innerHTML = "the computer's";
showAndHide("computerOutput", "playerInput");
if (currentHeap % (maxPerMove + 1) == 0) {
/* This is a losing position, so we make a random legal move and hope the player makes a mistake. */
bestMove = Math.floor(Math.random() * maxPerMove) + 1;
} else {
/* This is a winning position, so we put the player in a losing position. */
bestMove = currentHeap % (maxPerMove + 1);
}
if (bestMove == 1) {
computerMove.innerHTML = "1 object";
} else {
computerMove.innerHTML = `${bestMove} objects`;
}
}
function computerTurn2() {
const currentPlayer = document.getElementById("currentPlayer");
let currentHeap = +document.getElementById("currentHeap").innerHTML.replace(/\D/g, '');
let maxPerMove = +document.getElementById("maxPerMove").innerHTML;
const computerMove = +document.getElementById("computerMove").innerHTML.replace(/\D/g, '');
const dialog = document.getElementById("dialog");
const dialogText = document.getElementById("dialogText");
currentHeap -= computerMove;
if (currentHeap == 0) {
dialogText.innerHTML = "The computer wins! Better luck next time.";
dialog.showModal();
stopGame();
return;
}
updateHeap(currentHeap);
if (currentHeap < maxPerMove) {
maxPerMove = currentHeap;
document.getElementById("maxPerMove").innerHTML = maxPerMove;
}
currentPlayer.innerHTML = "your";
showAndHide("playerInput", "computerOutput");
}
function closeDialog() {
dialog.close();
}
function showAndHide(toShow, toHide) {
document.getElementById(toShow).style.display = "block";
document.getElementById(toHide).style.display = "none";
}
function updateHeap(newSize) {
if (newSize == 1) {
document.getElementById("currentHeap").innerHTML = "is 1 object";
} else {
document.getElementById("currentHeap").innerHTML = `are ${newSize} objects`;
}
}
function stopGame() {
document.getElementById("playerMove").value = "";
showAndHide("paramInput", "game");
}