新手友好大师:tcp麻将游戏中篇
好,今天我们第一个部分就是写完摸牌,出牌后数据的统一。
昨天写到客户端连接上游戏主程序,获得牌面,并且传来出牌字符串。
这里我们针对这个出牌写一些方法。
碰的方法,
public void knock(String outcard ,String[] p1cards,String[]p2cards,int[] p1nums,int[] p2nums,String [] standard) {
for (int i=0;i<18;i++) {
if(p1cards[i].equals(outcard)) {
// List<String > p1cardlist=Arrays.asList(p1cards);
// p1cardlist.remove(i);
// p1cards=(String[]) p1cardlist.toArray();
p1nums[i]=0;
Arrays.sort(p1nums);
for(int j=1;j<18;i++) {
p1cards[i-1]=standard[p1nums[i]];
}
break;
}
}
// 移除p1list里的目标牌,自此真正走完出牌流程
for (int i=0;i<18;i++) {
if(p2cards[i].equals(outcard)) {
p2nums[i]=0;
p2nums[i+1]=0;
Arrays.sort(p2nums);
for(int j=2;j<17;i++) {
p2cards[i-2]=standard[p2nums[i]];
}
break;
}
String[] p2knock=new String[5];
p2knock[0]=outcard;
}
};}
在这个方法里,大家要注意,card怎么变化你不用管,你只用在意num的变化,然后在根据标准数组
standard把它对出来即可。
同样的,杠和吃的方法;
public void eat(String outcard ,String[] p1cards,String[]p2cards,int[] p1nums,int[] p2nums,String [] standard) {
for (int i=0;i<18;i++) {
if(p1cards[i].equals(outcard)) {
// List<String > p1cardlist=Arrays.asList(p1cards);
// p1cardlist.remove(i);
// p1cards=(String[]) p1cardlist.toArray();
p1nums[i]=0;
Arrays.sort(p1nums);
for(int j=1;j<18;i++) {
p1cards[i-1]=standard[p1nums[i]];
}
break;
}
}
// 移除p1list里的目标牌,自此真正走完出牌流程
for (int i=0;i<18;i++) {
if(p2cards[i].equals(outcard)) {
if(standard[p2nums[i]].equals(standard[p2nums[i+1]]));
if(standard[p2nums[i]].equals(standard[p2nums[i+2]])) {
p2nums[i]=0;
p2nums[i+3]=0;}
else {
p2nums[i]=0;
p2nums[i+2]=0;}
}else {
p2nums[i]=0;
p2nums[i+2]=0;}
Arrays.sort(p2nums);
for(int j=2;j<17;j++) {
p2cards[j-2]=standard[p2nums[j]];
}
break;
}
String[] p2eat=new String[5];
p2eat[0]=outcard;
}
public void bar(String outcard ,String[] p1cards,String[]p2cards,int[] p1nums,int[] p2nums,String [] standard) {
for (int i=0;i<18;i++) {
if(p1cards[i].equals(outcard)) {
// List<String > p1cardlist=Arrays.asList(p1cards);
// p1cardlist.remove(i);
// p1cards=(String[]) p1cardlist.toArray();
p1nums[i]=0;
Arrays.sort(p1nums);
for(int j=1;j<18;i++) {
p1cards[i-1]=standard[p1nums[i]];
}
break;
}
}
//移除p1list里的目标牌,自此真正走完出牌流程
for (int i=0;i<18;i++) {
if(p2cards[i].equals(outcard)) {
p2nums[i]=0;
p2nums[i+1]=0;
p2nums[i+2]=0;
Arrays.sort(p2nums);
for(int j=3;j<17;i++) {
p2cards[i-2]=standard[p2nums[i]];
}
break;
}
String[] p2bar=new String[5];
p2bar[0]=outcard;
}
};
这里3种方法大同小异,小异在哪,吃是下家吃,且吃的话,他可能手上有对张,或者三张都有可能,所以这里要判断一下,然后,吃跟碰都是要出牌的,杠不摸不出。
判断方法写好了,这里完成正常的摸出牌流程。
还要注意一点,咋们由于没有对象,所有很大权限都是交给主程序来完成的,什么意思,就是频繁操作的,是num和card这两个数组。咋们并没有把棋子当做对象,为什么不把棋子写成对象呢?说实话,没有那个必要,咋们能用容器实现的东西,尽量不去用类,当然这是对于咋们学习的初期而言,且项目初步完成后,咋们还可以加入工具类,封装重复代码。
多个客户端连接同一个服务器,必须用到多线程,咋们这里也不用,咋们频繁做短连接,并且用到一个死循环加上switchcase来保证回合有序进行。
服务器的accept方法是线程阻塞的,直到有客户端连接上程序才往下执行,这正是我们想要的
while (true) {
int Round = 1;
switch (Round) {
case 1:
Socket socket1 = server.accept();
OutputStream os1 = socket1.getOutputStream();
InputStream is1 = socket1.getInputStream();
System.out.println("");
p1num[0] = numlist.get(0);
numlist.remove(0);
Arrays.sort(p1num);
for (int j = 0; j < 18; j++) {
System.out.print(p1num[j] + "\t");
}
System.out.println("到1号玩家出牌了了!!!!!!!!!!");
byte[] bytep1 = new byte[1024];
int len1 = is1.read(bytep1);
String outcard1 = new String(bytep1, 0, len1);
outcards[0] = outcard1;
System.out.println(outcard1);
Round++;
os1.close();
is1.close();
socket1.close();
case 2:
Socket socket2 = server.accept();
OutputStream os2 = socket2.getOutputStream();
InputStream is2 = socket2.getInputStream();
System.out.println("");
p2num[0] = numlist.get(0);
numlist.remove(0);
Arrays.sort(p2num);
for (int j = 0; j < 18; j++) {
System.out.print(p2num[j] + "\t");
}
System.out.println("到你的出牌了了!!!!!!!!!!");
byte[] bytep2 = new byte[1024];
int len2 = is2.read(bytep2);
String outcard2 = new String(bytep2, 0, len2);
outcards[1] = outcard2;
System.out.println(outcard2);
Round++;
os2.close();
is2.close();
socket2.close();
case 3:
Socket socket3 = server.accept();
OutputStream os3 = socket3.getOutputStream();
InputStream is3 = socket3.getInputStream();
System.out.println("");
p3num[0] = numlist.get(0);
numlist.remove(0);
Arrays.sort(p3num);
for (int j = 0; j < 18; j++) {
System.out.print(p3num[j] + "\t");
}
System.out.println("到玩家三出牌了了!!!!!!!!!!");
byte[] bytep3 = new byte[1024];
int len3 = is3.read(bytep3);
String outcard3 = new String(bytep3, 0, len3);
outcards[2] = outcard3;
System.out.println(outcard3);
Round++;
os3.close();
is3.close();
socket3.close();
case 4:
Socket socket4 = server.accept();
OutputStream os4 = socket4.getOutputStream();
InputStream is4 = socket4.getInputStream();
System.out.println("");
p4num[0] = numlist.get(0);
numlist.remove(0);
Arrays.sort(p4num);
for (int j = 0; j < 18; j++) {
System.out.print(p4num[j] + "\t");
}
System.out.println("到玩家四出牌了了!!!!!!!!!!");
byte[] bytep4 = new byte[1024];
int len4 = is4.read(bytep4);
String outcard4 = new String(bytep4, 0, len4);
outcards[3] = outcard4;
System.out.println(outcard4);
Round = 1;
os4.close();
is4.close();
socket4.close();
default:
break;
}
}
}
代码在上。大家好好看看。
今天就到这。