Created
March 8, 2010 19:16
-
-
Save twright/325481 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
program Quiz; | |
{$mode objfpc} | |
uses sysutils, crt; | |
const | |
SEQ_LEN = 5; | |
NUM_FORMULAE = 4; | |
GUESSES = 2; | |
POINTS = 3; | |
type | |
TPtrForm = function (n : integer; a, b : integer) : integer; | |
TQuiz = object | |
sequence : array [0..SEQ_LEN] of integer; | |
formula : TPtrForm; | |
points : integer; | |
difficulty : integer; | |
procedure randomFormula (); | |
procedure generateSequence (); | |
procedure printSequence (n : integer); | |
function check (ans : integer) : boolean; | |
procedure inputDifficulty (); | |
procedure playTurn (); | |
procedure play (n : integer); | |
end; | |
//// General maths functions //// | |
function factorial (x : integer) : integer; | |
begin | |
if x = 0 then | |
result := 1 | |
else if x > 0 then | |
result := x * factorial (x - 1); | |
end; | |
function pow (x : integer; y : integer) : integer; | |
var | |
i : integer; | |
begin | |
result := 1; | |
for i := 1 to y do | |
result *= x; | |
end; | |
function fibs (x : integer) : integer; | |
begin | |
if x = 0 then | |
result := 1 | |
else if x >= 1 then | |
result := fibs (x - 1) + fibs (x - 2); | |
end; | |
//// Sequence generators //// | |
function arithmetic (n : integer; a, b : integer) : integer; | |
begin | |
result := a + b * n; | |
end; | |
function geometric (n : integer; a, b : integer) : integer; | |
begin | |
result := a * pow (b, n); | |
end; | |
// Fibonacii sequence | |
function fibseq (n : integer; a, b : integer) : integer; | |
begin | |
result := fibs (a + n); | |
end; | |
// Factorials | |
function factseq (n : integer; a, b : integer) : integer; | |
begin | |
result := factorial (a + n); | |
end; | |
//// TQuiz implementation //// | |
// Select a random formula from an array of functions | |
procedure TQuiz.randomFormula (); | |
var | |
formulae : array [1..NUM_FORMULAE] of TPtrForm; | |
begin | |
formulae [1] := @arithmetic; | |
formulae [2] := @geometric; | |
formulae [3] := @factseq; | |
formulae [4] := @fibseq; | |
randomize (); | |
formula := formulae [1 + random (difficulty - 1)]; | |
end; | |
// Generate sequence formula and random input. | |
procedure TQuiz.generateSequence (); | |
var | |
n : integer; | |
a, b : integer; | |
begin | |
randomize (); | |
// a := 1 + random (3 * difficulty); b := 1 + random (3 * difficulty); | |
a := 1 + random (6); b := 1 + random (4); | |
for n := 0 to SEQ_LEN do | |
sequence [n] := formula (n, a, b); | |
end; | |
procedure TQuiz.printSequence (n : integer); | |
var | |
i : integer; | |
begin | |
write (' '); | |
for i := 0 to n do | |
write (sequence [i], ' '); | |
writeln ('...'); | |
end; | |
// Input difficulty level. | |
procedure TQuiz.inputDifficulty (); | |
var | |
tmp : integer; | |
begin | |
repeat | |
write ('What difficulty level? [1 to ', NUM_FORMULAE, ']: '); | |
try | |
readln (tmp); | |
except | |
tmp := -1 | |
end; | |
until (tmp >= 1) and (tmp <= NUM_FORMULAE); | |
writeln (); | |
difficulty := tmp; | |
end; | |
// Play a single turn. | |
procedure TQuiz.playTurn (); | |
var | |
i : integer; | |
tmp : integer = 0; | |
begin | |
randomFormula (); | |
generateSequence (); | |
writeln ('Find the next term in the sequence: '); | |
printSequence (SEQ_LEN - 1); | |
for i := GUESSES downto 1 do | |
begin | |
write (': '); | |
try | |
readln (tmp); | |
except | |
tmp := 0 | |
end; | |
if check (tmp) then | |
begin | |
writeln ('CORRECT!'); | |
points += (1 + i) * difficulty; | |
exit (); | |
end | |
else | |
writeln ('INCORRECT!'); | |
end; | |
writeln ('Out of guesses, the correct answer was ', sequence [SEQ_LEN]); | |
end; | |
// Check whether ans is correct | |
function TQuiz.check (ans : integer) : boolean; | |
begin | |
result := (ans = sequence [SEQ_LEN]); | |
end; | |
// Play for n questions. | |
procedure TQuiz.play (n : integer); | |
var | |
i : integer; | |
begin | |
points := 0; | |
clrscr (); | |
writeln ('Welcome to Sequences - A Hayden and Tom game ...'); | |
sleep (2000); | |
clrscr (); | |
inputDifficulty (); | |
for i := 1 to n do | |
begin | |
clrscr (); | |
playTurn (); | |
sleep (2000); | |
end; | |
clrscr (); | |
writeln ('You scored ', points, ' points.'); | |
end; | |
// Main | |
var | |
quizy : TQuiz; | |
begin | |
quizy.play (3); | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment