package tv.dyndns.kishibe.qmaclone.client.game.shuffler;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class ShufflerTato implements Shuffleable {
private static final Logger logger = Logger.getLogger(ShufflerTato.class.getName());
@Override
public void shuffle(PacketProblem problem, int[] answerOrder, int[] choiceOrder) {
Preconditions.checkNotNull(answerOrder);
Preconditions.checkNotNull(choiceOrder);
if (answerOrder.length < 1 || choiceOrder.length < 3) {
problem.shuffledAnswers = null;
problem.shuffledChoices = null;
return;
}
Set<String> answers = ImmutableSet.copyOf(problem.getAnswerList());
List<String> choices = Lists.newArrayList();
// 正答を一つ追加する
for (int choiceIndex : choiceOrder) {
String choice = problem.choices[choiceIndex];
if (!answers.contains(choice)) {
continue;
}
choices.add(choice);
break;
}
// 選択肢を4つ選ぶ
int numberOfChoices = Math.min(choiceOrder.length, problem.numberOfDisplayedChoices);
for (int choiceIndex : choiceOrder) {
String choice = problem.choices[choiceIndex];
if (choices.contains(choice)) {
continue;
}
choices.add(choice);
if (choices.size() >= numberOfChoices) {
break;
}
}
if (choices.size() < numberOfChoices) {
String warningMessage = "選択肢シャッフル中に不正なデータを検出しました: "
+ MoreObjects.toStringHelper(this).add("problem", problem)
.add("answerOrder", Arrays.toString(answerOrder))
.add("choiceOrder", Arrays.toString(choiceOrder)).toString();
logger.log(Level.WARNING, warningMessage);
}
// 4つの選択肢を並び替える
List<Integer> secondOrder = Lists.newArrayList();
for (int choiceIndex : choiceOrder) {
if (choiceIndex < choices.size()) {
secondOrder.add(choiceIndex);
}
}
problem.shuffledChoices = new String[numberOfChoices];
for (int i = 0; i < choices.size(); ++i) {
problem.shuffledChoices[i] = choices.get(secondOrder.get(i));
}
// 選択肢に対応した解答を作成する
Set<String> remainedAnswers = Sets.newHashSet(answers);
remainedAnswers.retainAll(Arrays.asList(problem.shuffledChoices));
problem.shuffledAnswers = remainedAnswers.toArray(new String[0]);
}
}