diff --git a/a.out b/a.out index de2928e..f3c95f5 100755 Binary files a/a.out and b/a.out differ diff --git a/main.cmi b/main.cmi index 2d64da9..cc5d172 100644 Binary files a/main.cmi and b/main.cmi differ diff --git a/main.cmo b/main.cmo index 2e62a16..40ff560 100644 Binary files a/main.cmo and b/main.cmo differ diff --git a/main.ml b/main.ml index 0148bc5..96630d5 100644 --- a/main.ml +++ b/main.ml @@ -74,19 +74,17 @@ let draw_integer_alignedleft x0 y n0 len = set_line_width (max 1 (len/4)); let n = ref 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 - offset := ((size+2)*len)/2; - draw_poly_line [|(x0, y); (x0+len/2, y)|]; n := !n * (-1); - incr initial_i ; + draw_poly_line [|(x0, y); (x0+len, y)|]; + cur_x := !cur_x + (len*11/7) end; - for i = !initial_i to (size + !initial_i) do - let x = x0 + (!offset - i*len)*11/7 in + for i = 0 to size do + let x = !cur_x in if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then draw_poly_line [|(x, y+len); (x, y)|]; @@ -109,8 +107,70 @@ let draw_integer_alignedleft x0 y n0 len = draw_poly_line [|(x, y-len); (x, y)|]; 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;; + (* Arithmetical functions *) type calcul = @@ -243,9 +303,123 @@ and eval_plus fm = match fm with and evaluate 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 -> (* Integer *) if !buf >= 0 then begin @@ -277,42 +451,57 @@ let update_char code buf = match code with buf := !buf * (-1); end; 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 ;; -(* Main *) - -let main () = +let main stng = open_graph " 1000x1000"; set_window_title "Math"; let buffer = ref 0 in + let ft = ref true in 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 let ch = get1char () 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"; 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; - 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; with | exn -> close_graph (); raise exn ;; -main () ;; +let setting = settings_menu () ;; +main setting ;; (* ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics main.ml *) \ No newline at end of file