Advertisement
Guest User

Batlleship

a guest
Dec 3rd, 2013
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.52 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script>
  5.  
  6. var BOARD_WIDTH = 10;
  7. var BOARD_HEIGHT = 10;
  8.  
  9. // Vector2D "class"
  10. function Vector2D(x, y) {
  11. return { x: x,
  12. y: y,
  13. add: function (other) {
  14. return new Vector2D(x + other.x, y + other.y)
  15. },
  16. toString: function() {
  17. return "(" + x + "," + y + ")";
  18. },
  19. equals: function (v) {
  20. return x === v.x && y === v.y;
  21. }
  22. };
  23. }
  24.  
  25. // Constants
  26. var HORIZONTAL = Vector2D(1, 0);
  27. var VERTICAL = Vector2D(0, 1);
  28.  
  29. // Extend Array class with pickRandom method
  30. Array.prototype.pickRandom = function () {
  31. var idx = Math.floor( Math.random() * this.length );
  32. return this[idx];
  33. }
  34.  
  35. // Returns a random orientation
  36. function randomOrientation() {
  37. return [ HORIZONTAL, VERTICAL ].pickRandom();
  38. }
  39.  
  40. // Generates random integers
  41. function randomInteger(maximum) {
  42. return Math.floor( Math.random() * maximum);
  43. }
  44.  
  45. // Generates random positions
  46. function randomPosition() {
  47. return Vector2D( randomInteger(BOARD_WIDTH), randomInteger(BOARD_HEIGHT) );
  48. }
  49.  
  50. // Boatclass
  51. function Boat(position, orientation, length) {
  52. return { position: position,
  53. orientation: orientation,
  54. length: length,
  55. hits: (function () {
  56. var result = [];
  57. for(var i = 0; i !== length; i++){
  58. result.push(0);
  59. }
  60. return result;
  61. })(),
  62.  
  63. usedPositions: (function() {
  64. var result = [];
  65. var current = position;
  66. for ( var i = 0; i != length; i++ ) {
  67. result.push(current);
  68. current = current.add(orientation);
  69. }
  70. return result;
  71. })()
  72. };
  73. }
  74.  
  75. // Checks if x is a memeber of the Array
  76. Array.prototype.member = function (x) {
  77. for(var i = 0; i !== this.length; i++)
  78. {
  79. if(x.equals(this[i])) {
  80. return true;
  81. }
  82. }
  83. return false;
  84. }
  85.  
  86. // Checks sf xs overlaps with the Array
  87. Array.prototype.overlaps = function (xs) {
  88. for(var i= 0; i !== xs.length; i++)
  89. {
  90. if(this.member(xs[i])){
  91. return true;
  92. }
  93. }
  94. return false;
  95. }
  96.  
  97. // Generates a random boat with a set length
  98. function generateRandomBoat(size) {
  99. return Boat(randomPosition(), randomOrientation(), size);
  100. }
  101.  
  102. // Checks if all elements of xs equal x
  103. function allEquals(xs, x) {
  104.  
  105. var all = true;
  106. for (var i = 0; i != xs.length; i++) {
  107. if(xs[i] !== x)
  108. all = false;
  109. }
  110. return all;
  111. }
  112.  
  113. // Generates an Array with the coordinates of the border of the board
  114. function borderPositions() {
  115. var result = [];
  116. for(var i = 0; i < BOARD_HEIGHT; i++) {
  117. result.push(Vector2D(BOARD_WIDTH, i));
  118. }
  119.  
  120. for(var i = 0; i < BOARD_WIDTH; i++) {
  121. result.push(Vector2D(i, BOARD_HEIGHT));
  122. }
  123.  
  124. return result;
  125. }
  126.  
  127. // Generates an Array with random boats
  128. function randomBoats(sizes) {
  129. var occupiedPositions = [];
  130. var boats = [];
  131. sizes = sizes.slice(); // copy
  132.  
  133. while ( sizes.length > 0 ) {
  134. var currentSize = sizes.pop();
  135.  
  136. var candidate = generateRandomBoat(currentSize);
  137. var candidateSpaces = candidate.usedPositions;
  138.  
  139. if ( candidateSpaces.overlaps(occupiedPositions.concat(borderPositions()))) {
  140. sizes.push(currentSize);
  141. }
  142.  
  143. else {
  144. occupiedPositions = occupiedPositions.concat(candidateSpaces);
  145.  
  146. boats.push(candidate);
  147. }
  148.  
  149. //for(var i = 0; i !== boats.length; i++) {
  150. // document.write(boats[i].occupiedPositions);
  151. document.write(occupiedPositions);
  152. //document.write(" ||| ");
  153. //}
  154.  
  155. }
  156.  
  157. return boats;
  158. }
  159.  
  160. // The game itself
  161. function game(){
  162. var inputArray = [4,3,2];
  163. var boats = randomBoats(inputArray);
  164. var currentBoat = 0;
  165. var misses = 0;
  166. var sunkenBoat = 0;
  167. var numberOfTurns = 0;
  168. var stop = false;
  169. while(sunkenBoat !== inputArray.length && stop == false) {
  170. var hit = false;
  171. var target = "(" + prompt("Enter targetcoordinate (x,y)") + ")";
  172. if(target === "(stop)") {
  173. var stop = true;
  174. }
  175. var targetString = target.replace(/\s+/g, '');
  176. for(var i = 0; i !== inputArray.length; i++) {
  177. for(var j = 0; j !== boats[i].usedPositions.length; j++) {
  178. if(targetString === boats[i].usedPositions[j].toString()) {
  179. hit = true;
  180. boats[i].hits[j] = 1;
  181. console.log(boats[i].hits);
  182. currentBoat = boats[i];
  183. boats[i].usedPositions.splice(j,1);
  184. break;
  185. }
  186. }
  187. }
  188.  
  189. if(hit && stop == false) {
  190. alert ("Hit!");
  191. if(allEquals(currentBoat.hits, 1) && hit) {
  192. alert("Boat with length " + currentBoat.hits.length + " has sunken!");
  193. sunkenBoat++;
  194. }
  195. }
  196. else if(stop == false)
  197. alert ("Miss!");
  198.  
  199.  
  200. numberOfTurns++
  201. }
  202.  
  203. if(sunkenBoat == inputArray.length){
  204. alert("You've won! You did it in " + numberOfTurns + " turns.");
  205. }
  206. }
  207.  
  208. game();
  209.  
  210. </script>
  211. </head>
  212. <body>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement