读书人

Erlang TCPETS跟位操作编程:模拟斗

发布时间: 2012-09-23 10:28:11 作者: rapoo

Erlang TCP,ETS和位操作编程:模拟斗地主发牌
Erlang实例:斗地主发牌
用erlang作为服务器,java作为客户端, 模拟斗地主发牌。

-module(fight).-export([random/1, randomOrder/1, main/0, loop/1, playBoy/1, randomOrder/3]).main() ->{ok, SocketListen} = gen_tcp:listen(9898, [binary, {active, false}]),ets:new(fightETS, [named_table, public]),  ets:insert(fightETS, {socketList, []}),LoopPid = spawn(?MODULE, loop, [[]]),register(loop,LoopPid),accept(SocketListen,playOne),accept(SocketListen,playTwo),accept(SocketListen,playThree).      accept(SocketListen, Player)->  {ok, Socket} = gen_tcp:accept(SocketListen),  [{socketList,SocketListETS}] = ets:lookup(fightETS, socketList),  ets:insert(fightETS, {socketList, [Socket|SocketListETS]}),LoopPid = spawn(?MODULE, playBoy, [{Socket,Player}]),register(Player,LoopPid).playBoy(State) -> {Socket,Player} = State,case gen_tcp:recv(Socket, 0) of  {ok, Message} ->  LisgMsg = binary_to_list(Message),io:format("Received message: ~p~n", [LisgMsg]),  loop!{Player, LisgMsg},playBoy(State);  {error, closed} ->  io:format("Received message: closed.~n"),  [{socketList,SocketListETS}] = ets:lookup(fightETS, socketList),  SocketListETSNew = lists:delete(Socket, SocketListETS),  ets:insert(fightETS, {socketList, SocketListETSNew});  _Error->  io:format("Unknow error.~n")  end.loop(State) ->io:format("state: ~p~n", [State]),  receive {Player, "start"} ->io:format("deal start message: ~p,ployer:~p~n", ["start",Player]),NewState = [start|State],io:format("new loop state: ~p~n", [NewState]),case NewState of[start,start,start|Tail] ->io:format("start dispath~n"),[{socketList,SocketListETS}] = ets:lookup(fightETS, socketList),randomOrder(SocketListETS),io:format("end dispath~n"),loop([]);_L -> loop(NewState)end;{Player, Message} ->io:format("deal message: ~p,ployer:~p~n", [Message,Player]),loop(State);_Error->  io:format("deal error.~n") end.randomOrder(SocketList) ->io:format("socketList ~p~n", [SocketList]),ListR = [{r,1},{r,2},{r,3},{r,4},{r,5},{r,6},{r,7},{r,8},{r,9},{r,10},{r,11},{r,12},{r,13}],ListB = [{b,1},{b,2},{b,3},{b,4},{b,5},{b,6},{b,7},{b,8},{b,9},{b,10},{b,11},{b,12},{b,13}],ListM = [{m,1},{m,2},{m,3},{m,4},{m,5},{m,6},{m,7},{m,8},{m,9},{m,10},{m,11},{m,12},{m,13}],ListF = [{f,1},{f,2},{f,3},{f,4},{f,5},{f,6},{f,7},{f,8},{f,9},{f,10},{f,11},{f,12},{f,13},{g,1},{g,2}],ListRB = lists:append(ListR, ListB),ListRBM = lists:append(ListRB, ListM),ListRBMF = lists:append(ListRBM, ListF),randomOrder(ListRBMF, SocketList, []).randomOrder([], SocketList, TempSocketList) -> ok;randomOrder(List, [], TempSocketList) ->randomOrder(List, TempSocketList, []);randomOrder(List, SocketList, TempSocketList) -> Index = random(length(List)),%%io:format("Index: ~p, list: ~p", [Index,List]),Element = lists:nth(Index, List),io:format("get element:~p~n", [Element]),ListBefore = lists:sublist(List, Index-1),ListAfter = lists:sublist(List, Index+1, length(List) - length(ListBefore) - 1),NewList = lists:append(ListBefore, ListAfter),[H|Tail] = SocketList,{Type,Num} = Element,TypeBin = atom_to_binary(Type, latin1),NumBin = <<Num:8>>,Content = <<TypeBin/binary,NumBin/binary>>,io:format("Type:~p, Num:~p, Binary:~p~n", [Type,Num,Content]),gen_tcp:send(H, Content),receive wait10000 -> okafter 500 -> okend,randomOrder(NewList, Tail, [H|TempSocketList]).random(N) -> %io:format("seed: ~p~n", [N]),if is_integer(N) -> R = random:uniform(N),%io:format("~p is generated!~n", [R]),R;true -> okend.


public class FightClient {public static void main(String args[]) throws Exception {new Thread(new FightBoy("playboy1")).start();new Thread(new FightBoy("playboy2")).start();new Thread(new FightBoy("playboy3")).start();}static class FightBoy implements Runnable {private String name;public FightBoy(String name){this.name = name;}public void run() {Socket socket = null;try {socket = new Socket("127.0.0.1", 9898);socket.getOutputStream().write("start".getBytes());byte[] b = new byte[1024];while(true){int length = socket.getInputStream().read(b);System.out.println(name + " get: " + (char)b[0] + ":" + (int)b[1]);}} catch (Exception e) {e.printStackTrace();}}}}


本文由广州办公家具有限公司赞助。

读书人网 >编程

热点推荐