JS小游戏之象棋暗棋源码详解

本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考。具体如下:

游戏运行后如下图所示:

Javascript 部分:

/** chinese chess
*  Author: fdipzone
*  Date:  2012-06-24
*  Ver:  1.0
*/ 

var gameimg = ['images/a1.gif','images/a2.gif','images/a3.gif','images/a4.gif','images/a5.gif','images/a6.gif','images/a7.gif','images/b1.gif','images/b2.gif','images/b3.gif','images/b4.gif','images/b5.gif','images/b6.gif','images/b7.gif','images/bg.gif','images/bg_over.gif','images/bg_sel.gif'];
var chess_obj = new ChessClass(); 

window.onload = function(){
  $('init_btn').onclick = function(){
    chess_obj.init();
  }
  var callback = function(){
    chess_obj.init();
  }
  img_preload(gameimg, callback);
} 

// chess class
function ChessClass(){
  this.chess = [];
  this.boardrows = 4;
  this.boardcols = 8;
  this.area = 82;
  this.player = 1;  // 1:red 2:green
  this.selected = null;  // selected chess
  this.chesstype = ['', 'a', 'b'];
  this.isover = 0;
} 

// init
ChessClass.prototype.init = function(){
  this.reset_grade();
  this.create_board();
  this.create_chess();
  this.create_event();
  this.player = 1;
  this.selected = null;
  this.isover = 0;
  disp('init_div','hide');
} 

// create board
ChessClass.prototype.create_board = function(){
  var board = '';
  for(var i=0; i<this.boardrows; i++){
    for(var j=0; j<this.boardcols; j++){
      board = board + '<div id="' + i + '_' + j + '"><img src="images/chessbg.gif" /></div>';
    }
  }
  $('board').innerHTML = board;
  $('board').style.width = this.boardcols * (this.area + 2) + 'px';
  $('board').style.height = this.boardrows * (this.area + 2) + 'px';
} 

// create random chess
ChessClass.prototype.create_chess = function(){
  // 32 chesses
  var chesses = ['a1','b7','a2','b7','a2','b7','a3','b7','a3','b7','a4','b6','a4','b6','a5','b5',
           'a5','b5','a6','b4','a6','b4','a7','b3','a7','b3','a7','b2','a7','b2','a7','b1'];
  this.chess = [];
  while(chesses.length>0){
    var rnd = Math.floor(Math.random()*chesses.length);
    var tmpchess = chesses.splice(rnd, 1).toString();
    this.chess.push({'chess':tmpchess, 'type':tmpchess.substr(0,1), 'val':tmpchess.substr(1,1), 'status':0});
  }
} 

// create event
ChessClass.prototype.create_event = function(){
  var self = this;
  var chess_area = $_tag('div', 'board');
  for(var i=0; i<chess_area.length; i++){
    chess_area[i].onmouseover = function(){ // mouseover
      if(this.className!='onsel'){
        this.className = 'on';
      }
    }
    chess_area[i].onmouseout = function(){ // mouseout
      if(this.className!='onsel'){
        this.className = '';
      }
    }
    chess_area[i].onclick = function(){ // onclick
      self.action(this);
    }
  }
} 

// id change index
ChessClass.prototype.getindex = function(id){
  var tid = id.split('_');
  return parseInt(tid[0])*this.boardcols + parseInt(tid[1]);
} 

// index change id
ChessClass.prototype.getid = function(index){
  return parseInt(index/this.boardcols) + '_' + parseInt(index%this.boardcols);
} 

// action
ChessClass.prototype.action = function(o){
  if(this.isover==1){ // game over
    return false;
  } 

  var index = this.getindex(o.id); 

  if(this.selected == null){ // 未选过棋子
    if(this.chess[index]['status'] == 0){  // not opened
      this.show(index);
    }else if(this.chess[index]['status'] == 1){ // opened
      if(this.chess[index]['type'] == this.chesstype[this.player]){
        this.select(index);
      }
    }
  }else{ // 已选过棋子
    if(index != this.selected['index']){        // 與selected不是同一位置
      if(this.chess[index]['status'] == 0){      // 未打开的棋子
        this.show(index);
      }else if(this.chess[index]['status'] == -1){  // 點空白位置
        this.move(index);
      }else{                     // 點其他棋子
        if(this.chess[index]['type']==this.chesstype[this.player]){
          this.select(index);
        }else{
          this.kill(index);
        }
      }
    }
  }
} 

