⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 用J2ME开发手机网络游戏——斗地主,调试环境:Win XP;J2ME
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
import java.io.*;
import java.net.*;
import java.net.InetAddress;
import java.lang.String;
import java.util.*;
import java.util.Random;
import java.util.Arrays;
public class Server
{
	public static void main(String[] args) throws IOException
	{
		Table table[]=new Table[10];
		System.out.println("Server start...");
		DatagramSocket s=new DatagramSocket(5031);
		  while (true)
		  {
			  byte[]data=new byte[100];
			  DatagramPacket dgp=new DatagramPacket(data,data.length);
             s.receive(dgp);
             InetAddress address = dgp.getAddress();
             int port = dgp.getPort();
             int tableId=0;
             int reid=0;
             String redata=new String(data);
             StringParse rcvData = new StringParse(redata,'#');
             System.out.println(redata);///
             if(redata.startsWith("NEW"))
             {// NEW#1#1#jordan#male#231#   the first 1 means tableid,the second one means userid
                 
            	 rcvData.getNextToken();
	             tableId=Integer.parseInt(rcvData.getNextToken())-1;
	             reid=Integer.parseInt(rcvData.getNextToken());
	             System.out.println("new id:"+reid);////////
	             ///////////////////////////
	             if(table[tableId]==null)
	            	 table[tableId]=new Table();
	             boolean isIn=false;
	             for(int j=0;j<3;j++)
	             {
	            	 if(table[tableId].id[j]==reid&&table[tableId].state[j]==1)
	            		 isIn=true;
	            	 //已经进入桌子,不能重复登录
	             }
	             if(isIn)continue;//应该发送给客户
	             ///////////////////////////
	             int tag=-1;
	             for(int i=0;i<3;i++)
	            	 if(table[tableId].state[i]==0)
	            	 {
	            		 table[tableId].add[i]=address;
	            		 table[tableId].p[i]=port;
	            		 table[tableId].state[i]=1;
	            		 table[tableId].id[i]=reid;
	            		 table[tableId].nickname[i]=rcvData.getNextToken();
	            		 table[tableId].sex[i]=rcvData.getNextToken();
	            		 table[tableId].score[i]=rcvData.getNextToken();
	            		 table[tableId].num++;
	            		 tag=i;
	            		 System.out.println("num:"+table[tableId].num);
	            		 break;
	            	 }
	             
	             if(table[tableId].num==1)continue;
	             else if(table[tableId].num==2)
	             {
	            	 if (tag==-1)continue;//没找到座
	            	 int up=(tag+2)%3;
	            	 int down=(tag+1)%3;
	            	 if(table[tableId].state[up]==1)
	            	 {
	            		 String str="PLAYERUPINFO#"+table[tableId].nickname[up]+"#"
	            		 	+table[tableId].sex[up]+"#"+table[tableId].score[up]+"#";
	            		 data=str.getBytes();
	            		 dgp = new DatagramPacket(data, data.length, table[tableId].add[tag], table[tableId].p[tag]);
	                     s.send(dgp);
	                     
	                     str="PLAYERDOWNINFO#"+table[tableId].nickname[tag]+"#"+
	                     	table[tableId].sex[tag]+"#"+table[tableId].score[tag]+"#";
	                     data=str.getBytes();
	                     dgp = new DatagramPacket(data, data.length, table[tableId].add[up], table[tableId].p[up]);
	                     s.send(dgp);
	                 }
	            	 else if(table[tableId].state[down]==1)
	            	 {
	            		 String str="PLAYERUPINFO#"+table[tableId].nickname[tag]+"#"
	            		 	+table[tableId].sex[tag]+"#"+table[tableId].score[tag]+"#";
	            		 data=str.getBytes();
	            		 dgp = new DatagramPacket(data, data.length, table[tableId].add[down], table[tableId].p[down]);
	                     s.send(dgp);
	                     
	                     str="PLAYERDOWNINFO#"+table[tableId].nickname[down]+"#"
	                     	+table[tableId].sex[down]+"#"+table[tableId].score[down]+"#";
	                     data=str.getBytes();
	                     dgp = new DatagramPacket(data, data.length, table[tableId].add[tag], table[tableId].p[tag]);
	                     s.send(dgp);
	            	 }
	            	 
	             }
	             else if(table[tableId].num==3)
	             {
	            	 for(int i=0;i<3;i++)
	            	 {
	            		 int up=(i+2)%3;
		            	 int down=(i+1)%3;
		            	 String str="TWOPLAYERSINFO#"+table[tableId].nickname[up]+"#"
		            	 	+table[tableId].sex[up]+"#"+table[tableId].score[up]+"#"+
		            	 	table[tableId].nickname[down]+"#"+table[tableId].sex[down]
		            	 	 +"#"+table[tableId].score[down]+"#";
		            	 data=str.getBytes();
	                     dgp = new DatagramPacket(data, data.length, table[tableId].add[i], table[tableId].p[i]);
	                     s.send(dgp);
	            	 }
	            	 //////////////////////
	            	 //下面这段程序为服务器端洗牌,洗好之后发给各玩家,其中地主三张牌还没发
	            	 table[tableId].allotCards();//洗牌
	            	 String strpai="";
	            	 for(int i=0;i<17;i++)
	            	 {
	            		strpai=strpai+String.valueOf(table[tableId].play_a[i])+"#";
	            	 }
	            	 strpai="PEASANTCARDS#"+strpai;
	            	 data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[0], table[tableId].p[0]);
                     s.send(dgp);//发给玩家1
                     
                     strpai="";
                     for(int i=0;i<17;i++)
	            	 {
	            		strpai=strpai+String.valueOf(table[tableId].play_b[i])+"#";
	            	 }
	            	 strpai="PEASANTCARDS#"+strpai;
	            	 data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[1], table[tableId].p[1]);
                     s.send(dgp);//发给玩家2
                     
                     strpai="";
                     for(int i=0;i<17;i++)
	            	 {
	            		strpai=strpai+String.valueOf(table[tableId].play_c[i])+"#";
	            	 }
	            	 strpai="PEASANTCARDS#"+strpai;
	            	 data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[2], table[tableId].p[2]);
                     s.send(dgp);//发给玩家3
	            	 
	            	 Random random=new Random();//随机数决定谁先叫牌
	            	 int k=(random.nextInt())%3;
	            	 table[tableId].call=Math.abs(k);
	            	 String strcall="PLSCALL#1#";
	            	 data=strcall.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[table[tableId].call], table[tableId].p[table[tableId].call]);
                     s.send(dgp);

	             }//end of num=3
             }//end of "NEW"
             else if(redata.startsWith("NOCALL"))
             {
            	 rcvData.getNextToken();
	             tableId=Integer.parseInt(rcvData.getNextToken())-1;
	             reid=Integer.parseInt(rcvData.getNextToken());
            	 table[tableId].callNum++;
            	 int k;
            	 for(k=0;k<3;k++)
            	 {
            		 if(table[tableId].id[k]==reid)
            			 break;
            	 }
            	 table[tableId].callState[k]=0;
            	 if(table[tableId].callNum==3&&table[tableId].iscall==false)
            	 {
            		 //todo:没人叫牌,重新发牌,还没实现
            		 System.out.println("需重新开牌!");/////
            	 }
            	 else if(table[tableId].callNum==3&&table[tableId].iscall==true)
            	 {//可以开牌
            		 int d=table[tableId].dz;
            		 int d_up=(d+2)%3;
            		 int d_down=(d+1)%3;
            		 
            		 String strpai="";
            		 table[tableId].allotLord();
            		 String pai3=String.valueOf(table[tableId].pai[51])+"#"
            		 	+String.valueOf(table[tableId].pai[52])+"#"
            		 	+String.valueOf(table[tableId].pai[53])+"#";
	            	 for(int i=0;i<20;i++)
	            	 {
	            		strpai=strpai+String.valueOf(table[tableId].dizhu[i])+"#";
	            	 }
	            	 strpai="LORDCARDS#"+strpai+pai3;
	            	 data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d], table[tableId].p[d]);
                     s.send(dgp);//发给地主
                     
                     strpai="LORDDOWN#"+pai3;
                     data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d_up], table[tableId].p[d_up]);
                     s.send(dgp);//发给地主的上家
                     
                     strpai="LORDUP#"+pai3;
                     data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d_down], table[tableId].p[d_down]);
                     s.send(dgp);//发给地主的下家
                     
                     //以下得到叫牌的倍数
                     int a=table[tableId].callState[0]>table[tableId].callState[1]?table[tableId].callState[0]:table[tableId].callState[1];
                	 int callTime=a>table[tableId].callState[2]?a:table[tableId].callState[2];
                	 String callstr="CALLTIME#"+String.valueOf(callTime)+"#";
                	 data=callstr.getBytes();
                	 
                	 dgp = new DatagramPacket(data, data.length, table[tableId].add[0], table[tableId].p[0]);
                     s.send(dgp);
                     dgp = new DatagramPacket(data, data.length, table[tableId].add[1], table[tableId].p[1]);
                     s.send(dgp);
                     dgp = new DatagramPacket(data, data.length, table[tableId].add[2], table[tableId].p[2]);
                     s.send(dgp);
            	 }
            	 else if(table[tableId].callNum<3)
            	 {
	            	 table[tableId].call=(table[tableId].call+1)%3;
	            	 String strcall="PLSCALL#"+String.valueOf(table[tableId].mincall)+"#";
	            	 data=strcall.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[table[tableId].call], table[tableId].p[table[tableId].call]);
	                 s.send(dgp);
            	 }
             }
             else if(redata.startsWith("OKCALLONE"))
             {
            	 rcvData.getNextToken();
	             tableId=Integer.parseInt(rcvData.getNextToken())-1;
	             reid=Integer.parseInt(rcvData.getNextToken());
	             table[tableId].callNum++;//叫牌人数加1
	             table[tableId].mincall=2;
	             table[tableId].iscall=true;
            	 int k;
            	 for(k=0;k<3;k++)
            	 {
            		 if(table[tableId].id[k]==reid)
            			 break;
            	 }
            	 table[tableId].callState[k]=1;//叫牌状态置位1	 
            	 
            	 int tmp_dz=k;
            	 int tmp=1;
            	 for(int i=0;i<3;i++)
            	 {
            		 if(table[tableId].callState[i]>tmp)
            		 {
            			 tmp=table[tableId].callState[i];
            			 tmp_dz=i;
            		 }
            	 }
            	 table[tableId].dz=tmp_dz;
            	 
            	 if(table[tableId].callNum==3)
            	 {//本轮叫牌结束,可以开始比赛 
            		 int d=table[tableId].dz;
            		 int d_up=(d+2)%3;
            		 int d_down=(d+1)%3;
            		 
            		 String strpai="";
            		 table[tableId].allotLord();
            		 String pai3=String.valueOf(table[tableId].pai[51])+"#"
      		 			+String.valueOf(table[tableId].pai[52])+"#"
      		 			+String.valueOf(table[tableId].pai[53])+"#";
	            	 for(int i=0;i<20;i++)
	            	 {
	            		strpai=strpai+String.valueOf(table[tableId].dizhu[i])+"#";
	            	 }
	            	 strpai="LORDCARDS#"+strpai+pai3;
	            	 data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d], table[tableId].p[d]);
                     s.send(dgp);//发给地主
                     
                     strpai="LORDDOWN#"+pai3;
                     data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d_up], table[tableId].p[d_up]);
                     s.send(dgp);//发给地主的上家
                     
                     strpai="LORDUP#"+pai3;
                     data=strpai.getBytes();
	            	 dgp = new DatagramPacket(data, data.length, table[tableId].add[d_down], table[tableId].p[d_down]);
                     s.send(dgp);//发给地主的下家
                     
                     //以下得到叫牌的倍数
                     int a=table[tableId].callState[0]>table[tableId].callState[1]?table[tableId].callState[0]:table[tableId].callState[1];
                	 int callTime=a>table[tableId].callState[2]?a:table[tableId].callState[2];
                	 String callstr="CALLTIME#"+String.valueOf(callTime)+"#";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -