numbers2.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /*
  3. * To change this license header, choose License Headers in Project Properties.
  4. * To change this template file, choose Tools | Templates
  5. * and open the template in the editor.
  6. */
  7. /**
  8. * Description of numbers
  9. *
  10. * @author gregory
  11. */
  12. class numbers2 {
  13. private $user;
  14. /**
  15. * Setup new numbers engine
  16. *
  17. * @param bool $test Enable debug mode.
  18. */
  19. public function __construct($user) {
  20. $this->user = $user;
  21. }
  22. public function getNumbers() {
  23. $difficulty = $this->difficulty();
  24. $question = $this->getSequence($difficulty);
  25. $questionHtml = $this->htmlify($question);
  26. e107::getDb()->insert('tkLastQuestion', ['user'=>$this->user,'LastQuestionHtml'=>base64_encode($questionHtml)]);
  27. e107::getRender()->tablerender('Numbers', $questionHtml);
  28. }
  29. /**
  30. * Return the difficulty based on previously answered questions.
  31. *
  32. * @return int Difficulty as percent.
  33. */
  34. private function difficulty() {
  35. $stats = e107::getDb()->retrieve("SELECT (SUM(correct)/COUNT(correct)*100) as percent,COUNT(correct) as count
  36. FROM e107.`e107_tkReport` WHERE
  37. answereddatestamp >= unix_timestamp((NOW()) - INTERVAL 1 MONTH)
  38. AND username = '$this->user' AND subject = 'numbers';");
  39. if ($stats["count"]==0) {
  40. return 1;
  41. } else {
  42. return $stats;
  43. }
  44. }
  45. private function getSequence($difficulty) {
  46. //print_a(['slide'=>($difficulty['percent']/100)*2,'diff'=>$difficulty,'pow'=>(int)pow($difficulty['count'],($difficulty['percent']/100)*2)]);
  47. $startingNumber = mt_rand(0, (int) pow($difficulty['count'],($difficulty['percent']/100)*2));
  48. if($difficulty['count']>=300) {
  49. $incrementalNumber = mt_rand(1, 100 );
  50. }elseif($difficulty['count']>=200){
  51. $incrementalNumber = mt_rand(1, 10 );
  52. }elseif($difficulty['count']>=100){
  53. $incrementalNumber = mt_rand(1, 5 );
  54. }else{
  55. $incrementalNumber = mt_rand(1, 2);
  56. }
  57. $missingNumber = mt_rand(1, 10);
  58. $TempQuestion = [];
  59. for ($i = 1; $i <= 10; $i++) {
  60. if ($i == $missingNumber) {
  61. $TempQuestion[] = "___,";
  62. $solution = round($startingNumber);
  63. } elseif ($i == 10) {
  64. $TempQuestion[] = round($startingNumber);
  65. } else {
  66. $TempQuestion[] = round($startingNumber) . ",";
  67. }
  68. if($difficulty['percent']>=90 && $difficulty['count']>=200){
  69. $startingNumber += round((2*$incrementalNumber)/$i);
  70. }elseif($difficulty['percent']>=80 && $difficulty['count']>=100){
  71. $startingNumber += $incrementalNumber*($i*15);
  72. }else{
  73. $startingNumber += $incrementalNumber;
  74. }
  75. }
  76. return [ 'answer1'=>$solution, 'question'=>$TempQuestion, 'type'=>'numbers'];
  77. }
  78. private function htmlify($question) {
  79. $frm = e107::getForm();
  80. $fString = $frm->open('questionForm', 'post', '', ['autocomplete' => 'off', 'class' => 'formclass']);
  81. $fString .= $frm->label('<h4>Numbers</h4>') . "</br>\n";
  82. $fString .= $frm->label('Find the missing number.') . "\n";
  83. $fString .= '</br>';
  84. foreach ($question['question'] as $seq) {
  85. $fString .= $frm->label($seq . " &nbsp; ") . "\n";
  86. }
  87. $fString .= '</br></br>';
  88. $fString .= $frm->text('a1', '', 80, ['placeholder' => 'Write answer here!', 'autocomplete' => "off", 'spellcheck' => "false"]) . "\n";
  89. $fString .= $frm->hidden('checkerData', TkAnswerStore::issue($this->user, $question), ['id' => 'checkerData']);
  90. $fString .= $frm->hidden('subject', 'numbers', ['id' => 'subject']);
  91. $fString .= '</br>' . "\n";
  92. $fString .= e107::getForm()->button('Answer', 'Check answer') . "\n";
  93. $fString .= e107::getForm()->close();
  94. $fString .= '</br></br>';
  95. return $fString;
  96. }
  97. }