-
Notifications
You must be signed in to change notification settings - Fork 1
/
winSelect.ml
152 lines (129 loc) · 5.19 KB
/
winSelect.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
open Graphics
open Constants
open Images
open Png
open WindowGui
(** [selections] is the selection list to display for player and
computer selections. *)
let selections =
[ "Green-0"; "Blue-1"; "Green-2"; "Red-3"; "Yellow-4"; "Blue-5" ]
(** [max_players] current cap on the number of players that can player. *)
let max_players = 5
(** [select_x, select_y] is the starting position for selections. *)
let select_x, select_y = (90, 225)
(** [outline_pos_x, outline_pos_y] are the coordinates of the lower left
corner of the selection outline. *)
let outline_pos_x, outline_pos_y =
(ref (select_x - 10), ref (select_y - 10))
(** [init_outline_x, init_ouline_y] are the coordinates of the lower
left corner of the initial selection outline. *)
let init_outline_x, init_ouline_y = (!outline_pos_x, !outline_pos_y)
(** [outline_width, outline_height] are the dimensions of the selection
outline. *)
let outline_width, outline_height = (130, 180)
(** [p_txt_x, p_txt_y] is the starting position for player select text. *)
let p_txt_x, p_txt_y = (select_x, select_y + 145 + 180)
(** [comp_txt_x, comp_txt_y] is the starting position for computer
select text. *)
let comp_txt_x, comp_txt_y = (select_x + 90, select_y + 145 + 180)
(** [p_select_idx] is the selection index for the human players. *)
let p_select_idx = ref 0
(** [comp_select_idx] is the selection index for the computer players. *)
let comp_select_idx = ref 0
(** [draw_change_color_card c pos] draws the image of card [c] and
coordinate position [pos]. *)
let draw_change_color_card c pos =
let c_x, c_y = pos in
upload_img _CARD_DIR c c_x c_y
(** [draw_cards cards pos] draws [cards] starting at [pos]. Ensures
spacing between each card. *)
let rec draw_cards cards pos =
let c_x, c_y = pos in
let c_space_x, c_space_y = card_space in
match cards with
| [] -> ()
| c :: t ->
draw_change_color_card c pos;
draw_cards t (c_x + c_space_x, c_y + c_space_y)
(** [move op limit space color_a color_b] draws the new selection. *)
let move op space color_a color_b =
highlight_selection color_a color_b (op 0 space) !outline_pos_x
!outline_pos_y outline_width outline_height;
outline_pos_x := op !outline_pos_x space
(** [fst_n] gives the first [n] in [lst]. Is tail-recursive*)
let rec fst_n n acc lst =
match (n, lst) with
| 0, lst -> List.rev acc
| n, h :: t -> fst_n (n - 1) (h :: acc) t
| _ -> failwith "Something bad happened in fst_n"
(** [draw_selections] displays [prompt] at ([x], [y]) and [selections]
between 0 - [num_select]. *)
let draw_selections prompt x y num_select selections =
let selections = fst_n num_select [] selections in
set_background _BLACK;
draw_cards selections (select_x, select_y);
upload_img _TEXT_DIR prompt x y
(** [select st p_selection select_idx] updates the selection index
[select_idx] of the cards shown. *)
let select st p_selection select_idx =
if st.key = _RIGHT_KEY then
if
!outline_pos_x
>= ((List.length selections - p_selection) * fst card_space) - 100
then ()
else (
move ( + ) (fst card_space) _GOLD _BLACK;
select_idx := !select_idx + 1)
else if st.key = _LEFT_KEY then
if !outline_pos_x <= select_x then ()
else (
move ( - ) (fst card_space) _GOLD _BLACK;
select_idx := !select_idx - 1)
else if st.key = _CONFIRM_KEY then raise Exit
(** [run_select_win p_selection select_idx x y msg] is the selection
index [select_idx] of the cards shown. It also draws the message
[msg] at coordinates ([x], [y]). *)
let run_select_win p_selection select_idx x y msg =
if p_selection >= 5 then 0
else (
draw_selections msg x y
(List.length selections - p_selection)
selections;
highlight_selection _GOLD _BLACK 0 !outline_pos_x !outline_pos_y
outline_width outline_height;
(try
while running do
let st = wait_next_event [ Key_pressed ] in
synchronize ();
if st.key = _QUIT_KEY then exit 0
else select st p_selection select_idx
done
with Exit -> ());
!select_idx)
(** [select_p_win ()] is the main player select window. *)
let select_p_win () = run_select_win 0 p_select_idx p_txt_x p_txt_y
(** [select_p_win p_selection] is the main computer select window. *)
let select_comp_win p_selection =
run_select_win p_selection comp_select_idx comp_txt_x comp_txt_y
(** [select_win ()] is the tuple: (number of players, number of
computers). *)
let select_win () =
let p_selection =
select_p_win ()
"select_the_number_of_people_that_want_to_play_the_game"
in
outline_pos_x := init_outline_x;
outline_pos_y := init_ouline_y;
( p_selection,
select_comp_win p_selection
"select_the_number_of_computer_opponents" )
(** ;; open_window; let p_selection = select_p_win ()
"select_the_number_of_people_that_want_to_play_the_game" in
print_endline (string_of_int p_selection); outline_pos_x :=
init_outline_x; outline_pos_y := init_ouline_y; let comp_selection =
select_comp_win p_selection
"select_the_number_of_computer_opponents" in print_endline
(string_of_int comp_selection) *)
(** let comp_selection = select_comp_win 5 in print_endline
(string_of_int comp_selection) *)
(** select_seq () *)