Я начну с формулировки простых правил для этого проекта, чтобы вы могли следовать логике: Toto = 1 балл и разница мячей = 3 балла
если результат матча заканчивается 2 — 0, а пользователь прогнозирует 3 — 1, он получает разницу в 3 очка.
Логика, которую я пытаюсь реализовать, связана с тем, что программа рассматривает это как общую точку. Тотал работает так, как будто совпадение заканчивается 5 — 0, и вы прогнозируете 1 — 0, вы все равно получаете одно очко, чтобы угадать правильный результат, проблема в том, что работает с ничьей, если матч заканчивается как ничья 3 — 3, а вы предсказали 1 — 1, то получите 1 очко
вот логика для разницы целей в коде php
// check for goal diff bonus
$goal_diff_bonus = Football_Pool_Utils::get_fp_option( 'diffpoints', FOOTBALLPOOL_DIFFPOINTS, 'int' );
if ( ! $full && $home != $away && ( $home - $user_home ) == ( $away - $user_away ) ) {
$score += $goal_diff_bonus;
}
if ( $joker == 1 && $this->has_jokers ) $score *= Football_Pool_Utils::get_fp_option( 'joker_multiplier', FOOTBALLPOOL_JOKERMULTIPLIER, 'int' );
return $score;
а вот текущая логика для тотальных точек
$full = false;
$score = 0;
// check for toto result
if ( $this->is_toto_result( $home, $away, $user_home, $user_away ) == true ) {
// check for exact match
if ( $home == $user_home && $away == $user_away ) {
$score = (int) Football_Pool_Utils::get_fp_option( 'fullpoints', FOOTBALLPOOL_FULLPOINTS, 'int' );
$full = true;
} else {
$score = (int) Football_Pool_Utils::get_fp_option( 'totopoints', FOOTBALLPOOL_TOTOPOINTS, 'int' );
}
}
я пытаюсь сделать ничью, которая, если игрок угадывает 1-1, а результат — 5-5 или любая другая ничья — разница мячей в 3 очка.
чтобы избежать путаницы, предсказание правильного исхода матча
следующий код должен быть в состоянии взять счет хозяев и гостей и игроков хозяев и гостей, и если они приведут к ничьей, он должен дать ему бонус разницы мячей, поэтому согласно этому коду он должен иметь такую функциональность
// check for goal bonus
$goal_bonus = Football_Pool_Utils::get_fp_option( 'goalpoints', FOOTBALLPOOL_GOALPOINTS, 'int' );
if ( $home == $user_home ) $score += $goal_bonus;
if ( $away == $user_away ) $score += $goal_bonus;
// check for goal diff bonus
$goal_diff_bonus = Football_Pool_Utils::get_fp_option( 'diffpoints', FOOTBALLPOOL_DIFFPOINTS, 'int' );
if ( ! $full && $home != $away && ( $home - $user_home ) == ( $away - $user_away ) ) {
$score += $goal_diff_bonus;
}
if ( $joker == 1 && $this->has_jokers ) $score *= Football_Pool_Utils::get_fp_option( 'joker_multiplier', FOOTBALLPOOL_JOKERMULTIPLIER, 'int' );
return $score;
}
также то же самое нужно изменить в коде sql для этой функции
SELECT
0, %d AS score_type, m.play_date AS score_date, m.id AS match_id, u.ID AS user_id
, IF ( p.has_joker = 1, %d, 1 ) AS `score`
, IF ( m.home_score = p.home_score AND m.away_score = p.away_score, 1, NULL ) AS `full`
, IF ( m.home_score = p.home_score AND m.away_score = p.away_score, NULL,
IF (
IF ( m.home_score > m.away_score, 1, IF ( m.home_score = m.away_score, 3, 2 ) )
=
IF ( p.home_score > p.away_score, 1, IF ( p.home_score = p.away_score, 3, 2 ) )
, IF ( p.home_score IS NULL OR p.away_score IS NULL, NULL, 1 )
, NULL
)
) AS `toto`
, IF ( m.home_score = p.home_score,
IF ( m.away_score = p.away_score, 2, 1 ),
IF ( m.away_score = p.away_score, 1, NULL )
) AS `goal_bonus`
, IF( m.home_score = p.home_score AND m.away_score = p.away_score, NULL,
IF(
m.home_score <> m.away_score AND
( CAST( m.home_score AS SIGNED ) - CAST( p.home_score AS SIGNED ) )
=
( CAST( m.away_score AS SIGNED ) - CAST( p.away_score AS SIGNED ) )
, 1, NULL
)
) AS `goal_diff_bonus`
, 0 AS `ranking`
, %d AS `ranking_id`
FROM {$wpdb->users} u
LEFT OUTER JOIN {$prefix}matches m ON ( 1 = 1 )
LEFT OUTER JOIN {$prefix}predictions p
ON ( p.match_id = m.id AND ( p.user_id = u.ID OR p.user_id IS NULL ) )
WHERE m.home_score IS NOT NULL AND m.away_score IS NOT NULL AND u.ID IN ( {$user_ids} ) ";
Сценарии sql и php должны работать вместе, чтобы сделать счет ничьи равным бонусу разницы мячей
Задача ещё не решена.
Других решений пока нет …