Advertisement
Guest User

Untitled

a guest
Jun 27th, 2018
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. \/ HTML \/
  2.  
  3.  
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7.     <title></title>
  8.     <style type="text/css">
  9.         * {
  10.             font-family: arial;
  11.             text-align: center;
  12.             margin: 10px;
  13.         }
  14.         #mainCanvas {
  15.             border: 1px solid black;
  16.             margin-top: 5px;
  17.         }
  18.         h1 {
  19.             margin-bottom: 25px;
  20.         }
  21.         h2 {
  22.             color: lightgreen;
  23.             -webkit-text-stroke: 0.25px black;
  24.             display: none;
  25.         }
  26.         h3 {
  27.             color: red;
  28.             -webkit-text-stroke: 0.25px black;
  29.             display: none;
  30.         }
  31.     </style>
  32. </head>
  33. <body>
  34.     <img src="defaultCube.jpg" id="defaultCube" style="display:none">
  35.     <img src="flag.jpg" id="flagImg" style="display:none">
  36.     <img src="blank.jpg" id="blank" style="display:none">
  37.     <img src="mine.jpg" id="mine" style="display:none">
  38.     <img src="hitMine.jpg" id="hitMine" style="display:none">
  39.     <img src="6.jpg" id="6" style="display:none">
  40.     <img src="1.jpg" id="1" style="display:none">
  41.     <img src="2.jpg" id="2" style="display:none">
  42.     <img src="3.jpg" id="3" style="display:none">
  43.     <img src="4.jpg" id="4" style="display:none">
  44.     <img src="5.jpg" id="5" style="display:none">
  45.     <img src="6.jpg" id="6" style="display:none">
  46.     <h1>Minesweeper!</h1>
  47.     <canvas id="mainCanvas" height="250" width="250"></canvas>
  48.     <p>Timer: <span id="timer">0</span></p>
  49.     <button onClick="startGame();" id="startGame">Start</button>
  50.     <button onClick="resetGame();">Reset</button>
  51.     <button onClick="toggleFlag();" id="flagBtn" disabled>Turn on flag</button>
  52.     <form>
  53.         <span>Ammount of mines: </span><input type="number" id="inputNumMines" value="10" min="1" max="99999"><br>
  54.         <span>Grid Size X: </span><input type="number" id="gridSizeX" value="10" min="4" max="100"><br>
  55.         <span>Grid Size Y: </span><input type="number" id="gridSizeY" value="10" min="4" max="100">
  56.     </form>
  57.     <h2 id="youWin">You win!</h2>
  58.     <h3 id="youLose">You lose!</h3>
  59.     <script src="main.js"></script>
  60. </body>
  61. </html>
  62.  
  63.  
  64. \/ JAVASCRIPT \/
  65.  
  66.  
  67.  
  68. // Variables
  69. var squares = [];
  70. var unchecked = [];
  71. var mines = [];
  72. var safe = [];
  73. var numImg = [];
  74. var flagged = [];
  75. numImg[1] = document.getElementById("1");
  76. numImg[2] = document.getElementById("2");
  77. numImg[3] = document.getElementById("3");
  78. numImg[4] = document.getElementById("4");
  79. numImg[5] = document.getElementById("5");
  80. numImg[6] = document.getElementById("6");
  81. var mineImg = document.getElementById("mine");
  82. var hitMineImg = document.getElementById("hitMine");
  83. var blankImg = document.getElementById("blank");
  84. var c = document.getElementById("mainCanvas");
  85. var ctx = c.getContext("2d");
  86. var defaultCube = document.getElementById("defaultCube");
  87. var flagImg = document.getElementById("flagImg");
  88. var mouseX;
  89. var mouseY;
  90. var numOfMines;
  91. var youWin = document.getElementById("youWin");
  92. var youLose = document.getElementById("youLose");
  93. var startBtn = document.getElementById("startGame");
  94. var flagBtn = document.getElementById("flagBtn");
  95. var timerTxt = document.getElementById("timer");
  96. var difficaltyInputBox = document.getElementById("inputNumMines");
  97. var inGridSizeX = document.getElementById("gridSizeX");
  98. var inGridSizeY = document.getElementById("gridSizeY");
  99. var game = false;
  100. var flag = false;
  101. var subject;
  102. var timerVar;
  103.  
  104. // Draw the default grid.
  105. function drawGame() {
  106.     c.width = inGridSizeX.value*25;
  107.     c.height = inGridSizeY.value*25;
  108.     flagged = [];
  109.     unchecked = [];
  110.     mines = [];
  111.     safe = [];
  112.     squares = [];
  113.     var numOfSquares = 0;
  114.     for (var i = 0; i < inGridSizeY.value; i++) {
  115.         for (var ii = 0; ii < inGridSizeX.value; ii++) {
  116.             ctx.drawImage(defaultCube, ii*25, i*25);
  117.             squares[numOfSquares] = ii*25 + "," + i*25;
  118.             numOfSquares++;
  119.         }
  120.     }
  121. }
  122.  
  123. // Generate random locations of the mines.
  124. function spawnMines() {
  125.     mines = [];
  126.     var dupe;
  127.     for (var i = 0; i < numOfMines; i++) {
  128.         var tmpMine = Math.floor(Math.random() * squares.length);
  129.         if (mines.length == 0) {
  130.             mines[0] = squares[tmpMine];
  131.         } else {
  132.             dupe = false;
  133.             for (var ii = 0; ii < mines.length; ii++) {
  134.                 if (mines[ii] == squares[tmpMine]) {
  135.                     i--;
  136.                     dupe = true;
  137.                     break;
  138.                 }
  139.             }
  140.             if (!dupe) {
  141.                 mines[i] = squares[tmpMine];
  142.             }
  143.         }
  144.     }
  145. }
  146.  
  147. // If the mine input-box has a value it will generate that ammount
  148. // of mines but if there is no value it will ask the user via a prompt.
  149. function askDifficalty() {
  150.     var maxMines = (inGridSizeX.value*inGridSizeY.value)-1;
  151.     if (difficaltyInputBox.value) {
  152.         numOfMines = difficaltyInputBox.value;
  153.     } else {
  154.         numOfMines = prompt("How many mines do you want to spawn?");
  155.     }
  156.     if (!numOfMines) {
  157.         numOfMines = 20;
  158.     } else if (numOfMines > maxMines) {
  159.         numOfMines = maxMines;
  160.         difficaltyInputBox.value = maxMines;
  161.     } else if (numOfMines < 1) {
  162.         numOfMines = 1;
  163.     }
  164. }
  165.  
  166. // Toggle the flag button.
  167. function toggleFlag() {
  168.     if(flag) {
  169.         flag = false;
  170.         flagBtn.innerText = "Turn on flag";
  171.     } else {
  172.         flag = true;
  173.         flagBtn.innerText = "Turn off flag";
  174.     }
  175. }
  176.  
  177. // Toggle wether or not a square is flagged.
  178. function flagSquare(squareToFlag) {
  179.     var alreadyFlagged = false;
  180.     for (var i = 0; i < flagged.length; i++) {
  181.         if (squareToFlag == flagged[i]) {
  182.             alreadyFlagged = true;
  183.             break;
  184.         }
  185.     }
  186.     if (alreadyFlagged) {
  187.         flagged = flagged.filter(function(item) {
  188.             return item !== squareToFlag;
  189.         });
  190.         var flagCoords = squareToFlag.split(",");
  191.         ctx.drawImage(defaultCube, flagCoords[0], flagCoords[1]);
  192.     } else {
  193.         flagged.push(squareToFlag);
  194.         var flagCoords = squareToFlag.split(",");
  195.         ctx.drawImage(flagImg, flagCoords[0], flagCoords[1]);
  196.     }
  197. }
  198.  
  199. // Get where the user clicked on the grid and translate
  200. //that into a square from the grid and check if it's a mine or not.
  201. function checkSquare(event) {
  202.     if (game) {
  203.         mouseX = event.clientX;
  204.         mouseY = event.clientY;
  205.         var canvasDim = c.getBoundingClientRect();
  206.         if (mouseX > canvasDim.left && mouseX < canvasDim.right && mouseY > canvasDim.top && mouseY < canvasDim.bottom) {
  207.             var mouseCanvasX = mouseX - canvasDim.left;
  208.             var mouseCanvasY = mouseY - canvasDim.top;
  209.             var subjectX = Math.ceil(mouseCanvasX/25)*25 - 25;
  210.             var subjectY = Math.ceil(mouseCanvasY/25)*25 - 25;
  211.             subject = subjectX + "," + subjectY;
  212.             console.log("User clicked: " + subject);
  213.             if (!discovered(subject)) {
  214.                 if (flag) {
  215.                     flagSquare(subject);
  216.                 } else {
  217.                     var isFlagged = false;
  218.                     for (var i = 0; i < flagged.length; i++) {
  219.                         if (flagged[i] == subject) {
  220.                             isFlagged = true;
  221.                             break;
  222.                         }
  223.                     }
  224.                     if (!isFlagged) {
  225.                         if (isMine(subject)) {
  226.                             loseGame(subjectX, subjectY);
  227.                         } else {
  228.                             drawSafe(subject);
  229.                         }
  230.                     } else {
  231.                         console.log("Square is flagged!");
  232.                     }
  233.                 }
  234.             }
  235.         }
  236.     }
  237. }
  238.  
  239. // Determine wether there is a mine next to the safe square
  240. // then set the apropriate image (Blank if 0 mines next to square).
  241. function drawSafe(safeSquare) {
  242.     var safeSquareCoords = safeSquare.split(",");
  243.     var minesNext = borderingBombs(safeSquareCoords);
  244.     if (minesNext == 0) {
  245.         checkBlanks(safeSquare);
  246.         //ctx.drawImage(blankImg, safeSquareCoords[0], safeSquareCoords[1]);
  247.         //safe.push(safeSquare);
  248.     } else if (minesNext > 0) {
  249.         if (!discovered(safeSquare)) {
  250.             ctx.drawImage(numImg[minesNext], safeSquareCoords[0], safeSquareCoords[1]);
  251.             safe.push(safeSquare);
  252.         }
  253.     }
  254.     if (safe.length == squares.length - mines.length) {
  255.         winGame();
  256.     }
  257. }
  258.  
  259. function borderingBombs(safeSquareCoords) {
  260.     var minesNext = 0;
  261.     for (var i = 0; i < mines.length; i++) {
  262.         var mineCoords = mines[i].split(",");
  263.         if (mineCoords[0] - 25 == safeSquareCoords[0]) {
  264.             if (mineCoords[1] == safeSquareCoords[1]) {
  265.                 // Left
  266.                 minesNext++;
  267.             } else if (mineCoords[1] - 25 == safeSquareCoords[1]) {
  268.                 // Top Left
  269.                 minesNext++;
  270.             } else if (mineCoords[1] == safeSquareCoords[1] - 25) {
  271.                 // Bottom Left
  272.                 minesNext++;
  273.             }
  274.         } else if (safeSquareCoords[0] - 25 == mineCoords[0]) {
  275.             if (mineCoords[1] == safeSquareCoords[1]) {
  276.                 // Right
  277.                 minesNext++;
  278.             } else if (mineCoords[1] - 25 == safeSquareCoords[1]) {
  279.                 // Right Top
  280.                 minesNext++;
  281.             } else if (mineCoords[1] == safeSquareCoords[1] - 25) {
  282.                 // Bottom Right
  283.                 minesNext++;
  284.             }
  285.         } else if (mineCoords[1] - 25 == safeSquareCoords[1] && mineCoords[0] == safeSquareCoords[0]) {
  286.             // Bottom
  287.             minesNext++;
  288.         } else if (safeSquareCoords[1] - 25 == mineCoords[1] && mineCoords[0] == safeSquareCoords[0]) {
  289.             // Top
  290.             minesNext++;
  291.         }
  292.     }
  293.     return minesNext;
  294. }
  295.  
  296. // Discover all blanks touching blanks
  297. function checkBlanks(blnkSquare) {
  298.     if (!discovered(blnkSquare)) {
  299.         var blnkSquareCoords = blnkSquare.split(",");
  300.         safe.push(blnkSquare);
  301.         ctx.drawImage(blankImg, blnkSquareCoords[0], blnkSquareCoords[1]);
  302.         if (borderingBombs(blnkSquare) == 0) {
  303.             runOffset(blnkSquareCoords, 0, -25); // Top
  304.             runOffset(blnkSquareCoords, 0, 25); // Bottom
  305.             runOffset(blnkSquareCoords, 25, 0); // Right
  306.             runOffset(blnkSquareCoords, -25, 0); // Left
  307.             runOffset(blnkSquareCoords, -25, 25);
  308.             runOffset(blnkSquareCoords, 25, -25);
  309.         }
  310.     }
  311. }
  312.  
  313. function runOffset(origin, xOffset, yOffset) {
  314.     var newBlnkSquare = origin;
  315.     newBlnkSquare[0] = parseInt(newBlnkSquare[0])+xOffset;
  316.     newBlnkSquare[1] = parseInt(newBlnkSquare[1])+yOffset;
  317.     outBlnkSquare = newBlnkSquare[0] + "," + newBlnkSquare[1];
  318.     if (newBlnkSquare[0] >= 0 && newBlnkSquare[1] >= 0 && newBlnkSquare[0] < 250 && newBlnkSquare[1] < 250) {
  319.         if (!isMine(outBlnkSquare)) {
  320.             drawSafe(outBlnkSquare);
  321.         }
  322.     }
  323. }
  324.  
  325. function isMine(isMine) {
  326.     for (var i = 0; i < mines.length; i++) {
  327.         if (isMine == mines[i]) {
  328.             return true;
  329.         }
  330.     }
  331.     return false;
  332. }
  333.  
  334. function discovered(diCoords) {
  335.     for (var i = 0; i < safe.length; i++) {
  336.         if(diCoords == safe[i]) {
  337.             return true;
  338.         }
  339.     }
  340.     return false;
  341. }
  342.  
  343. // Timer, goes up in secconds when the game is in play.
  344. function timer() {
  345.     var seconds = new Date().getTime(), last = seconds, intrvl = setInterval(function() {
  346.         if (!game) {
  347.             clearInterval(intrvl);
  348.             return;
  349.         } else {
  350.             var now = new Date().getTime();
  351.             last = now;
  352.             var timerOutput = now - seconds;
  353.             timerOutput = Math.round(timerOutput / 1000);
  354.             timerTxt.innerHTML = timerOutput;
  355.             timerVar = timerOutput;
  356.         }
  357.     }, 1000);
  358. }
  359.  
  360. // Called when you press an unflagged mine, will stop the game
  361. // and display all the mines on the grid.
  362. function loseGame(mineHitX, mineHitY) {
  363.     for (var i = 0; i < mines.length; i++) {
  364.         var tmpMineCoords = mines[i].split(",");
  365.         ctx.drawImage(mineImg, tmpMineCoords[0], tmpMineCoords[1]);
  366.     }
  367.     ctx.drawImage(hitMineImg, mineHitX, mineHitY);
  368.     startBtn.disabled = true;
  369.     flagBtn.disabled = true;
  370.     game = false;
  371.     youLose.style.display = "block";
  372. }
  373.  
  374. // Called when all the safe squares have been discovered.
  375. function winGame() {
  376.     startBtn.disabled = true;
  377.     flagBtn.disabled = true;
  378.     youWin.style.display = "block";
  379.     showMines();
  380.     game = false;
  381. }
  382.  
  383. // Called when the start button is pressed, it will disable that button,
  384. // set all the variables and call all the functions necessary to start the game.
  385. function startGame() {
  386.     flagBtn.disabled = false;
  387.     startBtn.disabled = true;
  388.     difficaltyInputBox.disabled= true;
  389.     inGridSizeX.disabled= true;
  390.     inGridSizeY.disabled= true;
  391.     game = true;
  392.     drawGame();
  393.     askDifficalty();
  394.     spawnMines();
  395.     timer();
  396. }
  397.  
  398. // Stop the game.
  399. function resetGame() {
  400.     drawGame();
  401.     game = false;
  402.     flagBtn.disabled = true;
  403.     startBtn.disabled = false;
  404.     difficaltyInputBox.disabled= false;
  405.     inGridSizeX.disabled= false;
  406.     inGridSizeY.disabled= false;
  407.     timerTxt.innerHTML = 0;
  408.     youWin.style.display = "none";
  409.     youLose.style.display = "none";
  410.     console.log("\n\n ----  Game Reset! ---- \n\n");
  411. }
  412.  
  413. // Show all the mines on grid.
  414. function showMines() {
  415.     for (var i = 0; i < mines.length; i++) {
  416.         var tmpMineCoords = mines[i].split(",");
  417.         ctx.drawImage(mineImg, tmpMineCoords[0], tmpMineCoords[1]);
  418.     }
  419. }
  420.  
  421. // Listen for clicks.
  422. document.addEventListener("click", checkSquare);
  423.  
  424. // Initialize grid.
  425. drawGame();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement