九九のプログラムを作成しています。
0. 問題を作成しユーザーに出題。
0. ユーザーが答えを入力すると正解か間違いかを判定し返す。
0. 間違いの場合、正答を表示する。
という流れです。
問題には3タイプあり
0. 通常:3×4=?
0. 穴埋め:3×?=12
0. 穴埋め2:?×?=12
のいずれかがランダムで出題されます。
以下のような実装を考えてみました。
IQuestion
1public interface IQuestion { 2 bool IsCorrect(int answer); 3 int GetCorrectAnswer(); 4}
QuestionNormal
1public class QuestionNormal : IQuestion { 2 int factor1; // 因数1 3 int factor2; // 因数2 4 5 bool IsCorrect(int answer) { 6 return factor1 * factor2 == answer; 7 } 8 9 int GetCorrectAnswer() { 10 return factor1 * factor2; 11 } 12 13}
QuestionAnaumeSingle
1public class QuestionAnaumeSingle: IQuestion { 2 int factor; // 因数 3 int product; // 積 4 5 bool IsCorrect(int answer) { 6 return factor * answer == product; 7 } 8 9 int GetCorrectAnswer() { 10 return product / factor; 11 } 12 13}
KukuGenerator
1public class KukuGenerator() { 2 IQuestion GenerateQuestion() { 3 // 問題3タイプのうちどれかを生成し返す 4 } 5}
main
1// 九九の問題を作成(3タイプのうちどれか) 2var question = kukuGenerator.GenerateQuestion(); 3// ユーザーからの入力を受け付け 4var 入力 = inputProvider.GetAnswer(); 5// 入力された回答が合っているかのチェック 6bool isCorrect = question.IsCorrect(入力); 7 8if (isCorrect) { 9 Console.Write("正解"); 10} else { 11 Console.Write("不正解"); 12 // 不正解なら正解を取得 13 var correctAnswer = question.GetCorrectAnswer(); 14 // 正解を表示 15 // 問題タイプ「通常」なら「12」と表示 16 // 問題タイプ「穴埋め2」なら「(2,6) (3,4) (4,3) (6,2)」と表示 17 // 可能であれば文字列でなく、数値で受け取り、それを別のViewに投げて表示したい 18} 19
##困ったこと
ここで困ったことが穴埋め2の実装です。
問題タイプによってユーザーからの回答受付数と正解の個数が以下の様に異なるため
穴埋め2のみ、回答数と正解個数が違うためうまく共通化できません。
通常:3×4=? 回答数1, 正解個数1,正解は12。
穴埋め:3×?=12 回答数1, 正解個数1,正解は4。
穴埋め2:?×?=12 回答数2, 正解個数4,正解は(2,6) (3,4) (4,3) (6,2)。
##考えたこと
インターフェースを複数の回答、正解に対応するよう変更し、問題タイプ1,2もそれに合わせて実装する。
IQuestion
1public interface IQuestion { 2 bool IsCorrect(List<int> answers); 3 List<List<int>> GetCorrectAnswers(); 4}
しかしこれだと問題タイプ3を共通化したいがために無理やり作った感がでるためしっくりきていません。
個別にゴリゴリに書けば動作するものは作れるのですが、こういった場合に上手い実装の仕方はないでしょうか。
回答4件
あなたの回答
tips
プレビュー