diff --git a/library/Makefile-world b/library/Makefile-world index b8c3b7c..37a2ab9 100644 --- a/library/Makefile-world +++ b/library/Makefile-world @@ -1,4 +1,4 @@ -SOURCES = world.mli world.ml +SOURCES = option.ml world.mli world.ml PACKS = cairo2.lablgtk2 lablgtk2.gnomecanvas RESULT = world OCAMLMAKEFILE = ../OCamlMakefile diff --git a/library/option.ml b/library/option.ml new file mode 100644 index 0000000..9a4e6f6 --- /dev/null +++ b/library/option.ml @@ -0,0 +1,5 @@ + + +let orElse d = function Some v -> Some v | None -> Lazy.force d + +let iter f = function Some v -> f v | None -> () diff --git a/library/universe.ml b/library/universe.ml index 87b64d7..1b18759 100644 --- a/library/universe.ml +++ b/library/universe.ml @@ -58,23 +58,17 @@ let universe ?(on_new=initial_new) (* universe 内で使う各種関数群 *) - let reset_flag = ref false in - (* trueになったらstateの初期値を返してサーバをリセット *) - (* client_sockfdをもらったらそれを通信からはずす *) - (* client_sockfdをcloseする *) - let rec cut_communication client_sockfd = + (* client_sockfdをcloseする. *) + let cut_communication client_sockfd = if List.mem_assoc client_sockfd !clientlst then begin clientlst := List.remove_assoc client_sockfd !clientlst; Socket.close client_sockfd; - if !clientlst = [] then - reset_flag := true end (* もしもともと通信から抜けていたら何もしない *) in - (* update_and_send : 'a * 'b list * iworld_t list -> unit *) (* 状態を更新し、メールを送る。ここが唯一の state を変更する場所 *) (* iworldlstは通信から外したいクライアントのリスト。これが空でないとループ *) @@ -87,15 +81,12 @@ let universe ?(on_new=initial_new) Socket.send None first; (* クライアントにもう送らないでねって合図を送る *) GMain.Io.remove (List.assoc first !clientlst); - (* add_watchの登録を解除 *) - cut_communication first; - (* 通信を切る処理 *) - if !reset_flag + (* add_watchの登録を解除. *) + cut_communication first; + (* すべてのクライアントがいなくなったら、状態リセット *) + if !clientlst = [] then - begin - state := initial_state; - reset_flag := false - end + state := initial_state else update_and_send (Bundle (!state, maillst, rest)) (* restとmailの処理 *) diff --git a/library/world.ml b/library/world.ml index 15e651a..448447e 100644 --- a/library/world.ml +++ b/library/world.ml @@ -289,14 +289,9 @@ let big_bang ?(name="My Game") (*まずサーバーに登録*) (*クライアントのソケットとサーバのソケットの接続*) - let register' = match register with - None -> obtain_addrinfo () - | Some (_, _) -> register - in - (* ここの match 文の連続はもう少しきれいにならないかと思うが... *) - begin match register' with - None -> () - | Some (ipaddress, portnumber) -> + register + |> Option.orElse (lazy (obtain_addrinfo ())) + |> Option.iter (fun (ipaddress, portnumber) -> begin Socket.connect (ipaddress, portnumber) server_sockfd; (*ignore (GMain.Io.add_watch ~cond:[`IN] ~callback:receive_event @@ -306,7 +301,7 @@ let big_bang ?(name="My Game") ~callback:receive_event ~prio:(Glib.int_of_priority `LOW) (GMain.Io.channel_of_descr server_sockfd)); - end; + end); (* ここで最初の画面の表示 *) update_and_draw (World !world);