一.位置化的数字棋盘
象棋的棋盘长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点.
第一排:01,02,03,04,05,06,07,08,09
第二排:10,11,12,13,14,15,16,17,18
第三排:19.20,21,22,23,24,25,26,27
第四排:28,29,30,31,32,33,34,35,36
第五排:37,38,39,40,41,42,43,44,45
第六排:46,47,48,49,50,51,52,53,54
第七排:55,56,57,58,59,60,61,62,63
第八排:64,65,66,67,68,69,70,71,72
第九排:73,74,75,76,77,78,79,80,81
第十排:82,83,84,85,86,87,88,89,90
因为棋盘本身就是规则的,所以她才有规律.
因为每一排,有9个点,所以每个点都比后面的点大9.
例如:车前进一步,那么它的位置就是01+(9x1)=10,前进2步就是01+(9x2)=19
二,数字化的棋子
黑棋:01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16
红棋:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116
空白用 blank,表示
然后这些棋子就在棋牌上面排列
从01,排列到90(位置是隐形的数字)
例如:
007,005,003,001,000,002,004,006,008,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,009,blank,blank,blank,blank,blank,010,blank,011,blank,012,blank,013,blank,014,blank,015,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,111,blank,112,blank,113,blank,114,blank,115,blank,109,blank,blank,blank,blank,blank,110,blank,blank,blank,blank,blank,blank,blank,blank,blank,blank,107,105,103,101,100,102,104,106,108
那么007就在01这个位置上面,108就在90这个位置上面
二,设计数据库
CREATE TABLE IF NOT EXISTS xiangqi
(
id
int(11) unsigned NOT NULL AUTO_INCREMENT,
name
varchar(32) NOT NULL DEFAULT '' COMMENT '棋局名称',
black_name
varchar(32) NOT NULL DEFAULT '' COMMENT '执黑棋人名称',
red_name
varchar(32) NOT NULL DEFAULT '' COMMENT '执红棋人名称',
flag
tinyint(1) NOT NULL DEFAULT '0' COMMENT '应该谁出棋,0红棋1黑棋',
chess
varchar(600) NOT NULL DEFAULT '' COMMENT '棋局分布',
time_red
int(10) NOT NULL DEFAULT '0' COMMENT '红方用时',
time_black
int(10) NOT NULL DEFAULT '0' COMMENT '黑方用时',
time
int(10) NOT NULL DEFAULT '0' COMMENT '更新时间',
moved
varchar(32) NOT NULL DEFAULT '' COMMENT '最新一步来去位置',
eated
varchar(32) NOT NULL DEFAULT '' COMMENT '吃掉的棋子',
red__win
int(10) NOT NULL DEFAULT '0' COMMENT '红方赢棋数',
black_win
int(10) NOT NULL DEFAULT '0' COMMENT '黑方赢棋数',
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='象棋表' AUTO_INCREMENT=1 ;
四,规则验证
/**
* @param int $chess 棋子的名称
* @param int $$from 来的位置
* @param int $$to 去的位置
* @return int
*/
function check($chess, $from, $to){
//[卒]---黑子 卒子只能向前,不能后退。但过了河之后才可以横着走
if($chess == "011" || $chess == "012" || $chess == "013" || $chess == "014" || $chess == "015")
{
if($from >= 46 && ($from - $to == 1 || $to - $from == 1))
return 1;//横走
if($to - $from == 9)
return 1;//向前走一步
}
//[卒]---红子
if($chess == "111" || $chess == "112" || $chess == "113" || $chess == "114" || $chess == "115")
{
if($from <= 45 && ($from - $to == 1 || $to - $from == 1))
return 1;//横走
if($from - $to == 9)
return 1;//向前走一步
}
//未完待续
}
网友评论