static void write_help_adapter(slice_index si, stip_structure_traversal *st) { state_type * const state = st->param; stip_length_type const save_length = state->length; structure_traversal_level_type const save_level = state->branch_level; state->branch_level = st->level; state->length = SLICE_U(si).branch.length; if (is_series(si)) write_series(si,st); else write_help(si,st); state->length = save_length; state->branch_level = save_level; }
// // Function: // can_follow_poker // Description: // 根据请求,检查要出的牌是否合法。如果合法,则将牌的属性保存在pp。(用于接牌) // Parameter: // pp - 用于保存扑克牌序列的属性 // vec - 扑克牌的索引数组,其元素为指向POKER的索引,取值范围为0~53 // num - 索引数组的长度 // req - 请求出牌的属性 // Return: // 操作成功返回true,否则返回false. // Remark: // 调用者需判断该函数的返回值,若返回false,表示无法判断牌的属性,该组牌 // 为不合法序列。 // 传入的参数 vec 为全局扑克牌的索引,而不是玩家当前牌的索引,否则,调用 // 该函数前需要进行转换。 // POKER_API bool can_follow_poker(POKER_PROPERTY* pp, int vec[], int num, POKER_PROPERTY* req) { int value; assert((pp != NULL) && (req != NULL)); // 当前要出的牌是双王炸弹 if (is_king_bomb(vec, num, &value)) { pp->type = BOMB; goto can_follow; } // 当前要出的牌是炸弹 if (is_four_bomb(vec, num, &value)) { if ((req->type != BOMB) || ((req->type == BOMB) && (value > req->value))) { pp->type = BOMB; goto can_follow; } else { return false; } } // 当前要出的牌不是炸弹,但上家的牌是炸弹 if (req->type == BOMB) { return false; } // 上家的牌不是炸弹,当前要打出的牌也不是炸弹 if (num != req->num) { return false; } // // 到这里,说明上家出的牌与当前要出的牌都不是炸弹,并且数量相等,因此, // 只需要比较它们的类型和值即可。 // switch (req->type) { case SINGLE: if (is_single(vec, num, &value)) { goto type_matched; } else { return false; } case PAIR: if (is_pair(vec, num, &value)) { goto type_matched; } else { return false; } case TRIANGLE: if (is_triangle(vec, num, &value)) { goto type_matched; } else { return false; } case THREE_PLUS_ONE: if (is_three_plus_one(vec, num, &value)) { goto type_matched; } else { return false; } case THREE_PLUS_TWO: if (is_three_plus_two(vec, num, &value)) { goto type_matched; } else { return false; } case FOUR_PLUS_TWO: if (is_four_plus_two(vec, num, &value)) { goto type_matched; } else { return false; } case FOUR_PLUS_FOUR: if (is_four_plus_four(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES: if (is_series(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_PAIR: if (is_series_pair(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_TRIANGLE: if (is_series_triangle(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_THREE_PLUS_ONE: if (is_series_three_plus_one(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_THREE_PLUS_TWO: if (is_series_three_plus_two(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_FOUR: if (is_series_four(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_FOUR_PLUS_TWO: if (is_series_four_plus_two(vec, num, &value)) { goto type_matched; } else { return false; } case SERIES_FOUR_PLUS_FOUR: if (is_series_four_plus_four(vec, num, &value)) { goto type_matched; } else { return false; } default: return false; } type_matched: if (value <= req->value) { return false; } pp->type = req->type; can_follow: pp->value = value; pp->num = num; return true; }
// // Function: // get_poker_property // Description: // 获取出牌的相关属性 // Parameter: // pp - [out] poker property if succeed // vec - poker vector to be analyzed. The element are indexes to GLOBAL poker. // num - poker num to be analyzed // Return: // E_NONE if everything is OK, else the pokers are not valid. // Remark: // the poker vector in array vec should be sorted in ascend. // POKER_RET get_poker_property(POKER_PROPERTY* pp, int vec[], int num) { int value; assert(pp != NULL); if (is_single(vec, num, &value)) { pp->type = SINGLE; goto match_succeed; } else if (is_pair(vec, num, &value)) { pp->type = PAIR; goto match_succeed; } else if (is_king_bomb(vec, num, &value)) { pp->type = BOMB; goto match_succeed; } else if (is_triangle(vec, num, &value)) { pp->type = TRIANGLE; goto match_succeed; } else if (is_four_bomb(vec, num, &value)) { pp->type = BOMB; goto match_succeed; } else if (is_three_plus_one(vec, num, &value)) { pp->type = THREE_PLUS_ONE; goto match_succeed; } else if (is_three_plus_two(vec, num, &value)) { pp->type = THREE_PLUS_TWO; goto match_succeed; } else if (is_four_plus_two(vec, num, &value)) { pp->type = FOUR_PLUS_TWO; goto match_succeed; } else if (is_four_plus_four(vec, num, &value)) { pp->type = FOUR_PLUS_FOUR; goto match_succeed; } else if (is_series(vec, num, &value)) { pp->type = SERIES; goto match_succeed; } else if (is_series_pair(vec, num, &value)) { pp->type = SERIES_PAIR; goto match_succeed; } else if (is_series_triangle(vec, num, &value)) { pp->type = SERIES_TRIANGLE; goto match_succeed; } else if (is_series_three_plus_one(vec, num, &value)) { pp->type = SERIES_THREE_PLUS_ONE; goto match_succeed; } else if (is_series_three_plus_two(vec, num, &value)) { pp->type = SERIES_THREE_PLUS_TWO; goto match_succeed; } else if (is_series_four(vec, num, &value)) { pp->type = SERIES_FOUR; goto match_succeed; } else if (is_series_four_plus_two(vec, num, &value)) { pp->type = SERIES_FOUR_PLUS_TWO; goto match_succeed; } else if (is_series_four_plus_four(vec, num, &value)) { pp->type = SERIES_FOUR_PLUS_FOUR; goto match_succeed; } else { return E_INVALID; } match_succeed: pp->value = value; pp->num = num; return E_NONE; }