新手友好大师:tcp麻将游戏中篇

新手友好大师: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;
			}
		}
	}




	代码在上。大家好好看看。
	今天就到这。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值