// show chess
ChessClass.prototype.show = function(index){
  $(this.getid(index)).innerHTML = '<img src="images/' + this.chess[index]['chess'] + '.gif" />';
  this.chess[index]['status'] = 1;  // opened
  if(this.selected!=null){      // 清空選中
    $(this.getid(this.selected.index)).className = '';
    this.selected = null;
  }
  this.change_player();
  this.gameover();
} 

// select chess
ChessClass.prototype.select = function(index){
  if(this.selected!=null){
    $(this.getid(this.selected['index'])).className = '';
  }
  this.selected = {'index':index, 'chess':this.chess[index]};
  $(this.getid(index)).className = 'onsel';
} 

// move chess
ChessClass.prototype.move = function(index){
  if(this.beside(index)){
    this.chess[index] = {'chess':this.selected['chess']['chess'], 'type':this.selected['chess']['type'], 'val':this.selected['chess']['val'], 'status':this.selected['chess']['status']};
    this.remove(this.selected['index']);
    this.show(index);
  }
} 

// kill chess
ChessClass.prototype.kill = function(index){
  if(this.beside(index)==true && this.can_kill(index)==true){
    this.chess[index] = {'chess':this.selected['chess']['chess'], 'type':this.selected['chess']['type'], 'val':this.selected['chess']['val'], 'status':this.selected['chess']['status']};
    this.remove(this.selected['index']);
    var killed = this.player==1? 2 : 1;
    $('grade_num' + killed).innerHTML = parseInt($('grade_num' + killed).innerHTML)-1;
    this.show(index);
  }
} 

// remove chess
ChessClass.prototype.remove = function(index){
  this.chess[index]['status'] = -1;  // empty
  $(this.getid(index)).innerHTML = '';
  $(this.getid(index)).className = '';
} 

/* check is beside
* @param index   目標棋子index
* @param selindex  执行的棋子index,可为空, 为空则读取选中的棋子
*/
ChessClass.prototype.beside = function(index,selindex){
  if(typeof(selindex)=='undefined'){
    if(this.selected!=null){
      selindex = this.selected['index'];
    }else{
      return false;
    }
  } 

  if(typeof(this.chess[index])=='undefined'){
    return false;
  } 

  var from_info = this.getid(selindex).split('_');
  var to_info = this.getid(index).split('_');
  var fw = parseInt(from_info[0]);
  var fc = parseInt(from_info[1]);
  var tw = parseInt(to_info[0]);
  var tc = parseInt(to_info[1]); 

  if(fw==tw && Math.abs(fc-tc)==1 || fc==tc && Math.abs(fw-tw)==1){  // row or colunm is same and interval=1
    return true;
  }else{
    return false;
  }
} 

/* check can kill
* @param index   被消灭的棋子index
* @param selindex  执行消灭的棋子index,可为空, 为空则读取选中的棋子
*/
ChessClass.prototype.can_kill = function(index,selindex){
  if(typeof(selindex)=='undefined'){ // 没有指定执行消灭的棋子
    if(this.selected!=null){    // 有选中的棋子
      selindex = this.selected['index'];
    }else{
      return false;
    }
  }
  if(this.chess[index]['type']!=this.chesstype[this.player]){
    if(parseInt(this.chess[selindex]['val'])==7 && parseInt(this.chess[index]['val'])==1){ // 7 can kill 1
      return true;
    }else if(parseInt(this.chess[selindex]['val'])==1 && parseInt(this.chess[index]['val'])==7){ // 1 can't kill 7
      return false;
    }else if(parseInt(this.chess[selindex]['val']) <= parseInt(this.chess[index]['val'])){  // small kill big
      return true;
    }
  }
  return false;
} 

// change player
ChessClass.prototype.change_player = function(){
  if(this.player == 1){
    this.player = 2;  // to green
    $('grade_img2').className = 'img_on';
    $('grade_img1').className = 'img';
  }else{
    this.player = 1;  // to red
    $('grade_img1').className = 'img_on';
    $('grade_img2').className = 'img';
  }
} 

// reset grade
ChessClass.prototype.reset_grade = function(){
  $('grade_img1').className = 'img_on';
  $('grade_img2').className = 'img';
  $('grade_num1').innerHTML = $('grade_num2').innerHTML = 16;
  $('grade_res1').className = $('grade_res2').className = 'none';
  $('grade_res1').innerHTML = $('grade_res2').innerHTML = '';
} 

