Added settings and letter display
This commit is contained in:
parent
9e81484dff
commit
4f37301325
237
main.ml
237
main.ml
|
@ -74,19 +74,17 @@ let draw_integer_alignedleft x0 y n0 len =
|
||||||
set_line_width (max 1 (len/4));
|
set_line_width (max 1 (len/4));
|
||||||
let n = ref n0 in
|
let n = ref n0 in
|
||||||
let size = ln10 (abs n0) in
|
let size = ln10 (abs n0) in
|
||||||
let offset = ref (((size+1)*len)/2) in
|
|
||||||
|
|
||||||
let initial_i = ref 0 in
|
let cur_x = ref (x0 + size*(len*11/7)) in
|
||||||
|
|
||||||
if !n < 0 then begin
|
if !n < 0 then begin
|
||||||
offset := ((size+2)*len)/2;
|
|
||||||
draw_poly_line [|(x0, y); (x0+len/2, y)|];
|
|
||||||
n := !n * (-1);
|
n := !n * (-1);
|
||||||
incr initial_i ;
|
draw_poly_line [|(x0, y); (x0+len, y)|];
|
||||||
|
cur_x := !cur_x + (len*11/7)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
for i = !initial_i to (size + !initial_i) do
|
for i = 0 to size do
|
||||||
let x = x0 + (!offset - i*len)*11/7 in
|
let x = !cur_x in
|
||||||
if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then
|
if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then
|
||||||
draw_poly_line [|(x, y+len); (x, y)|];
|
draw_poly_line [|(x, y+len); (x, y)|];
|
||||||
|
|
||||||
|
@ -109,6 +107,68 @@ let draw_integer_alignedleft x0 y n0 len =
|
||||||
draw_poly_line [|(x, y-len); (x, y)|];
|
draw_poly_line [|(x, y-len); (x, y)|];
|
||||||
|
|
||||||
n := !n/10;
|
n := !n/10;
|
||||||
|
cur_x := !cur_x - (len*11/7);
|
||||||
|
done ;;
|
||||||
|
|
||||||
|
let decode_letter x y len arr =
|
||||||
|
set_line_width 3;
|
||||||
|
if arr.(0) = 1 then
|
||||||
|
draw_poly_line [|(x, y+len); (x, y)|];
|
||||||
|
if arr.(1) = 1 then
|
||||||
|
draw_poly_line [|(x, y-len); (x, y)|];
|
||||||
|
if arr.(2) = 1 then
|
||||||
|
draw_poly_line [|(x, y+len); (x+len, y+len)|];
|
||||||
|
if arr.(3) = 1 then
|
||||||
|
draw_poly_line [|(x, y+len); (x+len, y)|];
|
||||||
|
if arr.(4) = 1 then
|
||||||
|
draw_poly_line [|(x, y); (x+len, y+len)|];
|
||||||
|
if arr.(5) = 1 then
|
||||||
|
draw_poly_line [|(x, y); (x+len, y)|];
|
||||||
|
if arr.(6) = 1 then
|
||||||
|
draw_poly_line [|(x, y); (x+len, y-len)|];
|
||||||
|
if arr.(7) = 1 then
|
||||||
|
draw_poly_line [|(x, y-len); (x+len, y)|];
|
||||||
|
if arr.(8) = 1 then
|
||||||
|
draw_poly_line [|(x+len, y-len); (x, y-len)|];
|
||||||
|
if arr.(9) = 1 then
|
||||||
|
draw_poly_line [|(x+len, y+len); (x+len, y)|];
|
||||||
|
if arr.(10) = 1 then
|
||||||
|
draw_poly_line [|(x+len, y-len); (x+len, y)|];;
|
||||||
|
|
||||||
|
let draw_letter x y c len = match c with
|
||||||
|
|'a'|'A' -> decode_letter x y len [|1; 1; 1; 0; 0; 1; 0; 0; 0; 1; 1|]
|
||||||
|
|'b'|'B' -> decode_letter x y len [|1; 1; 0; 0; 0; 1; 0; 0; 1; 0; 1|]
|
||||||
|
|'c'|'C' -> decode_letter x y len [|1; 1; 1; 0; 0; 0; 0; 0; 1; 0; 0|]
|
||||||
|
|'d'|'D' -> decode_letter x y len [|0; 0; 1; 0; 0; 0; 0; 0; 1; 1; 1|]; draw_poly_line [|(x+len/2, y+len); (x+len/2, y-len)|]
|
||||||
|
|'e'|'E' -> decode_letter x y len [|1; 1; 1; 0; 0; 1; 0; 0; 1; 0; 0|]
|
||||||
|
|'f'|'F' -> decode_letter x y len [|1; 1; 1; 0; 0; 1; 0; 0; 0; 0; 0|]
|
||||||
|
|'g'|'G' -> decode_letter x y len [|1; 1; 1; 0; 0; 0; 0; 0; 1; 0; 1|]
|
||||||
|
|'h'|'H' -> decode_letter x y len [|1; 1; 0; 0; 0; 1; 0; 0; 0; 1; 1|]
|
||||||
|
|'i'|'I' -> draw_poly_line [|(x+len/2, y+len); (x+len/2, y-len)|];
|
||||||
|
|'j'|'J' -> decode_letter x y len [|0; 1; 0; 0; 0; 0; 0; 0; 1; 1; 1|]
|
||||||
|
|'k'|'K' -> decode_letter x y len [|1; 1; 0; 0; 1; 0; 1; 0; 0; 0; 0|]
|
||||||
|
|'l'|'L' -> decode_letter x y len [|1; 1; 0; 0; 0; 0; 0; 0; 1; 0; 0|]
|
||||||
|
|'m'|'M' -> decode_letter x y len [|1; 1; 0; 0; 0; 0; 0; 0; 0; 1; 1|]; draw_poly_line [|(x, y+len); (x+len/2, y)|]; draw_poly_line [|(x+len/2, y); (x+len, y+len)|]
|
||||||
|
|'n'|'N' -> decode_letter x y len [|1; 1; 0; 1; 0; 0; 0; 0; 0; 1; 1|]
|
||||||
|
|'o'|'O' -> decode_letter x y len [|1; 1; 1; 0; 0; 0; 0; 0; 1; 1; 1|]
|
||||||
|
|'p'|'P' -> decode_letter x y len [|1; 1; 1; 0; 0; 1; 0; 0; 0; 1; 0|]
|
||||||
|
|'q'|'Q' -> decode_letter x y len [|1; 0; 1; 0; 0; 1; 0; 0; 0; 1; 1|]
|
||||||
|
|'r'|'R' -> decode_letter x y len [|1; 1; 1; 0; 0; 1; 1; 0; 0; 1; 0|]
|
||||||
|
|'s'|'S' -> decode_letter x y len [|1; 0; 1; 0; 0; 1; 0; 0; 1; 0; 1|]
|
||||||
|
|'t'|'T' -> decode_letter x y len [|1; 1; 0; 0; 0; 1; 0; 0; 1; 0; 0|]
|
||||||
|
|'u'|'U' -> decode_letter x y len [|1; 1; 0; 0; 0; 0; 0; 0; 1; 1; 1|]
|
||||||
|
|'v'|'V' -> decode_letter x y len [|1; 1; 0; 0; 0; 0; 0; 1; 0; 1; 0|]
|
||||||
|
|'w'|'W' -> decode_letter x y len [|1; 1; 0; 0; 0; 0; 1; 1; 0; 1; 1|]
|
||||||
|
|'x'|'X' -> draw_poly_line [|(x, y+len); (x+len, y-len)|]; draw_poly_line [|(x, y-len); (x+len, y+len)|]
|
||||||
|
|'y'|'Y' -> decode_letter x y len [|1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 0|]
|
||||||
|
|'z'|'Z' -> decode_letter x y len [|0; 1; 1; 0; 1; 0; 0; 0; 1; 0; 0|]
|
||||||
|
| _ -> () ;;
|
||||||
|
|
||||||
|
let draw_string x0 y s len =
|
||||||
|
let cur_x = ref x0 in
|
||||||
|
for i = 0 to String.length s -1 do
|
||||||
|
draw_letter !cur_x y s.[i] len;
|
||||||
|
cur_x := !cur_x + (len*10/7)
|
||||||
done;;
|
done;;
|
||||||
|
|
||||||
(* Arithmetical functions *)
|
(* Arithmetical functions *)
|
||||||
|
@ -243,9 +303,123 @@ and eval_plus fm = match fm with
|
||||||
and evaluate fm =
|
and evaluate fm =
|
||||||
eval_plus (eval_mult (eval_exp fm)) ;;
|
eval_plus (eval_mult (eval_exp fm)) ;;
|
||||||
|
|
||||||
(* Core functions *)
|
(* Game config *)
|
||||||
|
exception Exit ;;
|
||||||
|
|
||||||
let update_char code buf = match code with
|
let update_char_settings code buf pointer ndiff = match code with
|
||||||
|
| k when k >= 48 && k <= 57 ->
|
||||||
|
(* Integer *)
|
||||||
|
if !buf >= 0 then begin
|
||||||
|
buf := !buf * 10;
|
||||||
|
buf := !buf + code - 48;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
buf := !buf * (-1);
|
||||||
|
|
||||||
|
buf := !buf * 10;
|
||||||
|
buf := !buf + code - 48;
|
||||||
|
|
||||||
|
buf := !buf * (-1);
|
||||||
|
end;
|
||||||
|
true
|
||||||
|
| 10 ->
|
||||||
|
raise Exit
|
||||||
|
| 115 ->
|
||||||
|
(* s *)
|
||||||
|
set_color white;
|
||||||
|
fill_circle 20 (800 - !pointer * 90) 10;
|
||||||
|
|
||||||
|
pointer := (!pointer + 1) mod ndiff;
|
||||||
|
|
||||||
|
set_color (rgb 32 192 32);
|
||||||
|
fill_circle 20 (800 - !pointer * 90) 10;
|
||||||
|
false
|
||||||
|
| 122 ->
|
||||||
|
(* z *)
|
||||||
|
set_color white;
|
||||||
|
fill_circle 20 (800 - !pointer * 90) 10;
|
||||||
|
|
||||||
|
decr pointer;
|
||||||
|
if !pointer < 0 then pointer := ndiff -1;
|
||||||
|
|
||||||
|
set_color (rgb 32 192 32);
|
||||||
|
fill_circle 20 (800 - !pointer * 90) 10;
|
||||||
|
false
|
||||||
|
| 127 ->
|
||||||
|
(* Delete *)
|
||||||
|
if !buf >= 0 then begin
|
||||||
|
buf := !buf / 10
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
buf := !buf * (-1);
|
||||||
|
|
||||||
|
buf := !buf / 10;
|
||||||
|
|
||||||
|
buf := !buf * (-1);
|
||||||
|
end;
|
||||||
|
true
|
||||||
|
| _ -> false ;;
|
||||||
|
|
||||||
|
type game_setting = {mutable inf : int; mutable sup : int; mutable diff : int; mutable count : int} ;;
|
||||||
|
type modifiers = {mutable brackets : bool; mutable timed : bool} ;;
|
||||||
|
|
||||||
|
let settings_menu () =
|
||||||
|
open_graph " 1000x1000";
|
||||||
|
set_window_title "Math";
|
||||||
|
let setting = {inf = 1 ; sup = 100 ; diff = 1; count = 8} in
|
||||||
|
|
||||||
|
let ft = ref true in
|
||||||
|
|
||||||
|
try
|
||||||
|
Stdlib.print_endline "-------------------------";
|
||||||
|
let ptr = ref 0 in
|
||||||
|
let buffer = ref 0 in
|
||||||
|
while true do
|
||||||
|
let c = get1char () in
|
||||||
|
let code = Char.code c in
|
||||||
|
|
||||||
|
if !ft || update_char_settings code buffer ptr 4 then begin
|
||||||
|
ft := false;
|
||||||
|
if !ptr = 0 then
|
||||||
|
setting.inf <- !buffer
|
||||||
|
else if !ptr = 1 then
|
||||||
|
setting.sup <- !buffer
|
||||||
|
else if !ptr = 2 then
|
||||||
|
setting.diff <- !buffer
|
||||||
|
else if !ptr = 3 then
|
||||||
|
setting.count <- !buffer;
|
||||||
|
|
||||||
|
open_graph " 1000x1000";
|
||||||
|
set_window_title "Math";
|
||||||
|
|
||||||
|
set_color (rgb 32 192 32);
|
||||||
|
fill_circle 20 (800 - !ptr * 90) 10;
|
||||||
|
set_color black;
|
||||||
|
|
||||||
|
(*draw_string 10 950 "abcdefghijklmnopqrstuvwxyz" 20; *)
|
||||||
|
draw_string 40 800 "min value" 20;
|
||||||
|
draw_integer_alignedleft 400 800 setting.inf 20;
|
||||||
|
|
||||||
|
draw_string 40 710 "max value" 20;
|
||||||
|
draw_integer_alignedleft 400 710 setting.sup 20;
|
||||||
|
|
||||||
|
draw_string 40 620 "difficulty" 20;
|
||||||
|
draw_integer_alignedleft 400 620 setting.diff 20;
|
||||||
|
|
||||||
|
draw_string 40 530 "num count" 20;
|
||||||
|
draw_integer_alignedleft 400 530 setting.count 20;
|
||||||
|
end;
|
||||||
|
|
||||||
|
set_color black;
|
||||||
|
done;
|
||||||
|
failwith "Not possible"
|
||||||
|
with
|
||||||
|
| Exit -> setting ;;
|
||||||
|
|
||||||
|
(* Core functions *)
|
||||||
|
(* Main *)
|
||||||
|
|
||||||
|
let update_char_main code buf = match code with
|
||||||
| k when k >= 48 && k <= 57 ->
|
| k when k >= 48 && k <= 57 ->
|
||||||
(* Integer *)
|
(* Integer *)
|
||||||
if !buf >= 0 then begin
|
if !buf >= 0 then begin
|
||||||
|
@ -277,42 +451,57 @@ let update_char code buf = match code with
|
||||||
buf := !buf * (-1);
|
buf := !buf * (-1);
|
||||||
end;
|
end;
|
||||||
true
|
true
|
||||||
| 10 ->
|
|
||||||
(* Enter *)
|
|
||||||
let math = (generate_tier_2 6 1 100 5) in
|
|
||||||
print_math math 10 900 15;
|
|
||||||
buf := evaluate math;
|
|
||||||
draw_integer 300 300 !buf 20;
|
|
||||||
Unix.sleepf 15.0;
|
|
||||||
true
|
|
||||||
| _ ->
|
| _ ->
|
||||||
false ;;
|
false ;;
|
||||||
|
|
||||||
(* Main *)
|
let main stng =
|
||||||
|
|
||||||
let main () =
|
|
||||||
open_graph " 1000x1000";
|
open_graph " 1000x1000";
|
||||||
set_window_title "Math";
|
set_window_title "Math";
|
||||||
|
|
||||||
let buffer = ref 0 in
|
let buffer = ref 0 in
|
||||||
|
let ft = ref true in
|
||||||
|
|
||||||
try
|
try
|
||||||
|
let math = ref (generate_tier_2 stng.count stng.inf stng.sup 5) in
|
||||||
|
let answer = ref (evaluate !math) in
|
||||||
|
let clock = ref 0 in
|
||||||
|
let frames = ref 0 in
|
||||||
while true do
|
while true do
|
||||||
let ch = get1char () in
|
let ch = get1char () in
|
||||||
let chint = Char.code ch in
|
let chint = Char.code ch in
|
||||||
|
|
||||||
if update_char chint buffer then begin
|
if !ft || update_char_main chint buffer then begin
|
||||||
|
ft := false;
|
||||||
open_graph " 1000x1000";
|
open_graph " 1000x1000";
|
||||||
set_window_title "Math";
|
set_window_title "Math";
|
||||||
|
|
||||||
draw_integer 300 300 !buffer 20;
|
if !answer = !buffer then begin
|
||||||
|
math := (generate_tier_2 6 1 100 5);
|
||||||
|
answer := evaluate !math;
|
||||||
|
buffer := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Unix.sleepf 0.025
|
print_math !math 10 900 15;
|
||||||
|
draw_integer_alignedleft 10 800 !answer 15;
|
||||||
|
draw_integer_alignedleft 10 300 !buffer 20;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Unix.sleepf 0.025;
|
||||||
|
incr frames;
|
||||||
|
if !frames >= 40 then begin
|
||||||
|
Stdlib.print_endline "EEE";
|
||||||
|
frames := 0;
|
||||||
|
incr clock;
|
||||||
|
set_color white;
|
||||||
|
draw_poly_line [|(0, 0); (1000, 0); (1000, 60); (0, 60)|];
|
||||||
|
set_color black;
|
||||||
|
draw_integer 500 30 !clock 30;
|
||||||
|
end;
|
||||||
done;
|
done;
|
||||||
with
|
with
|
||||||
| exn -> close_graph (); raise exn ;;
|
| exn -> close_graph (); raise exn ;;
|
||||||
|
|
||||||
main () ;;
|
let setting = settings_menu () ;;
|
||||||
|
main setting ;;
|
||||||
|
|
||||||
(* ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics main.ml *)
|
(* ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics main.ml *)
|
Loading…
Reference in New Issue