<html>
<head>
<title>Bomb Sweeper</title>
<style type="text/css">
body
{
background-color: #95B7DF;
}
#tableContainer td
{
width: 20px;
height: 20px;
text-align: center;
vertical-align: middle;
-moz-border-radius: 5px;
-khtml-border-radius: 5px;
-webkit-border-radius: 5px;
}
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var BombSweeper = {
result: true,
bombMap: false,
colSize: 0,
rowSize: 0,
locateBomb: function(rowSize, colSize, bombCount) {
var bombArr = new Array(colSize * rowSize);
var count = 0;
var index;
while (count < bombCount) {
index = Math.floor(Math.random() * bombArr.length);
if (!bombArr[index]) {
count++;
bombArr[index] = true;
}
}
this.colSize = colSize;
this.rowSize = rowSize;
this.bombMap = bombArr;
},
getSurroundedIndex: function(x, y) {
var indexArr = [];
for (var i = x - 1; i <= x + 1; i++) {
if (i >= 0 && i < this.colSize) {
for (var j = y - 1; j <= y + 1; j++) {
if (j >= 0 && j < this.rowSize) {
indexArr.push(i * this.colSize + j);
}
}
}
}
return indexArr;
},
getSurroundedBombCount: function(arr) {
var count = 0;
for (var i in arr) {
if (this.bombMap[arr[i]]) count++;
}
return count;
},
getTips: function(x, y) {
var _x = parseInt(x, 10);
var _y = parseInt(y, 10);
if (this.bombMap[_x * this.colSize + _y]) {
return -1;
} else {
return this.getSurroundedBombCount(this.getSurroundedIndex(_x, _y));
}
},
isBomb: function(x, y) {
var _x = parseInt(x, 10);
var _y = parseInt(y, 10);
return this.bombMap[_x * this.colSize + _y] == true;
}
};
$(document).ready(function() {
$("#generateTable").bind("click", function() {
var colSize = parseInt($("#colSize").val(), 10);
var rowSize = parseInt($("#rowSize").val(), 10);
var bombCount = parseInt($("#bombCount").val(), 10);
if (isNaN(colSize) || isNaN(rowSize)) {
$("#tableContainer").text("Not availible size.");
} else {
BombSweeper.locateBomb(colSize, rowSize, bombCount);
// rewrite value
$("#colSize").val(colSize);
$("#rowSize").val(rowSize);
$("#col").text(colSize);
$("#row").text(rowSize);
$("#bomb").text(0);
$("#bombEmbed").text(bombCount);
// create bomb table
$("#tableContainer").html("");
$("<table/>").attr({
border: 0,
align: "center"
}).appendTo("#tableContainer");
for (var i = 0; i < rowSize; i++) {
var currentRow = $("<tr/>").appendTo("#tableContainer table");
for (var j = 0; j < colSize; j++) {
var currentCell = $("<td/>").css({
//textAlign: "center",
//verticalAlign: "middle",
//fontSize: "12pt",
border: "2px outset black",
//width: "20px",
//height: "20px",
backgroundColor: "gray"
}).attr({ x: i, y: j })
.html(" ")
//.html(BombSweeper.bombMap[i * colSize + j] ? "X" : " ")
.click(function(e) {
if (e.ctrlKey && $(this).attr("x") && $(this).attr("y")) {
if ($(this).attr("marked") == "true") {
$(this).removeAttr("marked")
.css({
color: "black",
fontWeight: "normal"
})
.html(" ");
$("#bomb").text(parseInt($("#bomb").text(), 10) - 1);
} else {
if (parseInt($("#bomb").text(), 10) < parseInt($("#bombEmbed").text(), 10)) {
$(this).css({
color: "blue",
fontWeight: "bold"
})
.attr("marked", true)
.text("P");
$("#bomb").text(parseInt($("#bomb").text(), 10) + 1);
if (parseInt($("#bomb").text(), 10) == parseInt($("#bombEmbed").text(), 10)) {
var marked = $("#tableContainer td[marked]");
for (var i = 0; i < marked.length; i++) {
if (!BombSweeper.isBomb($(marked.get(i)).attr("x"), $(marked.get(i)).attr("y"))) return;
}
// unbind all click event
$("#tableContainer td").unbind("click");
// finish game
if (confirm("Congratulations!\nYou finish this game.\nWould you like to play again?")) {
$("#generateTable").click();
}
}
}
}
} else {
if (!$(this).attr("marked") && $(this).attr("x") && $(this).attr("y")) {
var x = parseInt($(this).attr("x"), 10);
var y = parseInt($(this).attr("y"), 10);
var tips = BombSweeper.getTips(x, y);
if (tips == -1) {
$(this).css({
border: "2px inset black",
backgroundColor: "transparent",
color: "red"
})
.text("X")
.removeAttr("x")
.removeAttr("y");
// unbind all click event
$("#tableContainer td").unbind("click");
if (confirm("Sorry, you lose this game.\nWould you like to play again?")) {
$("#generateTable").click();
}
} else {
$(this).css({
border: "2px inset black",
backgroundColor: "white"
})
.html(tips == 0 ? " " : tips)
.removeAttr("x")
.removeAttr("y");
// extended action
if (tips == 0) {
$("#tableContainer td[x][y][marked!='true']")
.filter(function(index) {
return ($(this).attr("x") == x - 1 || $(this).attr("x") == x || $(this).attr("x") == x + 1)
&& ($(this).attr("y") == y - 1 || $(this).attr("y") == y || $(this).attr("y") == y + 1);
})
.each(function(index) {
$(this).click();
});
}
}
}
}
})
.appendTo(currentRow);
}
}
}
});
});
</script>
</head>
<body>
<div style="text-align: center;">
<input id="colSize" type="text" size="5" value="10" />
x
<input id="rowSize" type="text" size="5" value="10" />
@
<input id="bombCount" type="text" size="5" value="30" />
<input id="generateTable" type="button" value="New Game" />
</div>
<div style="text-align: center;">
Size of grid : <span id="col">0</span>/ <span id="row">0</span>
<br />
Marked bombs : <span id="bomb">0</span> / <span id="bombEmbed">0</span>
</div>
<div id="tableContainer">
</div>
<div style="text-align: center; font-size: 9pt;">
(To mark bomb, press ctrl key and click.)</div>
</body>
</html>