static void append( sList list, sFace face ) { face.l = null; face.l[1] = list.root; if( list.root != null ) list.root.l[0] = face; list.root = face; ++list.count; }
static void remove( sList list, sFace face ) { if( face.l[1] != null ) face.l[1].l[0] = face.l[0]; if( face.l[0] != null ) face.l[0].l[1] = face.l[1]; if( face == list.root ) list.root = face.l[1]; --list.count; }
//Code số câu hỏi public void receive(object obj) { Socket client = obj as Socket; byte[] recv = new byte[1]; int recvByte = -1; try { while (true) { string text = ""; do { recvByte = client.Receive(recv); text += Encoding.UTF8.GetString(recv); } while (text[text.Length - 1] != '\n'); if (text.StartsWith("NEWROOM%")) // Create ID Room and add client to room { // định dạng nhận từ client NEWROOM%tên người tạo string[] temp = text.Split('%'); Random random = new Random(); int idroom = random.Next(1000, 9999); if (text.Contains("single") == false) { //check idroom in database Byte[] data = Encoding.UTF8.GetBytes("IDR%" + idroom.ToString()); //send newly created ID_ROOM to the Client client.Send(data); } for (int i = 0; i < 20; i++) { if (lists[i] == null) { lists[i] = new sList(); //int j = FindPosSocket(client); lists[i].listname.Add(temp[1]); clientList.Remove(client); clientname.Remove(temp[1]); lists[i].listsockets.Add(client); lists[i].ID_ROOM = idroom; i = 20; } } } else if (text.StartsWith("QTN")) { int i = FindROOM(client); string question = Getquestion(i); infoMessage(question); Byte[] data = Encoding.UTF8.GetBytes(question); client.Send(data); //định dạng server khi gửi là QTN%TN/TL%mã câu hỏi%nội dung câu hỏi } else if (text.StartsWith("sing")) { Byte[] data = Encoding.UTF8.GetBytes("Hello"); client.Send(data); } else if (text.StartsWith("ROOMS")) //get ID ROOMS { string sdata = ""; for (int i = 0; i < 20; i++)//send all ID_ROOM to the Client { if (lists[i] != null && lists[i].ID_ROOM != 0) { //cấu trúc id%số người chơi hiện tại sdata = lists[i].ID_ROOM.ToString() + " " + lists[i].listsockets.Count.ToString() + "/4"; infoMessage(sdata); Byte[] data = Encoding.UTF8.GetBytes(sdata); client.Send(data); } } } else if (text.StartsWith("PLR"))//gửi tên người chơi trong Room { string data = "PLR"; int i = FindROOM(client); //lấy tên client int numberclient = lists[i].listname.Count; foreach (string item in lists[i].listname) { data += "%" + item; } if (numberclient == 2) { data += "%%"; } if (numberclient == 3) { data += "%"; } Byte[] sdata = Encoding.UTF8.GetBytes(data); foreach (Socket socket in lists[i].listsockets) { socket.Send(sdata); infoMessage(data + socket.RemoteEndPoint.ToString()); } client.Send(sdata); /* * for (int i = 0; i < 20; i++) * { * if (lists[i] != null) * { * foreach (Socket socket in lists[i].listsockets) * { * if (socket != null && socket == client) * { * foreach (string sname in lists[i].listname) * { * data += "%" + sname; * } * //cấu trúc PLR%name1%name2%name3%name4 * Byte[] sdata = Encoding.UTF8.GetBytes(data); * client.Send(sdata); * break; * } * } * } * }*/ } else if (text.StartsWith("GO")) //trưởng phòng sẽ gửi nhãn này { infoMessage(client.RemoteEndPoint.ToString() + " " + text); for (int i = 0; i < 20; i++) { if (lists[i] != null) { foreach (Socket socket in lists[i].listsockets) { if (socket != null && socket == client) { if (lists[i].listsockets.Count == lists[i].RDY) { Byte[] data = Encoding.UTF8.GetBytes("GO%1"); client.Send(data); foreach (Socket item in lists[i].listsockets) { if (item != null) { item.Send(data); } } //Getquestion(i); } else { Byte[] data = Encoding.UTF8.GetBytes("GO%0"); client.Send(data); } break; } } } } } else if (text.StartsWith("STS%"))//xác định trạng thái các client đã sẵn sàng hay chưa { //STS%name%0/1 infoMessage(text); string[] sname = text.Split('%'); int z = Int32.Parse(sname[2]); if (z == 1) { for (int i = 0; i < 20; i++) { if (lists[i] != null) { foreach (Socket item in lists[i].listsockets) { if (item != null) { if (client == item) { lists[i].RDY += 1; int x = 1; foreach (Socket items in lists[i].listsockets) { if (items != null) { Byte[] data = Encoding.UTF8.GetBytes("RDY%" + x.ToString()); item.Send(data); } x++; } break; } } } } } } else { int x = -1; for (int i = 0; i < 20; i++) { if (lists[i] != null) { foreach (Socket item in lists[i].listsockets) { if (item != null) { if (client == item) { lists[i].RDY -= 1; foreach (Socket items in lists[i].listsockets) { if (items != null) { Byte[] data = Encoding.UTF8.GetBytes("STS%" + sname[1] + "%0"); item.Send(data); } } x = i; } } } } } if (x > -1) { lists[x].listsockets.Remove(client); clientList.Add(client); } } } else if (text.StartsWith("JOI%")) //add client to existing ID_ROOM { string[] sLobby = text.Split('%'); int id = int.Parse(sLobby[1]); int i; for (i = 0; i < 20; i++) { if (lists[i] != null && id == lists[i].ID_ROOM) { if (lists[i].listsockets.Count < lists[i].Type) //Allow client to add ROOM { try { int j = FindPosSocket(client); lists[i].listsockets.Add(client); clientList.Remove(client); lists[i].listname.Add(clientname[j]); clientname.Remove(clientname[j]); } catch { MessageBox.Show("Lỗi"); } //lấy tên của client từ database lưu vào list[i].listname //Byte[] data = Encoding.UTF8.GetBytes("OK"); //client.Send(data); } break; } } if (i == 20) { Byte[] data = Encoding.UTF8.GetBytes("ERR"); client.Send(data); } } else if (text.StartsWith("TRT%")) { //gửi giải thích câu hỏi } else if (text.StartsWith("LIV")) { string[] sdata = text.Split('%'); int liv = Int32.Parse(sdata[1]); for (int i = 0; i < 20; i++) { if (lists[i] != null) { int count = 0; foreach (Socket socket in lists[i].listsockets) { if (socket != null && socket == client) { int die = 0; //tính số client có mạng =0 lists[i].live[count] = liv; if (liv == 0) { die++; } //Nếu tất cả người chơi đều có số mạng là 0 thì gửi nhãn EGE để kết thúc if ((die == lists[i].listsockets.Count - 1) && lists[i].listsockets.Count > 1) { foreach (Socket items in clientList) { if (items != null) { Byte[] data = Encoding.UTF8.GetBytes("EGE"); items.Send(data); } } } else if (die == lists[i].listsockets.Count) { Byte[] data = Encoding.UTF8.GetBytes("EGE"); client.Send(data); infoMessage("EGE"); } } count++; } } } } else if (text.StartsWith("LIF")) { //trả về số mạng các người chơi trong phòng int i = FindROOM(client); string data = "LIF"; for (int j = 0; j < lists[i].listsockets.Count; j++) { data += "%" + lists[i].live[j].ToString(); } Byte[] sdata = Encoding.UTF8.GetBytes(data); foreach (Socket socket in lists[i].listsockets) { if (socket != null) { socket.Send(sdata); } } } else { chat(client, text); } infoMessage(client.RemoteEndPoint + ": " + text); } } catch { clientList.Remove(client); client.Close(); } }