zoukankan      html  css  js  c++  java
  • Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码


    这个作品是我近期写的,结合我的毕业设计的通信模块和之前的单机版斗地主。我已经上架到豌豆荚了,贴了点广告,看看能不能赚点茶钱。

    但是一点也不乐观。因此我想分享给大家源代码。

    仅仅要不用于商业。

    以下先贴网络模块的核心代码,第一次写这样的逻辑用的udp, 经验不够,没有写的那么好看。

    这里是我上架的apk,大家下载来试试也无妨: 地址 http://www.wandoujia.com/apps/com.hj.joker

    package com.hj.net;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.Random;
    import java.util.Vector;
    
    import org.apache.http.conn.util.InetAddressUtils;
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.scenes.scene2d.InputEvent;
    import com.badlogic.gdx.scenes.scene2d.actions.Actions;
    import com.badlogic.gdx.scenes.scene2d.ui.Label;
    import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
    import com.hj.screen.NetGameScreen;
    import com.hj.screen.RommScreen;
    import com.hj.tool.Card;
    import com.hj.tool.Comm;
    
    import android.os.Message;
    import android.util.Log;
    
    public class NetManager {
    
    	// 初始化
    	public RommScreen rommScreen = null;
    	public NetGameScreen netGameScreen = null;
    	public static int Max = 3;
    	public User me = null, u = null, computer = null;
    	public List<User> users = null;
    	public Room currentRoom = null;
    	public List<Room> roomList = null;// 本主机的全部用户
    	public boolean isStop = true;
    	public boolean LeaveRoom = false;
    	public CardData cards[] = new CardData[56];
    	public List<CardData> cardDataList = new ArrayList<CardData>();
    	// 协议命令
    	public static final int CMD_HOST_REQUEST_ROOM = 10;
    	public static final int CMD_REPLY_ROOM = 11;
    	public static final int CMD_CREATE_ROOM = 12;
    	public static final int MES_UPDATE_ROOM = 13;
    	public static final int MES_UPDATE_User = 14;
    	public static final int CMD_HOST_JOIN_ROOM = 15;
    	public static final int CMD_BROAD_USERLIST = 16;
    	public static final int CMD_UPDATE_ROOM = 17;
    	public static final int CMD_HOST_LEAVE_ROOM = 18;
    	public static final int CMD_LEAVE_ROOM = 19;
    	public static final int CMD_DEL_ROOM = 20;
    	public static final int CMD_HOST_READY_ROOM = 21;
    	public static final int CMD_BEGIN_CARDS = 22;
    	public static final int MES_UPDATE_BEGINCARD = 23;
    	public static final int MES_UPDATE_LANDLORD = 24;
    	public static final int CMD_HOST_FINISH_LANDLORD = 25;
    	public static final int CMD_BROAD_NEXT_LANDLORD = 26;
    	public static final int CMD_BEGIN_LANDLORD_CARDS = 27;
    	public static final int CMD_HOST_START_CARDS = 28;
    	public static final int CMD_START_CARDS = 29;
    	public static final int MES_SHOW_CARDBUTTON = 30;
    	public static final int MES_UPDATE_LANDLORDHEAD = 31;
    	public static final int CMD_HOST_SEND_CARDS = 32;
    	public static final int CMD_SEND_CARDS = 33;
    	public static final int MES_SEND_CARDS = 34;
    	public static final int CMD_SEND_CURRENTID_CARDS = 35;
    	public static final int MES_FLUSH_CARDS = 36;
    	public static final int CMD_HOST_SEND_CARDS_COMPUTER = 37;
    	public static final int PORT_SEND = 2429;// 发送端口
    	public static final int PORT_RECEIVE = 2425;// 接收端口
    
    	public NetManager() {
    		roomList = new ArrayList<Room>();
    		users = new ArrayList<User>();
    	}
    
    	public void init() {
    		users.clear();
    		cardDataList.clear();
    		for (int i = 0; i < 3; i++) {
    			netGameScreen.gInfo.playerList[i].clear();
    			netGameScreen.gInfo.playerOutList[i].clear();
    		}
    		netGameScreen.gInfo.playerList[3].clear();
    		// users
    	}
    
    	// 发送消息
    	public void sendCMD(Msg msg) {
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    		}
    		(new UdpSend(msg)).start();
    	}
    
    	class UdpSend extends Thread {
    		Msg msg = null;
    
    		UdpSend(Msg msg) {
    			this.msg = msg;
    		}
    
    		public void run() {
    			try {
    				byte[] data = toByteArray(msg);
    				DatagramSocket ds = new DatagramSocket(PORT_SEND + Max);
    				DatagramPacket packet = new DatagramPacket(data, data.length,
    						InetAddress.getByName(msg.getReceiveUserIp()),
    						PORT_RECEIVE + Max);
    				packet.setData(data);
    				ds.send(packet);
    				ds.close();
    			} catch (Exception e) {
    			}
    
    		}
    	}
    
    	// 接收消息
    	public void openReceiveMsgThread() {
    		(new UdpReceive()).start();
    	}
    
    	public class UdpReceive extends Thread {
    		Msg msg = null;
    
    		UdpReceive() {
    		}
    
    		public void run() {
    			// 消息循环
    			while (!isStop) {
    				try {
    					DatagramSocket ds = new DatagramSocket(PORT_RECEIVE + Max);
    					byte[] data = new byte[1024 * 32];
    					DatagramPacket dp = new DatagramPacket(data, data.length);
    					dp.setData(data);
    					ds.receive(dp);
    					byte[] data2 = new byte[dp.getLength()];
    					System.arraycopy(data, 0, data2, 0, data2.length);// 得到接收的数据
    					Msg msg = (Msg) toObject(data2);
    					ds.close();
    
    					// 解析消息
    					parse(msg);
    				} catch (Exception e) {
    				}
    			}
    
    		}
    	}
    
    	// 解析接收的
    	public void parse(Msg msg) {
    		Room r = null;
    		switch (msg.getMsgType()) {
    		case CMD_HOST_REQUEST_ROOM:// 搜索桌子
    			u = (User) msg.getBody();
    			if (me.getIp().equals(currentRoom.getIp())) {
    				// out("有人进房间:"+u.getIp());
    				replyRoom(u);
    			}
    			break;
    		case CMD_REPLY_ROOM: // 收到反馈桌子
    			r = (Room) msg.getBody();
    			if (!isContainsRoom(r)) {
    				roomList.add(r);
    				updateRoomList();
    			}
    			break;
    		case CMD_CREATE_ROOM: // 收到创建的桌子
    			r = (Room) msg.getBody();
    			if (!isContainsRoom(r)) {
    				roomList.add(r);
    				updateRoomList();
    			}
    			break;
    		case CMD_HOST_JOIN_ROOM: // 收到请求增加桌子
    			u = (User) msg.getBody();
    			// out("收到请求");
    			if (!isContainsUser(u)) {
    				users.add(u);
    				currentRoom.userCount++;
    				orderComputer();
    				broadUser();
    				// 反馈桌子人数更新
    				updateRoom();
    			}
    			break;
    		case CMD_UPDATE_ROOM: // 收到桌子列表更新
    			r = (Room) msg.getBody();
    			if (isContainsRoom(r)) {
    				for (Room t : roomList) {
    					if (t.getIp().equals(r.getIp()))
    						t.setUserCount(r.getUserCount());
    				}
    			} else
    				roomList.add(r);
    			updateRoomList();
    			break;
    		case CMD_BROAD_USERLIST:// 收到用户列表更新
    			// out("收到广播");
    			users = (ArrayList) msg.getBody();
    			updateUserList();
    			break;
    		case CMD_HOST_LEAVE_ROOM: // 主机离开房间
    			u = (User) msg.getBody();
    			leaveRoom2(u);
    			break;
    		case CMD_DEL_ROOM: // 收到删除房间
    			r = (Room) msg.getBody();
    			if (isContainsRoom(r)) {
    				removeRoom(r);
    			}
    			updateRoomList();
    			break;
    		case CMD_LEAVE_ROOM:
    			u = (User) msg.getBody();
    			if (!u.getIp().equals(me.getIp())) {
    				LeaveRoom = true;
    				init();
    				users.clear();
    				currentRoom = null;
    				updateRoomList();
    			}
    			break;
    		case CMD_HOST_READY_ROOM: // 准备
    			u = (User) msg.getBody();
    			for (User user : users) {
    				if (user.getIp().equals(u.getIp()))
    					user.setReady(true);
    			}
    			// broadUser();
    			// 開始游戏
    			beginGame();
    			break;
    		case CMD_BEGIN_CARDS:// 收到发的牌0
    			cardDataList.clear();
    			cardDataList = (ArrayList<CardData>) msg.getBody();
    			updateBeginCard();
    			startLandlord();
    			break;
    
    		case CMD_BROAD_NEXT_LANDLORD: // 被通知显示抢分button
    			updateLandlord(1);
    			break;
    		case CMD_HOST_FINISH_LANDLORD: // 按下了抢分button
    			u = (User) msg.getBody();
    			// out("fenfen");
    			// out("分:"+u.getLandlordScore());
    			// out("id:"+u.getDeskId());
    			// 推断抢分完毕没有
    			if (!judgeFinishLandlord())
    				nextLandlord(u.getDeskId());
    			break;
    		case CMD_BEGIN_LANDLORD_CARDS: // 收到地主牌
    			cardDataList.clear();
    			cardDataList = (ArrayList<CardData>) msg.getBody();
    			netGameScreen.gInfo.setLandlordId(cardDataList.get(0).deskId);
    			updateBeginCard();
    			updateLandLordHead();
    			break;
    		case CMD_HOST_START_CARDS: // 谁是地主
    			sendCMD(new Msg(me.getName(), me.getIp(), null,
    					(String) msg.getBody(), CMD_START_CARDS, null));
    			break;
    		case CMD_START_CARDS: // 地主開始出牌
    			showCardButton();
    			break;
    		case CMD_HOST_SEND_CARDS: // 有人出牌了
    
    			int desk = -1;
    			for (User s : users) {
    				if (s.getIp().equals(msg.getSendUserIp()))
    					desk = s.getDeskId();
    			}
    			out(desk + ":出牌");
    			// sendID
    			for (User user : users) {
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp()))
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_SEND_CURRENTID_CARDS,
    								(desk + 1) % 3));
    				}
    			}
    			netGameScreen.gInfo.setCurrentPlayerId((desk + 1) % 3);
    			cardDataList.clear();
    			cardDataList = (ArrayList<CardData>) msg.getBody();
    			for (CardData cd : cardDataList)
    				out("出了:" + cd.imageId);
    			// 将牌分给组内人
    			for (User user : users) {
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp())) {
    						sleepT(300);
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_SEND_CARDS, new ArrayList(
    										cardDataList)));
    						// out("给:"+user.getDeskId()+":size:"+cardDataList.size());
    					}
    				}
    			}
    			updateCards(desk);
    			// 下一个人
    			if (!(Max == 2 && desk == 1)) {
    				// out("下一个人");
    				sendCMD(new Msg(me.getName(), me.getIp(), null,
    						currentRoom.getIp(), CMD_HOST_START_CARDS, users.get(
    								(desk + 1) % 3).getIp()));
    			}
    			// Computer出牌
    			if (Max == 2 && netGameScreen.gInfo.getCurrentPlayerId() == 2) {
    				// 电脑出牌
    				out("电脑出牌");
    				sleepT(1000);
    				cardDataList.clear();
    				netGameScreen.gInfo.playerOutList[2] = Comm.getBestAI(
    						netGameScreen.gInfo.playerList[2],
    						netGameScreen.gInfo.getOppo());
    				if (netGameScreen.gInfo.playerOutList[2] == null)
    					out("电脑没牌出");
    				else {
    					out("电脑出的牌:" + netGameScreen.gInfo.playerOutList[2].size());
    					String s = "";
    					for (Card cd : netGameScreen.gInfo.playerOutList[2]) {
    						s += cd.value + ",";
    						cardDataList.add(new CardData(cd.imageId, 2));
    					}
    					out("电脑牌:" + s);
    				}
    				sendCMD(new Msg(me.getName(), me.getIp(), null,
    						currentRoom.getIp(), CMD_HOST_SEND_CARDS_COMPUTER,
    						cardDataList));
    			}
    			break;
    		case CMD_HOST_SEND_CARDS_COMPUTER: // 电脑接收
    			out("电脑出牌来接收");
    			// sendID
    			for (User user : users) {
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp()))
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_SEND_CURRENTID_CARDS,
    								(2 + 1) % 3));
    				}
    			}
    			netGameScreen.gInfo.setCurrentPlayerId((2 + 1) % 3);
    			cardDataList.clear();
    			cardDataList = (ArrayList<CardData>) msg.getBody();
    			// out("cc");
    			// 将牌分给组内人
    			for (User user : users) {
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp())) {
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_SEND_CARDS, cardDataList));
    						// out("向发送了牌:"+user.getDeskId());
    					}
    				}
    			}
    			// out("bb");
    			updateCards(2);
    			// out("电脑出了牌");
    			// 下一个人
    			sendCMD(new Msg(me.getName(), me.getIp(), null,
    					currentRoom.getIp(), CMD_HOST_START_CARDS, users.get(
    							(2 + 1) % 3).getIp()));
    
    			break;
    		case CMD_SEND_CARDS: // 收到广播来的牌
    			int desk1 = -1;
    			while (desk1 < 0) {
    				desk1 = (netGameScreen.gInfo.getCurrentPlayerId() + 2) % 3;
    			}
    			// out("出牌的人"+desk1);
    			cardDataList.clear();
    			cardDataList = (ArrayList<CardData>) msg.getBody();
    			out("xx:" + cardDataList.size());
    			updateCards(desk1);
    			break;
    		case CMD_SEND_CURRENTID_CARDS: // 收到当前ID
    			netGameScreen.gInfo.setCurrentPlayerId((Integer) msg.getBody());
    			break;
    		}
    	}
    
    	// ***********************************************游戏逻辑**************************************************
    	// AI
    	public void orderComputer() {
    		if (Max == 2) {
    			User t1 = users.get(1), t2 = users.get(2);
    			;
    			users.remove(t1);
    			users.remove(t2);
    			users.add(t2);
    			users.add(t1);
    		}
    
    	}
    
    	public void addComputer() {
    		if (Max == 2) {
    			// out("addCPU");
    			computer = new User("computer", "null");
    			computer.setDeskId(2);
    			computer.setReady(true);
    			users.add(computer);
    		}
    	}
    
    	// NET
    	public void requestRoom() {
    		// out("port:"+Max);
    		roomList.clear();
    		sendCMD(new Msg(me.getName(), me.getIp(), null, getBroadCastIP(),
    				CMD_HOST_REQUEST_ROOM, me));
    	}
    
    	public void replyRoom(User user) {
    		// out("sendCMD:CMD_REPLY_ROOM");
    		sendCMD(new Msg(me.getName(), me.getIp(), null, user.getIp(),
    				CMD_REPLY_ROOM, currentRoom));
    
    	}
    
    	public void createRoom() {
    		// 增加自己当user
    		me.setDeskId(users.size());
    		users.add(me);
    		addComputer();
    		// out("currentSize:"+users.size());
    		currentRoom = new Room(me.getIp(), 1);
    		roomList.add(currentRoom);
    		sendCMD(new Msg(me.getName(), me.getIp(), null, getBroadCastIP(),
    				CMD_CREATE_ROOM, currentRoom));
    		updateUserList();
    
    	}
    
    	public void joinRoom(Room r) {
    		// out("申请增加:"+r.getIp()+",人数已有:"+r.getUserCount() );
    		currentRoom = r;
    		me.setDeskId(r.userCount);
    		sendCMD(new Msg(me.getName(), me.getIp(), null, r.getIp(),
    				CMD_HOST_JOIN_ROOM, me));
    	}
    
    	public void updateRoom() {
    		// out("sendCMD:CMD_UPDATE_ROOM");
    		sendCMD(new Msg(me.getName(), me.getIp(), null, getBroadCastIP(),
    				CMD_UPDATE_ROOM, currentRoom));
    	}
    
    	public void broadUser() {
    		// /out("sendCMD:CMD_BROAD_USERLIST");
    		for (User user : users) {
    			// out("广播:"+user.getIp());
    			if (Max == 3 || (!user.getIp().equals("null")))
    				sendCMD(new Msg(me.getName(), me.getIp(), null, user.getIp(),
    						CMD_BROAD_USERLIST, users));
    		}
    		updateUserList();
    	}
    
    	public void leaveRoom1() {
    		// out("leaveIp:"+me.getIp()+",HostIP:"+currentRoom.getIp());
    		sendCMD(new Msg(me.getName(), me.getIp(), null, currentRoom.getIp(),
    				CMD_HOST_LEAVE_ROOM, me));
    	}
    
    	public void leaveRoom2(User u) {
    		// out("2leaveIp:"+u.getIp()+",HostIP:"+currentRoom.getIp());
    		if (currentRoom.getIp().equals(u.getIp())
    				|| netGameScreen.gInfo.playerList[0].size() > 0) {
    			// 解散桌子
    			for (User user : users) {
    				if (Max == 3 || (!user.getIp().equals("null")))
    					sendCMD(new Msg(me.getName(), me.getIp(), null,
    							user.getIp(), CMD_LEAVE_ROOM, me));
    			}
    			init();
    			delRoom(currentRoom);
    			removeRoom(currentRoom);
    			LeaveRoom = true;
    			users.clear();
    			currentRoom = null;
    			updateRoomList();
    		} else {
    			removeUser(u);
    			currentRoom.userCount--;
    			updateRoom();
    			broadUser();
    			sendCMD(new Msg(me.getName(), me.getIp(), null, u.getIp(),
    					CMD_LEAVE_ROOM, null));
    		}
    	}
    
    	public void delRoom(Room r) {
    		sendCMD(new Msg(me.getName(), me.getIp(), null, getBroadCastIP(),
    				CMD_DEL_ROOM, r));
    	}
    
    	public void getReady() {
    		me.setReady(true);
    		sendCMD(new Msg(me.getName(), me.getIp(), null, currentRoom.getIp(),
    				CMD_HOST_READY_ROOM, me));
    	}
    
    	public void beginGame() {
    		int count = 0;
    		for (User user : users) {
    			if (user.isReady()) {
    				count++;
    			}
    		}
    		if (count == 3) {
    			// out("准备完毕:開始发牌");
    			// 取消准备图标
    			for (User user : users) {
    				user.setReady(false);
    			}
    			broadUser();
    			cardDataList.clear();
    			int len = 54;
    			for (int i = 1; i <= len; i++)
    				cards[i] = new CardData(i, -1);
    			// out("洗牌");
    			// 洗牌
    			for (int i = 0; i < 100; i++) {
    				Random random = new Random();
    				int a = random.nextInt(54) + 1;
    				int b = random.nextInt(54) + 1;
    				CardData k = cards[a];
    				cards[a] = cards[b];
    				cards[b] = k;
    			}
    			// out("发牌");
    			// 发牌
    			for (int i = 1; i <= 51; i++) {
    				cardDataList.add(cards[i]);
    				cards[i].setDeskId(i % 3);
    			}
    			// out("地主牌");
    			// 地主牌
    			for (int i = 52; i <= 54; i++) {
    				cardDataList.add(cards[i]);
    				cards[i].setDeskId(3);
    			}
    			// 将牌分给组内人
    			for (User user : users) {
    				// out("ip:"+user.getIp());
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp()))
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_BEGIN_CARDS, cardDataList));
    				}
    			}
    			// out(cardDataList.size()+":ab");
    			updateBeginCard();
    			startLandlord();
    		} else
    			broadUser();
    	}
    
    	public void startLandlord() {
    		if (me.getIp().equals(currentRoom.getIp())) {// 房主确定谁是地主
    			netGameScreen.gInfo.FirstLandLordId = 0;// 房主先抢地主
    			netGameScreen.gInfo
    					.setCurrentPlayerId(netGameScreen.gInfo.FirstLandLordId);
    			updateLandlord(1);
    		}
    	}
    
    	public void finishLandlord() {
    		sendCMD(new Msg(me.getName(), me.getIp(), null, currentRoom.getIp(),
    				CMD_HOST_FINISH_LANDLORD, me));
    	}
    
    	public void nextLandlord(int deskId) {
    		// out("通知下一个抢地主:"+users.get((deskId+1)%3).getIp());
    		sendCMD(new Msg(me.getName(), me.getIp(), null, users.get(
    				(deskId + 1) % 3).getIp(), CMD_BROAD_NEXT_LANDLORD, null));
    	}
    
    	public boolean judgeFinishLandlord() {
    		int count = 0;
    		User maxUser;
    		for (User user : users) {
    			if (user.getLandlordScore() > -1)
    				count++;
    		}
    		if (count == 3) {
    			// out("完毕抢分");
    			int landlordId = Comm.getLandOwnerId(new int[] {
    					users.get(0).getLandlordScore(),
    					users.get(1).getLandlordScore(),
    					users.get(2).getLandlordScore() }, 0);
    			// out("地主ID:"+landlordId);
    			netGameScreen.gInfo.LandlordId = landlordId;
    			for (User user : users) {
    				user.setLandlordScore(-1);
    				// out("设置:"+user.getIp()+":取消分数显示");
    			}
    			broadUser();
    			// 将地主牌送入地主
    			cardDataList.clear();
    			for (Card c : netGameScreen.gInfo.playerList[3]) {
    				cardDataList.add(new CardData(c.imageId, landlordId));
    			}
    			// 将牌分给组内人
    			for (User user : users) {
    				// out("发牌给:"+user.getIp());
    				if (Max == 3 || (!user.getIp().equals("null"))) {
    					if (!user.getIp().equals(currentRoom.getIp()))
    						sendCMD(new Msg(me.getName(), me.getIp(), null,
    								user.getIp(), CMD_BEGIN_LANDLORD_CARDS,
    								cardDataList));
    				}
    			}
    			// 由于自己不须要再发一遍给自己
    			updateBeginCard();
    			updateLandLordHead();
    			broadUser();
    			// 通知地主出牌
    			startHostCard();
    			return true;
    		}
    		return false;
    	}
    
    	public void startHostCard() {
    		// out("地主ID:"+users.get(netGameScreen.gInfo.LandlordId).getIp());
    		sendCMD(new Msg(me.getName(), me.getIp(), null, currentRoom.getIp(),
    				CMD_HOST_START_CARDS, users.get(netGameScreen.gInfo.LandlordId)
    						.getIp()));
    	}
    
    	public void sendHostCards() {
    		// out("通知Host出牌了");
    		cardDataList.clear();
    		for (Card cd : netGameScreen.gInfo.playerOutList[me.getDeskId()]) {
    			// out("取2:"+cd.imageId);
    			cardDataList.add(new CardData(cd.imageId, me.getDeskId()));
    		}
    
    		sendCMD(new Msg(me.getName(), me.getIp(), null, currentRoom.getIp(),
    				CMD_HOST_SEND_CARDS, cardDataList));
    	}
    
    	// UI
    	void flush(List<Card> list) {
    		sendMes2(MES_FLUSH_CARDS, list);
    	}
    
    	void updateCards(int desk) {
    
    		flush(netGameScreen.gInfo.playerOutList[(desk + 1) % 3]);
    		if (netGameScreen.gInfo.playerOutList[desk] != null)
    			netGameScreen.gInfo.playerOutList[desk].clear();
    		for (Card c1 : netGameScreen.gInfo.playerList[desk]) {
    			for (CardData card : cardDataList) {
    				if (card.imageId == c1.imageId) {
    					netGameScreen.gInfo.playerOutList[desk].add(c1);
    				}
    			}
    		}
    		if (netGameScreen.gInfo.playerOutList[desk] != null)
    			netGameScreen.gInfo.playerList[desk]
    					.removeAll(netGameScreen.gInfo.playerOutList[desk]);
    		// 发牌
    		sendMes2(MES_SEND_CARDS, desk);
    	}
    
    	void updateLandLordHead() {
    		sendMes2(MES_UPDATE_LANDLORDHEAD, null);
    	}
    
    	void showCardButton() {
    		// out("显示出牌button");
    		sendMes2(MES_SHOW_CARDBUTTON, null);
    	}
    
    	void updateLandlord(int visible) {
    		sendMes2(MES_UPDATE_LANDLORD, visible);
    	}
    
    	void updateBeginCard() {
    		// out(cardDataList.size()+":a");
    		for (CardData card : cardDataList) {
    			Card cards = new Card(card.getImageId(), netGameScreen.atlsa);
    			netGameScreen.gInfo.playerList[card.getDeskId()].add(cards);
    			// netGameScreen.net.out(card.getDeskId()+":"+me.getDeskId());
    			if (card.getDeskId() == me.getDeskId()) {
    				cards.addListener(new ClickListener() {
    					@Override
    					public boolean touchDown(InputEvent event, float x,
    							float y, int pointer, int button) {
    						Card c = (Card) event.getListenerActor();
    						if(netGameScreen.gInfo.getGameState()==2)
    							c.move();
    						c.touched=1;
    						Log.v("test", "touch" + c.imageId);
    						return super.touchDown(event, x, y, pointer, button);
    					}
    
    				});
    			}
    		}
    		// 发牌
    		sendMes2(MES_UPDATE_BEGINCARD, null);
    	}
    
    	void updateRoomList() {
    		sendMes1(MES_UPDATE_ROOM, null);
    	}
    
    	void updateUserList() {
    		sendMes2(MES_UPDATE_User, null);
    	}
    
    	// ***********************************************功能函数*************************************************
    	public boolean isContainsRoom(Room r) {
    		for (int i = 0; i < roomList.size(); i++) {
    			if (roomList.get(i).getIp().equals(r.getIp()))
    				return true;
    		}
    		return false;
    	}
    
    	public boolean isContainsUser(User u) {
    		for (int i = 0; i < users.size(); i++) {
    			// out(users.get(i).getIp()+":"+u.getIp());
    			if (users.get(i).getIp().equals(u.getIp())) {
    				return true;
    			}
    			// out("lala");
    		}
    		// out("false");
    		return false;
    	}
    
    	public void removeRoom(Room room) {
    
    		Room t = null;
    		for (Room r : roomList) {
    			if (r.getIp().equals(room.getIp()))
    				t = r;
    		}
    		roomList.remove(t);
    	}
    
    	public void removeUser(User user) {
    		User t = null;
    		for (User r : users) {
    			if (r.getIp().equals(user.getIp()))
    				t = r;
    		}
    		users.remove(t);
    	}
    
    	// 发送Handle
    	public void sendMes1(int cmd, Object o) {
    		Message m = new Message();
    		m.what = cmd;
    		m.obj = o;
    		if (rommScreen != null)
    			rommScreen.handler.sendMessage(m);
    
    	}
    
    	public void sendMes2(int cmd, Object o) {
    		Message m = new Message();
    		m.what = cmd;
    		m.obj = o;
    		if (netGameScreen != null)
    			netGameScreen.handler.sendMessage(m);
    	}
    
    	// 获取当前时间
    	public static long getTimel() {
    		return System.currentTimeMillis();
    	}
    
    	// 得到广播ip, 192.168.0.255之类的格式
    	public String getBroadCastIP() {
    		String ip = getLocalHostIp().substring(0,
    				getLocalHostIp().lastIndexOf(".") + 1)
    				+ "255";
    		return ip;
    	}
    
    	// 获取本机IP
    	public String getLocalHostIp() {
    		String ipaddress = "";
    		try {
    			Enumeration<NetworkInterface> en = NetworkInterface
    					.getNetworkInterfaces();
    			// 遍历所用的网络接口
    			while (en.hasMoreElements()) {
    				NetworkInterface nif = en.nextElement();// 得到每个网络接口绑定的全部ip
    				Enumeration<InetAddress> inet = nif.getInetAddresses();
    				// 遍历每个接口绑定的全部ip
    				while (inet.hasMoreElements()) {
    					InetAddress ip = inet.nextElement();
    					if (!ip.isLoopbackAddress()
    							&& InetAddressUtils.isIPv4Address(ip
    									.getHostAddress())) {
    						return ipaddress = ip.getHostAddress();
    					}
    				}
    
    			}
    		} catch (SocketException e) {
    			System.out.print("获取IP失败");
    			e.printStackTrace();
    		}
    		return ipaddress;
    
    	}
    
    	// 对象封装成消息
    	public byte[] toByteArray(Object obj) {
    		byte[] bytes = null;
    		ByteArrayOutputStream bos = new ByteArrayOutputStream();
    		try {
    			ObjectOutputStream oos = new ObjectOutputStream(bos);
    			oos.writeObject(obj);
    			oos.flush();
    			bytes = bos.toByteArray();
    			oos.close();
    			bos.close();
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		}
    		return bytes;
    	}
    
    	// 消息解析成对象
    	public Object toObject(byte[] bytes) {
    		Object obj = null;
    		try {
    			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
    			ObjectInputStream ois = new ObjectInputStream(bis);
    			obj = ois.readObject();
    			ois.close();
    			bis.close();
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		} catch (ClassNotFoundException ex) {
    			ex.printStackTrace();
    		}
    		return obj;
    	}
    
    	public static void out(String s) {
    		Log.v("test", s);
    	}
    
    	public void sleepT(long time) {
    		try {
    			Thread.sleep(time);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    


    假设想要所有源代码的。能够 email 我 cq361106306@qq.com. 可是仅仅能研究所用

    PS:因为博客中毒我把全部文章都删了才解封。


  • 相关阅读:
    【鬼脸原创】github搭建动态网站
    WebStorm配置(2016/11/18更新)
    前端学习入门
    css笔记
    c# 将文本中的数据快速导入到数据库(200万左右的数据量)
    3.数据库单多表查询
    2.数据库表的增删改
    1.数据库建表
    浏览器的兼容性测试
    python-路径处理path
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7094705.html
Copyright © 2011-2022 走看看