美文网首页程序员
中国象棋的简单实现

中国象棋的简单实现

作者: 勤学会 | 来源:发表于2017-10-04 07:08 被阅读0次

一.位置化的数字棋盘
象棋的棋盘长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点.
第一排: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;//向前走一步
    }
    //未完待续
}

相关文章

网友评论

    本文标题:中国象棋的简单实现

    本文链接:https://www.haomeiwen.com/subject/ileqyxtx.html