📄 server.java
字号:
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 + -