java游戏下载象棋暗棋_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
for(var j=0; j
board = board + '
';
}
}
$('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[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 = '';
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
$('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
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
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游戏设计的学习有一定的借鉴价值。
java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解相关推荐
- Extreme Drift赛车游戏C#源码详解(1)
Extreme Drift赛车游戏C#源码详解(1) C#我只是一个萌新,由于搞过Java,还是可以看懂C#的 偶然间得到赛车游戏Extreme Drift的源码 接下来我会花一段时间来解读,这是一个 ...
- java的String类源码详解
java的String类源码详解 类的定义 public final class Stringimplements java.io.Serializable, Comparable<String ...
- java源码详解——String类
java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...
- Java集合框架源码详解系列(一)
写在前面:大家好!我是晴空๓.如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教.我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/.非常 ...
- java的数组与Arrays类源码详解
java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...
- Java源码详解之NameValuePair
Java源码详解之NameValuePair NameValuePair仅仅是一个接口. 1. 类释义 /*** A name / value pair parameter used as an el ...
- 【java】LinkedList1.8源码详解
目录 前言 概要 属性 构造方法 核心方法 get(int index) set(int index, E element) add(int index, E element) addAll(Coll ...
- 【JAVA秘籍心法篇-Spring】Spring XML解析源码详解
[JAVA秘籍心法篇-Spring]Spring XML解析源码详解 所谓天下武功,无坚不摧,唯快不破.但有又太极拳法以快制慢,以柔克刚.武功外式有拳打脚踢,刀剑棍棒,又有内功易筋经九阳神功.所有外功 ...
- PROTEUS最新版本下载CSDN_233乐园小游戏下载最新版本-233乐园小游戏下载并安装下载免费...
<233乐园小游戏下载并安装>是一款非常好用的游戏盒子类的软件,玩家能够通过软件找到包括樱花校园模拟器等在内的各种最新版本的破解版游戏资源,免费进行体验,另外还可以交友分享自己的生活,认识 ...
最新文章
- 2020-10-26关于虚拟机中的HWADDR和MACADDR地址
- 关于JS 事件冒泡和onclick,click,on()事件触发顺序
- 基于爬山算法求解TSP问题(JAVA实现)
- spring 源码分析之BeanPostProcessor
- Python机器学习算法 — 逻辑回归(Logistic Regression)
- Spark读取配置源码剖析
- 每日英语:Five Really Dumb Money Moves You've Got to Avoid
- 网友力荐教子名言 只有50句却能改变儿女一生
- ZAB 协议和Paxos 算法
- Java学习个人备忘录之接口
- SpringBoot-JPA删除不成功,只执行了查询语句
- 锁失效_分布式锁的解决方案(二)
- Atitit 通用服务端代理接口 转接口 attilax总结
- 中文文本分析工具总结
- 8.0版本jdbc驱动连接数据库
- PB通过VDN实现Http上传、下载
- 文件指针移动(完整版)
- 大学生创新创业类竞赛参赛指南
- Python开发-面向对象编程-王大鹏-专题视频课程
- 虚拟化之Proxmox VE虚拟机创建及模板制作