首页 > 语言 > JavaScript > 正文

jQuery实现的五子棋游戏实例

2024-05-06 16:22:26
字体:
来源:转载
供稿:网友

这篇文章主要介绍了jQuery实现的五子棋游戏,以完整实例形式分析了jQuery实现五子棋游戏的方法,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了jQuery实现的五子棋游戏。分享给大家供大家参考。具体如下:

这是一款非常不错的代码,就是人工智能方面差了一点

 

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  3. <html xmlns="http://www.w3.org/1999/xhtml"
  4. <head> 
  5. <title>五子棋</title> 
  6. <style type="text/css"
  7. div{margin:0;padding:0;} 
  8. div.board{width:561px; height:561px; border:1px solid #ccc; margin:0 auto;} 
  9. div.board div{ width:31px; height:31px; border:1px solid #ccc; float:left; cursor:pointer; background-repeat:no-repeat; } 
  10. div.board .person { background-image:url('images/1/files/demo/white.jpg')} 
  11. div.board .machine{ background-image:url('images/1/files/demo/black.jpg')} 
  12. div.board .person_star{background-image:url('images/1/files/demo/white_star.jpg')} 
  13. div.board .machine_star{background-image:url('images/1/files/demo/black_star.jpg')} 
  14. input.ipt{ display:block; margin:0 auto; margin-top:8px;width:70px} 
  15. </style> 
  16. </head> 
  17. <body> 
  18. <div class='board' id='board'
  19. </div> 
  20. <input type='button' value='开始游戏' onclick="initGame(); 
  21. this.value='重新开始'class='ipt'/> 
  22. <script type='text/javascript'
  23. var TRANSVERSE = 16; 
  24. var VERTICAL = 16; 
  25. var LEFT = 1; 
  26. var RIGHT = 2; 
  27. var TOP = 3; 
  28. var BOTTOM = 4; 
  29. var LEFT_TOP = 5; 
  30. var LEFT_BOTTOM = 6; 
  31. var RIGHT_TOP = 7; 
  32. var RIGHT_BOTTOM = 8; 
  33. var Chess = function() 
  34. var owner = ''
  35. var victory = false
  36. this.getOwner = function(){return owner;}; 
  37. this.setOwner = function(value){owner = value;}; 
  38. this.getVictory = function(){ return victory;} 
  39. this.setVictory = function(value){ victory = value; }  
  40. var Board = function() 
  41. var chessBoard = []; 
  42. var isGameOver = false
  43. this.getChess = function(point) 
  44. var x = point.x , y = point.y; 
  45. return chessBoard[y][x]; 
  46. this.setChess = function(chess , point) 
  47. var x = point.x , y = point.y; 
  48. chessBoard[y][x] = chess; 
  49. this.setVictory = function(points) 
  50. for(var i = 0 ; i < points.length ; i ++) 
  51. for(var j = 0 ; j < points[i].length; j ++) 
  52. var chess = this.getChess(points[i][j]); 
  53. chess.setVictory(true); 
  54. this.getAvaiablePoints = function() 
  55. var avaiable = new Array; 
  56. for(var y = 0 ; y <= VERTICAL ; y ++) 
  57. for(var x = 0 ; x <= TRANSVERSE ; x ++) 
  58. if(chessBoard[y][x]) continue
  59. var point = {x : x , y : y}; 
  60. avaiable.push(point); 
  61. return avaiable; 
  62. this.getMap = function() 
  63. var map = {}; 
  64. for(var y = 0 ; y <= VERTICAL ; y ++) 
  65. for(var x = 0 ; x <= TRANSVERSE ; x++) 
  66. var chess = chessBoard[y][x]; 
  67. var value = ''
  68. if(chess) 
  69. value = chess.getOwner(); 
  70. if(chess.getVictory()) value += '_star'
  71. else 
  72. value = ''
  73. map[ x + ',' + y ] = value; 
  74. return map; 
  75. this.gameOver = function() 
  76. return isGameOver = true
  77. this.isGameOver = function() 
  78. return isGameOver; 
  79. this.getNextPoint = function(point , direction) 
  80. var next = {x : point.x , y : point.y}; 
  81. switch(direction) 
  82. case LEFT : 
  83. next.x -= 1; 
  84. break
  85. case RIGHT: 
  86. next.x += 1; 
  87. break
  88. case TOP: 
  89. next.y -= 1; 
  90. break
  91. case BOTTOM: 
  92. next.y += 1; 
  93. break
  94. case LEFT_TOP: 
  95. next.x-= 1 , next.y-= 1; 
  96. break
  97. case RIGHT_TOP: 
  98. next.x += 1 , next.y -= 1; 
  99. break
  100. case LEFT_BOTTOM: 
  101. next.x -= 1 , next.y += 1; 
  102. break
  103. case RIGHT_BOTTOM: 
  104. next.x += 1 , next.y += 1; 
  105. break
  106. default : 
  107. alert('方向错误'); 
  108. return next; 
  109. var initialize = function() 
  110. for(var i = 0 ; i <= VERTICAL ; i++ ) chessBoard.push([]); 
  111. }  
  112. initialize(); 
  113. var Compute = function(role) 
  114. var directions = [LEFT , TOP , RIGHT , BOTTOM , LEFT_TOP , LEFT_BOTTOM , RIGHT_TOP , RIGHT_BOTTOM]; 
  115. var score = 0; 
  116. var self = this
  117. this._computeScore = function(direction) 
  118. throw new Error('未实现'); 
  119. this._convertToPattern = function(chesslist) 
  120. return role.convertToPattern(chesslist) 
  121. this.compute = function(point) 
  122. score = 0; 
  123. for(var i = 0, direction ; direction = directions[i++];) 
  124. score += this._computeScore(point , direction); 
  125. }  
  126. this.getScore = function(refPoint) 
  127. return score ; 
  128. var Five = function(role) 
  129. Compute.call(this, role); 
  130. var computeScore1 = function(refPoint , direction) 
  131. var predefined = 'IIII'
  132. var chesslist = role.find(refPoint , direction , 4); 
  133. var pattern = role.convertToPattern(chesslist); 
  134. if(predefined == pattern) return true
  135. return false ;  
  136. var computeScore2 = function(refPoint , direction) 
  137. var prev = role.find(refPoint , direction , 2); 
  138. var next = role.find(refPoint , role.reverseDirection(direction) , 2); 
  139. var prevPattern = role.convertToPattern(prev); 
  140. var nextPattern = role.convertToPattern(next); 
  141. if(prevPattern == 'II' && nextPattern == 'II'return true
  142. return false
  143. var computeScore3 = function(refPoint , direction) 
  144. var prev = role.find(refPoint , direction , 3); 
  145. var next = role.find(refPoint , role.reverseDirection(direction) , 1); 
  146. var prevPattern = role.convertToPattern(prev); 
  147. var nextPattern = role.convertToPattern(next); 
  148. if(prevPattern == 'III' && nextPattern == 'I'return true
  149. return false;  
  150. this._computeScore = function(refPoint , direction) 
  151. if(computeScore1(refPoint , direction) || computeScore2(refPoint , direction) || computeScore3(refPoint , direction)) 
  152. return 100000; 
  153. else return 0; 
  154. var Four_Live = function(role) 
  155. Compute.call(this, role); 
  156. this._computeScore = function(refPoint , direction) 
  157. var score = 0; 
  158. var prev = role.find(refPoint , direction , 4); 
  159. var next = role.find(refPoint , role.reverseDirection(direction), 1); 
  160. var prevPattern = this._convertToPattern(prev); 
  161. var nextPattern = this._convertToPattern(next); 
  162. if(prevPattern == 'III0' && nextPattern == '0') score = 10000;  
  163. return score;  
  164. var Four_Live1 = function(role) 
  165. Compute.call(this, role); 
  166. this._computeScore = function(refPoint , direction) 
  167. var prev = role.find(refPoint , direction , 3); 
  168. var next = role.find(refPoint , role.reverseDirection(direction) , 2); 
  169. var prevPattern = this._convertToPattern(prev); 
  170. var nextPattern = this._convertToPattern(next);  
  171. if(prevPattern == 'II0' && nextPattern == 'I0'return 10000; 
  172. else return 0; 
  173. var Tree_Live = function(role) 
  174. Compute.call(this, role); 
  175. this._computeScore = function(refPoint , direction) 
  176. var score = 0; 
  177. var prev = role.find(refPoint , direction , 3); 
  178. var next = role.find(refPoint , role.reverseDirection(direction), 2); 
  179. var prevPattern = this._convertToPattern(prev); 
  180. var nextPattern = this._convertToPattern(next); 
  181. if(prevPattern == 'II0' && nextPattern == '00'
  182. score += 1000; 
  183. return score; 
  184. var Tree_Live1 = function(role) 
  185. Compute.call(this, role); 
  186. this._computeScore = function(refPoint , direction) 
  187. var prev = role.find(refPoint , direction , 2); 
  188. var next = role.find(refPoint , role.reverseDirection(direction), 3); 
  189. var prevPattern = this._convertToPattern(prev); 
  190. var nextPattern = this._convertToPattern(next); 
  191. if(prevPattern == 'I0' && nextPattern == 'I00'
  192. return 1000 
  193. else return 0;  
  194. var Two_Live = function(role) 
  195. Compute.call(this, role); 
  196. this._computeScore = function(refPoint , direction) 
  197. var prev = role.find(refPoint , direction , 3); 
  198. var next = role.find(refPoint , role.reverseDirection(direction), 2);  
  199. var prevPattern = this._convertToPattern(prev); 
  200. var nextPattern = this._convertToPattern(next); 
  201. if(prevPattern == 'I00' && nextPattern == '00'return 100; 
  202. else return 0;  
  203. var One_Live = function(role) 
  204. Compute.call(this, role); 
  205. this._computeScore = function(refPoint , direction) 
  206. var prev = role.find(refPoint , direction , 3); 
  207. var next = role.find(refPoint , role.reverseDirection(direction), 3);  
  208. var prevPattern = this._convertToPattern(prev); 
  209. var nextPattern = this._convertToPattern(next); 
  210. if(prevPattern == '000' && nextPattern == '000'return 10; 
  211. else return 0;  
  212. var Four_End = function(role) 
  213. Compute.call(this, role); 
  214. this._computeScore = function(refPoint , direction) 
  215. var prev = role.find(refPoint , direction , 3); 
  216. var next = role.find(refPoint , role.reverseDirection(direction), 1);  
  217. var prevPattern = this._convertToPattern(prev); 
  218. var nextPattern = this._convertToPattern(next); 
  219. if(prevPattern == 'III' && nextPattern == '0'return 150; 
  220. else return 0;  
  221. var Role = function(board) 
  222. var computers = []; 
  223. var self = this
  224. var isVictory = false
  225. this.isVictory = function() 
  226. return isVictory; 
  227. var getScore = function(point) 
  228. var score = 0; 
  229. for(var i = 0 , computer; computer = computers[i++];) 
  230. computer.compute(point); 
  231. score += computer.getScore(); 
  232. var result = {score: score , point : point}; 
  233. return result; 
  234. var getScoreList = function() 
  235. var result = []; 
  236. var avaiablePoints = board.getAvaiablePoints(); 
  237. for(var i = 0 , point; point = avaiablePoints[i++];)  
  238. result.push(getScore(point)); 
  239. return result; 
  240. this.getCode = function() 
  241. throw new Error('未实现'); 
  242. this.getPeak = function() 
  243. var scoreInfo = getScoreList(); 
  244. scoreInfo.sort(function(a,b){ 
  245. return b.score - a.score ; 
  246. }); 
  247. return scoreInfo[0]; 
  248. }  
  249. this.convertToPattern = function(chesslist) 
  250. var pattern = ''
  251. if(!chesslist) return ''
  252. for(var i = 0 ; i < chesslist.length ; i ++) 
  253. var chess = chesslist[i]; 
  254. if(chess == undefined) pattern += '0'
  255. else if(chess.getOwner() == this.getCode()) pattern += 'I'
  256. else pattern += 'Y'
  257. return pattern ; 
  258. this.reverseDirection = function(direction) 
  259. switch(direction) 
  260. case LEFT : return RIGHT; 
  261. case RIGHT : return LEFT; 
  262. case TOP : return BOTTOM; 
  263. case BOTTOM : return TOP; 
  264. case LEFT_TOP : return RIGHT_BOTTOM; 
  265. case RIGHT_BOTTOM : return LEFT_TOP; 
  266. case RIGHT_TOP : return LEFT_BOTTOM; 
  267. case LEFT_BOTTOM : return RIGHT_TOP; 
  268. default : alert('方向错误'); 
  269. }  
  270. this._checkGameOver = function(point) 
  271. var leftRight = findVictory(point , LEFT); 
  272. var topBottom = findVictory(point , TOP); 
  273. var leftTopRightBottom = findVictory(point , LEFT_TOP); 
  274. var rightTopLeftBottom = findVictory(point , RIGHT_TOP); 
  275. var array = [leftRight , topBottom , leftTopRightBottom , rightTopLeftBottom]; 
  276. var victory = []; 
  277. for(var i = 0 ; i < array.length ; i ++) 
  278. if(array[i].length >= 5) victory.push(array[i]); 
  279. if(victory.length > 0) 
  280. board.gameOver(); 
  281. board.setVictory(victory); 
  282. isVictory = true
  283. if(board.getAvaiablePoints().length ==0) board.gameOver(); 
  284. var isLicitPoint = function(point) 
  285. return point.x >= 0 && point.y >= 0 && point.x <= TRANSVERSE && point.y <= VERTICAL  
  286. && board.getChess(point) && board.getChess(point).getOwner() == self.getCode() 
  287. var findVictory = function(refPoint , direction) 
  288. var reverse = self.reverseDirection(direction); 
  289. var result = []; 
  290. var nextPoint ; 
  291. var currPoint = {x: refPoint.x , y: refPoint.y}; 
  292. while(true
  293. nextPoint = board.getNextPoint(currPoint, direction); 
  294. if(!isLicitPoint(nextPoint)) break
  295. currPoint = {x :nextPoint.x , y:nextPoint.y}; 
  296. while(true
  297. result.push(currPoint);  
  298. nextPoint = board.getNextPoint(currPoint , reverse); 
  299. if(!isLicitPoint(nextPoint)) break;  
  300. currPoint = { x: nextPoint.x , y: nextPoint.y }; 
  301. return result; 
  302. this.find = function(point , direction , deep) 
  303. var refPoint = {x: point.x , y : point.y}; 
  304. var result = new Array; 
  305. var index = 1; 
  306. var nextPoint; 
  307. while(index <= deep) 
  308. nextPoint = board.getNextPoint(refPoint, direction); 
  309. if(nextPoint.x < 0 || nextPoint.y < 0 ||  
  310. nextPoint.x > TRANSVERSE || nextPoint.y > VERTICAL) return null
  311. var chess = board.getChess(nextPoint); 
  312. if(chess) chess.point = {x:nextPoint.x , y:nextPoint.y}; 
  313. result.push(chess); 
  314. refPoint = nextPoint; 
  315. index ++; 
  316. return result; 
  317. }  
  318. var initialize = function() 
  319. computers.push(new Five(self)); 
  320. computers.push(new Four_Live(self)); 
  321. computers.push(new Tree_Live(self)); 
  322. computers.push(new Four_Live1(self)); 
  323. computers.push(new Tree_Live1(self)); 
  324. computers.push(new Two_Live(self)); 
  325. computers.push(new One_Live(self)); 
  326. computers.push(new Four_End(self)); 
  327. initialize(); 
  328. var Machine = function(board, rival) 
  329. Role.call(this, board); 
  330. this.setChess = function() 
  331. if(board.isGameOver()) return
  332. var myPeak = this.getPeak(); 
  333. var rivalPeak = rival.getPeak(); 
  334. var peak ; 
  335. if(myPeak.score >= rivalPeak.score) peak = myPeak; 
  336. else peak = rivalPeak; 
  337. var chess = new Chess(); 
  338. chess.setOwner(this.getCode()); 
  339. board.setChess(chess, peak.point); 
  340. this._checkGameOver(peak.point); 
  341. this.getCode = function(){return 'machine';} 
  342. var Person = function(board , rival) 
  343. Role.call(this, board); 
  344. this.setChess = function(x,y) 
  345. if(board.isGameOver()) return
  346. var point = new Object; 
  347. point.x = x; 
  348. point.y = y; 
  349. var chess = new Chess() 
  350. chess.setOwner(this.getCode()); 
  351. board.setChess(chess, point); 
  352. this._checkGameOver(point); 
  353. this.getCode = function(){ return 'person'; } 
  354. var UIBase = function() 
  355. var self = this
  356. this._id = '$UI' + (++ UIBase.index); 
  357. this._globalKey = ""
  358. this.getHTML = function() 
  359. return ""
  360. var setGlobalKey = function() 
  361. var magic = '$UI_Items'
  362. self._globalKey = 'window.'+magic+'.'+self._id;  
  363. window[magic] = window[magic] || {}; 
  364. window[magic][self._id] = self; 
  365. var formatHTML = function(html) 
  366. html = html.replace(//$/$/g, self._globalKey); 
  367. html = html.replace(/&&/g,self._id); 
  368. return html; 
  369. }  
  370. var initUIBase = function() 
  371. setGlobalKey(); 
  372. this.renderHTML = function() 
  373. return formatHTML(this.getHTML()); 
  374. this.getDOM = function() 
  375. var dom = document.getElementById(this._id) 
  376. return dom; 
  377. initUIBase(); 
  378. UIBase.index = 0; 
  379. var ChessUI = function(board, placeholder) 
  380. UIBase.call(this); 
  381. this.setChess = function(){} 
  382. this.getHTML = function() 
  383. var html = ''
  384. var map = board.getMap(); 
  385. for(var key in map) 
  386. var onclick = ''
  387. var className = map[key]; 
  388. if(className == '') onclick='$._setChess('+ key +')'
  389. html += '<div onclick="'+ onclick +'" class="'+ className +'"></div>'
  390. return html; 
  391. this.draw = function() 
  392. var html = this.renderHTML(); 
  393. document.getElementById(placeholder).innerHTML = html; 
  394. this._setChess = function(x,y) 
  395. this.setChess(x,y); 
  396. this.draw(); 
  397. function getMSIEVersion() 
  398. var regex = /MSIE([^;]+)/; 
  399. var userAgent = navigator.userAgent; 
  400. var result = regex.exec(userAgent); 
  401. if(result) return parseInt(result[1]); 
  402. function initGame() 
  403. var version = getMSIEVersion(); 
  404. if(version && version <= 8) 
  405. alert('请使用非IE浏览器(ie9、10除外)进行游戏(google chrome 、firefox等 )'); 
  406. return
  407. var board = new Board(); 
  408. var person = new Person(board); 
  409. var machine = new Machine(board, person); 
  410. var chessUI = new ChessUI(board, 'board'); 
  411. chessUI.setChess = function(x,y) 
  412. person.setChess(x,y); 
  413. machine.setChess(); 
  414. chessUI.draw(); 
  415. if(board.isGameOver()) 
  416. if(person.isVictory()) alert('您获得了胜利'); 
  417. else if(machine.isVictory()) alert('机器获得了胜利'); 
  418. else alert('游戏结束,胜负未分'); 
  419. if(Math.floor(Math.random() * 10) % 2) 
  420. alert('机器执棋'); 
  421. machine.setChess(); 
  422. chessUI.draw(); 
  423. else 
  424. alert('您执棋'); 
  425. </script> 
  426. </body> 
  427. </html> 

希望本文所述对大家的jQuery程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选