// game over
ChessClass.prototype.gameover = function(){
  if($('grade_num1').innerHTML==0 || $('grade_num2').innerHTML==0){  // 任一方棋子为0
    this.isover = 1;
    this.show_grade();
    disp('init_div','show');
  }else{
    if(this.can_action()==false){
      this.isover = 1;
      this.show_grade();
      disp('init_div','show');
    }
  }
} 

// show grade
ChessClass.prototype.show_grade = function(){
  var num1 = parseInt($('grade_num1').innerHTML);
  var num2 = parseInt($('grade_num2').innerHTML);
  if(num1>num2){ // 红方胜
    $('grade_res2').innerHTML = 'LOSS';
    $('grade_res2').className = 'loss';
    $('grade_res1').innerHTML = 'WIN';
    $('grade_res1').className = 'win';
  }else if(num1<num2){ // 黑方胜
    $('grade_res1').innerHTML = 'LOSS';
    $('grade_res1').className = 'loss';
    $('grade_res2').innerHTML = 'WIN';
    $('grade_res2').className = 'win';
  }else{ // 平局
    $('grade_res1').innerHTML = $('grade_res2').innerHTML = 'DRAW';
    $('grade_res1').className = $('grade_res2').className = 'draw';
  }
} 

// check chess can action
ChessClass.prototype.can_action = function(){
  var chess = this.chess;
  for(var i=0,max=chess.length; i<max; i++){
  if(chess[i].status==0){ // 有未翻开的棋子
    return true;
  }else{
    if(chess[i].status==1 && chess[i].type==this.chesstype[this.player]){  // 己方已翻开的棋子
      if(this.beside(i-this.boardcols, i) && (chess[i-this.boardcols].status==-1 || this.can_kill(i-this.boardcols,i) )){ // 上
        return true;
      }
      if(this.beside(i+this.boardcols, i) && (chess[i+this.boardcols].status==-1 || this.can_kill(i+this.boardcols,i) )){ // 下
        return true;
      }
      if(this.beside(i-1, i) && (chess[i-1].status==-1 || this.can_kill(i-1,i) )){  // 左
        return true;
      }
      if(this.beside(i+1, i) && (chess[i+1].status==-1 || this.can_kill(i+1,i) )){  // 右
        return true;
      }
    }
  }
  }
  return false;
} 

/** common function */ 

// get document.getElementBy(id)
function $(id){
  this.id = id;
  return document.getElementById(id);
} 

// get document.getElementsByTagName
function $_tag(name, id){
  if(typeof(id)!='undefined'){
    return $(id).getElementsByTagName(name);
  }else{
    return document.getElementsByTagName(name);
  }
} 

/* div show and hide
* @param id dom id
* @param handle show or hide
*/
function disp(id, handle){
  if(handle=='show'){
    $(id).style.display = 'block';
  }else{
    $(id).style.display = 'none';
  }
} 

/* img preload
* @param img    要加载的图片数组
* @param callback  图片加载成功后回调方法
*/
function img_preload(img, callback){
  var onload_img = 0;
  var tmp_img = [];
  for(var i=0,imgnum=img.length; i<imgnum; i++){
    tmp_img[i] = new Image();
    tmp_img[i].src = img[i];
    if(tmp_img[i].complete){
      onload_img ++;
    }else{
      tmp_img[i].onload = function(){
        onload_img ++;
      }
    }
  }
  var et = setInterval(
    function(){
      if(onload_img==img.length){ // 定时器,判断图片完全加载后调用callback
        clearInterval(et);
        callback();
      }
    },200);
}

完整实例代码点击此处本站下载。

相信本文所述对大家javascript游戏设计的学习有一定的借鉴价值。

(0)

