├── README.md └── 足球竞赛.js /README.md: -------------------------------------------------------------------------------- 1 | # 竞彩规则及计算 2 | 做项目有机会接触了下体彩中心发行的竞彩业务,这里对投注规则及注数计算方法进行总结。 3 | ## 足球竞赛 4 | 足球竞赛投注有两种模式,*单关* 和 *串关*。 5 | 6 | 单关投注计算方式是从投注比赛中每场选一个投注项和其它场次组合成一个最终投注单。形式简单不多介绍。 7 | 8 | 串关投注计算方式比较复杂,可以解决单关投注方式效率低的问题。以下详细介绍。 9 | ### 串关玩法介绍 10 | 共有6种玩法,*胜平负*,*让球胜平负*,*比分*,*半全场*,*总进球*,*混合过关*。不同玩法规则下每场比赛的投注选项不一样: 11 | + 胜平负 12 | 13 | 每场比赛有三个投注选项。 14 | 15 | ['胜','平','负'] 16 | + 让球胜平负 17 | 18 | 每场比赛有三个投注选项。 19 | 20 | ['让胜','让平','让负'] 21 | + 比分 22 | 23 | 每场比赛有31个投注选项。 24 | 25 | [ 26 | '1:0', '2:0', '2:1', '3:0', '3:1', '3:2', '4:0', '4:1', '4:2', '5:0', '5:1', '5:2', '胜其他', 27 | '0:0', '1:1', '2:2', '3:3', '平其他', 28 | '0:1', '0:2', '1:2', '0:3', '1:3', '2:3', '0:4', '1:4', '2:4', '0:5', '1:5', '2:5', '负其他' 29 | ] 30 | + 半全场 31 | 32 | 每场比赛有9个投注选项。 33 | 34 | ['胜胜', '胜平', '胜负', '平胜', '平平', '平负', '负胜', '负平', '负负'] 35 | + 总进球 36 | 37 | 每场比赛有8个投注选项。 38 | 39 | ['0', '1', '2', '3', '4', '5', '6', '7+'] 40 | + 混合 41 | 42 | 每场比赛投注选项由以上选项混合而成。 43 | 44 | ### 串关过关方式 45 | 足球竞彩投注,用户至少选择两场比赛,最多选10-15场进行投注,每场比赛可选多个投注项。串关是对所选比赛场数进行组合搭配的一种快捷方法,`M串N` 计作 `MxN`。最多8串。 46 | 47 | 串关模式下过关方式分为两种: 48 | 1. 自由过关 49 | 50 | 自由选择过关的场数组合,可选2场、3场...8场。分别组成串关组合,如2串1,3串1...8串1。投注时可多选。 51 | 2. 多串过关 52 | 53 | 按照固定的模式对场数组合,至少3场,如3串3,3串4...8串247。投注时不可多选。 54 | 55 | *固定模式的一般解释*:对投注比赛场次先按照过关场数进行分组,然后对每组按照过关分组数区间进行分组,最终对分组后每组内的比赛每场选一个投注项进行组合。 56 | 57 | 例如:有投注比赛`['A','B','C','D']`(ABCD分别代表一场比赛的投注内容,每场比赛可选多个内容),选择模式`3串3`,则过关场数是3,对该投注结果先按照3场一组进行组合得到 58 | 59 | [ 60 | [ 'A' , 'B' , 'C' ], 61 | [ 'A' , 'B' , 'D' ], 62 | [ 'A' , 'C' , 'D' ], 63 | [ 'B' , 'C' , 'D' ] 64 | ] 65 | 又`3串3`的过关分组数区间为2,然后对分组后的每组按照2场一组进行组合得到 66 | 67 | [ 68 | [ 'A', 'B' ], 69 | [ 'A', 'C' ], 70 | [ 'B', 'C' ], 71 | [ 'A', 'B' ], 72 | [ 'A', 'D' ], 73 | [ 'B', 'D' ], 74 | [ 'A', 'C' ], 75 | [ 'A', 'D' ], 76 | [ 'C', 'D' ], 77 | [ 'B', 'C' ], 78 | [ 'B', 'D' ], 79 | [ 'C', 'D' ] 80 | ] 81 | 再然后对每一组的投注内容进行交叉组合,最后形成多个投注项。假设比赛'A'投注内容为`['胜','平']`,'B'投注内容为`['让平','让负']`,则以上分组['A','B']形成投注项为 82 | 83 | [ 84 | ['胜', '让平'], 85 | ['胜', '让负'], 86 | ['平', '让平'], 87 | ['平', '让负'], 88 | ] 89 | 以此类推,遍历计算每组比赛投注内容的组合,得出最后的投注组合。 90 | 91 | #### 多串过关方式列表 92 | 针对投注的比赛赛果,每种串关方式由过关场数,过关分组数区间构成。按照过关场数分组后,对过关分组数区间进行以上规则的循环计算。 93 | + 3串3 过关场数3,分组数区间2。 94 | + 3串4 过关场数3,分组数区间2-3。 95 | + 4串4 过关场数4,分组数区间3。 96 | + 4串5 过关场数4,分组数区间3-4。 97 | + 4串6 过关场数4,分组数区间2。 98 | + 4串11 过关场数4,分组数区间2-4。 99 | + 5串5 过关场数5,分组数区间4。 100 | + 5串6 过关场数5,分组数区间4-5。 101 | + 5串10 过关场数5,分组数区间2。 102 | + 5串16 过关场数5,分组数区间3-5。 103 | + 5串20 过关场数5,分组数区间2-3。 104 | + 5串26 过关场数5,分组数区间2-5。 105 | + 6串6 过关场数6,分组数区间5。 106 | + 6串7 过关场数6,分组数区间5-6。 107 | + 6串15 过关场数6,分组数区间2。 108 | + 6串20 过关场数6,分组数区间3。 109 | + 6串22 过关场数6,分组数区间4-6。 110 | + 6串35 过关场数6,分组数区间2-3。 111 | + 6串42 过关场数6,分组数区间3-6。 112 | + 6串50 过关场数6,分组数区间2-4。 113 | + 6串57 过关场数6,分组数区间2-6。 114 | + 7串7 过关场数7,分组数区间6。 115 | + 7串8 过关场数7,分组数区间6-7。 116 | + 7串21 过关场数7,分组数区间5。 117 | + 7串35 过关场数7,分组数区间4。 118 | + 7串120 过关场数7,分组数区间2-7。 119 | + 8串8 过关场数8,分组数区间7。 120 | + 8串9 过关场数8,分组数区间7-8。 121 | + 8串28 过关场数8,分组数区间6。 122 | + 8串56 过关场数8,分组数区间5。 123 | + 8串70 过关场数8,分组数区间4。 124 | + 8串247 过关场数8,分组数区间2-8。 125 | 126 | #### 串关模式的选取 127 | 当投注比赛场数大于串关要求数量是可以选择该串关方式,如投注4场比赛: 128 | + 自由过关,则可选2x1,3x1,4x1。不可选5x1。 129 | + 多串过关,则可选3x3,3x4,4x4,4x5,4x6,4x11。不可选5x5。 130 | 131 | ### 串关投注结果展示 132 | 如胜平负玩法: 133 | 134 | [ 135 | ['胜', '负'], //拉齐奥 vs 乌迪内斯 136 | ['胜', '平', '负'], //桑普 vs 罗马 137 | ... 138 | ] 139 | -------------------------------------------------------------------------------- /足球竞赛.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 按照串关场数分组,3场串、4场串。。。8场串。 3 | * 每组串关场次包含多个串关方式,如3串3、3串4,多个串关方式对应不同的再分组区间。 4 | * [串N, Max, Min]表示比赛场次按N场分组后,每组再进行串Max分组,然后对每组进行组合;以上操作循环至Min 5 | */ 6 | const PASS_MODE_MAP = [ 7 | [ 8 | [3, 2, 2], //3x3 9 | [4, 3, 2] //3x4 10 | ], 11 | [ 12 | [4, 3, 3], //4x4 13 | [5, 4, 3], //4x5 14 | [6, 2, 2], //4x6 15 | [11, 4, 2] //4x11 16 | ], 17 | [ 18 | [5, 4, 4], //5x5 19 | [6, 5, 4], //5x6 20 | [10, 2, 2], //5x10 21 | [16, 5, 3], //5x16 22 | [20, 3, 2], //5x20 23 | [26, 5, 2] //5x26 24 | ], 25 | [ 26 | [6, 5, 5], //6x6 27 | [7, 6, 5], //6x7 28 | [15, 2, 2], //6x15 29 | [20, 3, 3], //6x20 30 | [22, 6, 4], //6x22 31 | [35, 3, 2], //6x35 32 | [42, 6, 3], //6x42 33 | [50, 4, 2], //6x50 34 | [57, 6, 2] //6x57 35 | ], 36 | [ 37 | [7, 6, 6], //7x7 38 | [8, 7, 6], //7x8 39 | [21, 5, 5], //7x21 40 | [35, 4, 4], //7x35 41 | [120, 7, 2] //7x120 42 | ], 43 | [ 44 | [8, 7, 7], //8x8 45 | [9, 8, 7], //8x9 46 | [28, 6, 6], //8x28 47 | [56, 5, 5], //8x56 48 | [70, 4, 4], //8x70 49 | [247, 8, 2] //8x247 50 | ] 51 | ]; 52 | 53 | /** 54 | * 55 | * @param {Array} matches 投注场次 56 | * @param {Number} cgCount 串关场数 57 | * @param {Number} cgMode 串关方式 58 | */ 59 | function createMode (matches, cgCount, cgMode){ 60 | // export default function createMode (matches, cgCount, cgMode){ 61 | let cgroup = PASS_MODE_MAP[cgCount-3]; 62 | let range = []; 63 | 64 | for(let i=0,len=cgroup.length; i 1){ 102 | ret = ret.concat(CS(total, num-1, i+1, rest) ); 103 | }else{ 104 | ret.push(rest); 105 | } 106 | } 107 | 108 | return ret; 109 | } 110 | 111 | //遍历每组比赛,取每场比赛的一个选项进行组合 112 | function mix(list, limit, idx=0, concat) { 113 | let ret=[]; 114 | 115 | for(let i=0,len=list[idx].length; i1){ 118 | ret = ret.concat(mix(list, limit-1, idx+1, rest)); 119 | }else{ 120 | ret.push(rest); 121 | } 122 | } 123 | 124 | return ret; 125 | } 126 | 127 | /** 128 | * @usage 129 | */ 130 | let matches = [ 131 | ['胜', '平'], 132 | ['让胜', '让平', '让负'], 133 | ['2:1', '1:1', '平其它'], 134 | [2, 3, 1], 135 | ['胜胜', '平胜'] 136 | ]; 137 | 138 | createMode(matches, 4, 6); //上述比赛选项进行4x6串关后共201注 139 | --------------------------------------------------------------------------------