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

作者:shichen2014 时间:2024-04-23 09:24:55 

本文实例讲述了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游戏设计的学习有一定的借鉴价值。

标签:JS,游戏,源码
0
投稿

猜你喜欢

  • asp实现树型结构

    2008-04-13 06:06:00
  • 树莓派用python中的OpenCV输出USB摄像头画面

    2023-11-04 12:12:49
  • Python中使用Opencv开发停车位计数器功能

    2022-04-27 17:26:44
  • asp利用Split函数进行多关键字检索

    2011-03-16 11:10:00
  • Python列表的深复制和浅复制示例详解

    2023-01-29 01:26:47
  • 通过格式良好的SQL提高效率和准确性

    2024-01-21 21:16:27
  • 使用Docker制作Python环境连接Oracle镜像

    2021-02-21 23:42:47
  • 窗口没有提示自动关闭的js代码

    2024-04-16 10:42:17
  • IE及Opera浏览器兼容笔记

    2008-08-21 17:53:00
  • JavaScript的instanceof运算符学习教程

    2024-04-17 10:09:59
  • MySQL中的唯一性约束与NULL详解

    2024-01-13 10:24:10
  • 深入探寻javascript定时器

    2024-04-29 13:36:55
  • ASP运行环境iis和pws的搭建

    2007-09-22 18:44:00
  • JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件

    2024-04-10 11:01:56
  • PHP使用星号隐藏用户名,手机和邮箱的实现方法

    2023-11-05 10:41:56
  • Pycharm代码无法复制,无法选中删除,无法编辑的解决方法

    2023-10-01 01:43:31
  • Python文件处理

    2022-08-08 10:22:01
  • ASP 判断是否有中文的代码

    2011-04-15 11:07:00
  • Python中bisect的用法

    2023-11-05 08:47:53
  • golang 随机数的两种方式

    2024-04-28 10:46:44
  • asp之家 网络编程 m.aspxhome.com