相关推荐

  • JS小游戏之仙剑翻牌源码详解

    本文实例讲述了JS小游戏的仙剑翻牌源码,是一款非常优秀的游戏源码.分享给大家供大家参考.具体如下: 一.游戏介绍: 这是一个翻牌配对游戏,共十关. 1.游戏随机从42张牌中抽取9张进行游戏,每组为2张相同的牌,共18张牌. 2.连续翻到两张相同的为胜利,当9组全部翻到则过关.如不是翻到连续两张相同的,则需要重新翻. 3.游戏共有10关,在规定时间内通过为挑战成功. 4.如果某关在规定时间内没有通过,则会从当前关继续游戏. 5.游戏中的卡牌图片与音乐均为大宇公司所有. 6.需要支持html5的浏览

  • JavaScript打字小游戏代码

    功能模块: 程序设计: 1.可选择游戏时间,显示倒计时 1.定义全局变量 2.可选择英文字母出现个数 2.控制游戏时间函数 3.统计得分 3.动画效果 4.菜单选项 4.设定字母图片出现的时间 5.判断函数 6.游戏菜单 7.游戏时间选项 8.显示游戏时间 9.游戏难度选项 10.游戏得分 先上效果图:(PS:美工是硬伤) 主要代码设计: 复制代码 代码如下: //-------全局变量------- var data={ "10":["<img src='images

  • JS小游戏之宇宙战机源码详解

    本文实例讲述了JS小游戏的宇宙战机源码,分享给大家供大家参考.具体介绍如下: 一.游戏介绍: 这是一款飞行射击游戏,纵向,共六关. 二.游戏需求: 1.战机可发射子弹,子弹可通过获取道具升级. 2.战机可放bomb,可获取道具增加数量. 3.战机可蓄力攻击. 4.道具有三种,分别是升级子弹,增加bomb数量,增加战机数量. 5.每关音乐不同. 6.战机被击落后再进入战场,有保护状态. 7.敌机AI设计. 游戏运行如下图所示: 完整实例代码点击此处本站下载. 三.Javascript源码部分: /

  • 纯javascript模仿微信打飞机小游戏

    七夕情人节也不要忘了打游戏喔喔-,下面小编为大家准备的情人节礼物之纯javascript模仿微信打飞机小游戏分享给天下的情人们. 首先给大家展示效果图: 查看演示      源码下载 纯JavaScript模仿微信打飞机游戏,做网页小游戏的借鉴下,界面设计是竖长形仿手机屏幕风格,游戏效果流畅.具有分数统计,里面的JS封装类中包括有创建飞机类.飞机移动行为控制,创建子弹类,产生min到max之间的随机数,判断本方飞机是否移出边界,如果移出边界,则取消mousemove事件,反之加上mousemov

  • 使用Javascript写的2048小游戏

    最近心血来潮,项目结束了,使用javascript写个小游戏,练练收吧,写的不好还请各位大侠给出批评建议. HTML代码如下 <!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8" /> <link rel="stylesheet" href="2048.css"/> <scri

  • 12个非常有创意的JavaScript小游戏

    这里是12个非常有创意的JavaScript小游戏,希望在给我们带来趣味的同时也能更进一步地了解更深层次的JavaScript语言,原来它可以这样的. Browser Pong Twitch Browser Ball Crystal Galazy Video & Picture Puzzle Apophis 2029 Bing-Bong Bomberman Bunny Hunt Real world racer JS Wars Berts Breakdown via:12 Amazing and

  • JS实现的走迷宫小游戏完整实例

    本文实例讲述了JS实现的走迷宫小游戏.分享给大家供大家参考,具体如下: 先来看看运行效果截图: 完整实例代码如下: <!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

  • js实现打地鼠小游戏

    话不多说,请看代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>打地鼠</title> <style type="text/css"> #content { width:960px; margin:0 auto; text-align:center; margin-top:40px; } #form1 {

  • 分享自己用JS做的扫雷小游戏

    引用了jQuery,节省了很多鼠标点击上的判断.界面显然都是照搬Windows的扫雷啦,详细的内容注释里都有,我就不啰嗦啦~ 先上截图~ 引用了jQuery,节省了很多鼠标点击上的判断 界面显然都是照搬Windows的扫雷啦 详细的内容注释里都有,我就不啰嗦啦~ JS部分 var mineArray, //地雷数组 lastNum, //剩余雷数 countNum, //未被揭开的方块数 inGame = 0, //游戏状态,0为结束,1为进行中,2为初始化完毕但未开始 startTime; /

  • js实现九宫格拼图小游戏

    效果如下: 代码如下: <!doctype html> <html> <head> <meta charset="UTF-8"> <title>九宫格拼图</title> <style> *{ padding: 0; margin: 0; border: 0; } /* *是通配符,给所有的元素去掉默认样式,因为有的浏览器会默认加上一些样式,这可能会给布局带来问题 */ body{ width: 100

  • js猜数字小游戏的简单实现代码

    复制代码 代码如下: <!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><meta http-equiv="

  • JavaScript编写连连看小游戏

    天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果图: 写连连看之前要先考虑哪些呢? 1:如何判断两个元素可以连接呢, 刚刚开始的时候我也纳闷, 可以参考这里:打开: 2:模板引擎怎么选择呢, 我用了底线库的template,因为语法简单. 本来想用Handlebars,但是这个有点大啊, 而且底线库也提供很多常用工具方法( •̀ ω •́ )y:

随机推荐