首页 > 编程 > JavaScript > 正文

jQuery实现的五子棋游戏实例

2019-11-20 12:16:07
字体:
来源:转载
供稿:网友

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>五子棋</title><style type="text/css">div{margin:0;padding:0;}div.board{width:561px; height:561px; border:1px solid #ccc; margin:0 auto;}div.board div{ width:31px; height:31px; border:1px solid #ccc; float:left; cursor:pointer; background-repeat:no-repeat; }div.board .person { background-image:url('images/1/files/demo/white.jpg')}div.board .machine{ background-image:url('images/1/files/demo/black.jpg')}div.board .person_star{background-image:url('images/1/files/demo/white_star.jpg')}div.board .machine_star{background-image:url('images/1/files/demo/black_star.jpg')}input.ipt{ display:block; margin:0 auto; margin-top:8px;width:70px}</style></head><body><div class='board' id='board'></div><input type='button' value='开始游戏' onclick="initGame();this.value='重新开始'" class='ipt'/><script type='text/javascript'>var TRANSVERSE = 16;var VERTICAL = 16;var LEFT = 1;var RIGHT = 2;var TOP = 3;var BOTTOM = 4;var LEFT_TOP = 5;var LEFT_BOTTOM = 6;var RIGHT_TOP = 7;var RIGHT_BOTTOM = 8;var Chess = function(){ var owner = ''; var victory = false; this.getOwner = function(){return owner;}; this.setOwner = function(value){owner = value;}; this.getVictory = function(){ return victory;} this.setVictory = function(value){ victory = value; } }var Board = function(){ var chessBoard = []; var isGameOver = false; this.getChess = function(point) {  var x = point.x , y = point.y;  return chessBoard[y][x]; } this.setChess = function(chess , point) {  var x = point.x , y = point.y;  chessBoard[y][x] = chess; } this.setVictory = function(points) {  for(var i = 0 ; i < points.length ; i ++)  {   for(var j = 0 ; j < points[i].length; j ++)   {    var chess = this.getChess(points[i][j]);    chess.setVictory(true);   }  } } this.getAvaiablePoints = function() {  var avaiable = new Array;  for(var y = 0 ; y <= VERTICAL ; y ++)  {   for(var x = 0 ; x <= TRANSVERSE ; x ++)   {    if(chessBoard[y][x]) continue;    var point = {x : x , y : y};    avaiable.push(point);   }  }  return avaiable; } this.getMap = function() {  var map = {};   for(var y = 0 ; y <= VERTICAL ; y ++)   {   for(var x = 0 ; x <= TRANSVERSE ; x++)    {    var chess = chessBoard[y][x];     var value = '';     if(chess)     {     value = chess.getOwner();     if(chess.getVictory()) value += '_star';     }     else      {     value = '';     }     map[ x + ',' + y ] = value;    }   }   return map; } this.gameOver = function() {  return isGameOver = true; } this.isGameOver = function() {  return isGameOver; } this.getNextPoint = function(point , direction) {  var next = {x : point.x , y : point.y};  switch(direction)  {   case LEFT :    next.x -= 1;    break;   case RIGHT:    next.x += 1;    break;   case TOP:    next.y -= 1;    break;   case BOTTOM:    next.y += 1;    break;   case LEFT_TOP:    next.x-= 1 , next.y-= 1;    break;   case RIGHT_TOP:    next.x += 1 , next.y -= 1;    break;   case LEFT_BOTTOM:    next.x -= 1 , next.y += 1;    break;   case RIGHT_BOTTOM:    next.x += 1 , next.y += 1;    break;   default :    alert('方向错误');  }  return next; } var initialize = function() {  for(var i = 0 ; i <= VERTICAL ; i++ ) chessBoard.push([]); }  initialize();}var Compute = function(role){ var directions = [LEFT , TOP , RIGHT , BOTTOM , LEFT_TOP , LEFT_BOTTOM , RIGHT_TOP , RIGHT_BOTTOM]; var score = 0; var self = this; this._computeScore = function(direction) {  throw new Error('未实现'); } this._convertToPattern = function(chesslist) {  return role.convertToPattern(chesslist) } this.compute = function(point) {  score = 0;  for(var i = 0, direction ; direction = directions[i++];)  {   score += this._computeScore(point , direction);  }  } this.getScore = function(refPoint) {  return score ; }}var Five = function(role){ Compute.call(this, role); var computeScore1 = function(refPoint , direction) {  var predefined = 'IIII';  var chesslist = role.find(refPoint , direction , 4);  var pattern = role.convertToPattern(chesslist);  if(predefined == pattern) return true;  return false ;   } var computeScore2 = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 2);  var next = role.find(refPoint , role.reverseDirection(direction) , 2);  var prevPattern = role.convertToPattern(prev);  var nextPattern = role.convertToPattern(next);  if(prevPattern == 'II' && nextPattern == 'II') return true;  return false; } var computeScore3 = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction) , 1);  var prevPattern = role.convertToPattern(prev);  var nextPattern = role.convertToPattern(next); if(prevPattern == 'III' && nextPattern == 'I') return true; return false;   } this._computeScore = function(refPoint , direction) {  if(computeScore1(refPoint , direction) || computeScore2(refPoint , direction) || computeScore3(refPoint , direction))   return 100000;  else return 0; }}var Four_Live = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var score = 0;  var prev = role.find(refPoint , direction , 4);  var next = role.find(refPoint , role.reverseDirection(direction), 1);  var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next);  if(prevPattern == 'III0' && nextPattern == '0') score = 10000;   return score;   }}var Four_Live1 = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction) , 2);  var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next);    if(prevPattern == 'II0' && nextPattern == 'I0') return 10000;  else return 0; }}var Tree_Live = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var score = 0;  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction), 2);  var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next);  if(prevPattern == 'II0' && nextPattern == '00')   score += 1000;  return score; }}var Tree_Live1 = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 2);  var next = role.find(refPoint , role.reverseDirection(direction), 3);  var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next); if(prevPattern == 'I0' && nextPattern == 'I00')  return 1000 else return 0;    }}var Two_Live = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction), 2);   var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next); if(prevPattern == 'I00' && nextPattern == '00') return 100; else return 0;   }}var One_Live = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction), 3);   var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next); if(prevPattern == '000' && nextPattern == '000') return 10; else return 0;   }}var Four_End = function(role){ Compute.call(this, role); this._computeScore = function(refPoint , direction) {  var prev = role.find(refPoint , direction , 3);  var next = role.find(refPoint , role.reverseDirection(direction), 1);   var prevPattern = this._convertToPattern(prev);  var nextPattern = this._convertToPattern(next); if(prevPattern == 'III' && nextPattern == '0') return 150; else return 0;   }}var Role = function(board){ var computers = []; var self = this; var isVictory = false; this.isVictory = function() {  return isVictory; } var getScore = function(point) {  var score = 0;  for(var i = 0 , computer; computer = computers[i++];)  {   computer.compute(point);   score += computer.getScore();  }  var result = {score: score , point : point};  return result; } var getScoreList = function() {  var result = [];  var avaiablePoints = board.getAvaiablePoints();  for(var i = 0 , point; point = avaiablePoints[i++];)   {   result.push(getScore(point));  }  return result; } this.getCode = function() {  throw new Error('未实现'); } this.getPeak = function() {  var scoreInfo = getScoreList();  scoreInfo.sort(function(a,b){   return b.score - a.score ;  });  return scoreInfo[0]; }  this.convertToPattern = function(chesslist) {  var pattern = '';  if(!chesslist) return '';  for(var i = 0 ; i < chesslist.length ; i ++)  {   var chess = chesslist[i];   if(chess == undefined) pattern += '0';   else if(chess.getOwner() == this.getCode()) pattern += 'I';   else pattern += 'Y';  }  return pattern ; } this.reverseDirection = function(direction) {  switch(direction)  {   case LEFT : return RIGHT;   case RIGHT : return LEFT;   case TOP : return BOTTOM;   case BOTTOM : return TOP;   case LEFT_TOP : return RIGHT_BOTTOM;   case RIGHT_BOTTOM : return LEFT_TOP;   case RIGHT_TOP : return LEFT_BOTTOM;   case LEFT_BOTTOM : return RIGHT_TOP;   default : alert('方向错误');  } }  this._checkGameOver = function(point) {  var leftRight = findVictory(point , LEFT);  var topBottom = findVictory(point , TOP);  var leftTopRightBottom = findVictory(point , LEFT_TOP);  var rightTopLeftBottom = findVictory(point , RIGHT_TOP);  var array = [leftRight , topBottom , leftTopRightBottom , rightTopLeftBottom];  var victory = [];  for(var i = 0 ; i < array.length ; i ++)  {   if(array[i].length >= 5) victory.push(array[i]);  }  if(victory.length > 0)  {   board.gameOver();   board.setVictory(victory);   isVictory = true;  }  if(board.getAvaiablePoints().length ==0) board.gameOver(); } var isLicitPoint = function(point) {  return point.x >= 0 && point.y >= 0 && point.x <= TRANSVERSE && point.y <= VERTICAL    && board.getChess(point) && board.getChess(point).getOwner() == self.getCode() } var findVictory = function(refPoint , direction) {  var reverse = self.reverseDirection(direction);  var result = [];  var nextPoint ;  var currPoint = {x: refPoint.x , y: refPoint.y};  while(true)  {   nextPoint = board.getNextPoint(currPoint, direction);   if(!isLicitPoint(nextPoint)) break;   currPoint = {x :nextPoint.x , y:nextPoint.y};  }  while(true)  {  result.push(currPoint);      nextPoint = board.getNextPoint(currPoint , reverse);   if(!isLicitPoint(nextPoint)) break;     currPoint = { x: nextPoint.x , y: nextPoint.y };  }  return result; } this.find = function(point , direction , deep) {  var refPoint = {x: point.x , y : point.y};  var result = new Array;   var index = 1;   var nextPoint;   while(index <= deep)   {   nextPoint = board.getNextPoint(refPoint, direction);    if(nextPoint.x < 0 || nextPoint.y < 0 ||     nextPoint.x > TRANSVERSE || nextPoint.y > VERTICAL) return null;    var chess = board.getChess(nextPoint);    if(chess) chess.point = {x:nextPoint.x , y:nextPoint.y};    result.push(chess);    refPoint = nextPoint;    index ++;   }   return result; }  var initialize = function() {  computers.push(new Five(self));  computers.push(new Four_Live(self));  computers.push(new Tree_Live(self));  computers.push(new Four_Live1(self));  computers.push(new Tree_Live1(self));  computers.push(new Two_Live(self));  computers.push(new One_Live(self));  computers.push(new Four_End(self)); } initialize();}var Machine = function(board, rival){ Role.call(this, board); this.setChess = function() {  if(board.isGameOver()) return;  var myPeak = this.getPeak();  var rivalPeak = rival.getPeak();  var peak ;  if(myPeak.score >= rivalPeak.score) peak = myPeak;  else peak = rivalPeak;  var chess = new Chess();  chess.setOwner(this.getCode());  board.setChess(chess, peak.point);  this._checkGameOver(peak.point); } this.getCode = function(){return 'machine';}}var Person = function(board , rival){ Role.call(this, board); this.setChess = function(x,y) {  if(board.isGameOver()) return;  var point = new Object;  point.x = x;  point.y = y;  var chess = new Chess()  chess.setOwner(this.getCode());  board.setChess(chess, point);  this._checkGameOver(point); } this.getCode = function(){ return 'person'; }}var UIBase = function(){ var self = this; this._id = '$UI' + (++ UIBase.index); this._globalKey = ""; this.getHTML = function() {  return ""; } var setGlobalKey = function() {  var magic = '$UI_Items';  self._globalKey = 'window.'+magic+'.'+self._id;    window[magic] = window[magic] || {};  window[magic][self._id] = self; } var formatHTML = function(html) {  html = html.replace(//$/$/g, self._globalKey);  html = html.replace(/&&/g,self._id);  return html; }  var initUIBase = function() {  setGlobalKey(); } this.renderHTML = function() {  return formatHTML(this.getHTML()); } this.getDOM = function() { var dom = document.getElementById(this._id)  return dom; } initUIBase();}UIBase.index = 0;var ChessUI = function(board, placeholder){ UIBase.call(this); this.setChess = function(){} this.getHTML = function() {  var html = '';  var map = board.getMap();  for(var key in map)  {   var onclick = '';   var className = map[key];   if(className == '') onclick='$$._setChess('+ key +')';  html += '<div onclick="'+ onclick +'" class="'+ className +'"></div>';  }  return html; } this.draw = function() {  var html = this.renderHTML();  document.getElementById(placeholder).innerHTML = html; } this._setChess = function(x,y) {  this.setChess(x,y); } this.draw();}function getMSIEVersion(){ var regex = /MSIE([^;]+)/; var userAgent = navigator.userAgent; var result = regex.exec(userAgent); if(result) return parseInt(result[1]);}function initGame(){ var version = getMSIEVersion(); if(version && version <= 8) {  alert('请使用非IE浏览器(ie9、10除外)进行游戏(google chrome 、firefox等 )');  return; } var board = new Board(); var person = new Person(board); var machine = new Machine(board, person); var chessUI = new ChessUI(board, 'board'); chessUI.setChess = function(x,y) {  person.setChess(x,y);  machine.setChess();  chessUI.draw();  if(board.isGameOver())  {   if(person.isVictory()) alert('您获得了胜利');   else if(machine.isVictory()) alert('机器获得了胜利');   else alert('游戏结束,胜负未分');  } } if(Math.floor(Math.random() * 10) % 2) {  alert('机器执棋');  machine.setChess();  chessUI.draw(); } else {  alert('您执棋'); }}</script></body></html>

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

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