java利用多线程和Socket实现猜拳游戏
本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下
实例:猜拳游戏
猜拳游戏是指小时候玩的石头、剪刀、布的游戏。客户端与服务器的“较量”,服务器会自动随机产生出石头、剪刀或者布,客户端则由用户输入石头、剪刀、布之一,然后服务器通过比较告知比较结果。比如,客户端出石头,而服务器出的是剪刀,那么,服务器就会告知客户端,用户赢了。猜拳游戏也要制作一个多线程的程序,让多个客户端能够共同参与游戏。在该程序中,要包括猜拳的业务逻辑的线程类、客户端类、服务器类。
根据实例的要求,猜拳游戏的业务逻辑线程类的代码如下。
importjava.io.DataInputStream; importjava.io.DataOutputStream; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.Socket; importjava.util.Random; /** *@authorMNH *@version1.0 *@projectName:JavaSenior *@fileName:PlayThread *@desc功能描述 *@date2020/8/19 *@time8:53 *@byIDE:IntelliJIDEA */ publicclassPlayThreadimplementsRunnable{ Sockets; InputStreamis=null; OutputStreamos=null; publicPlayThread(Sockets){ this.s=s; } @Override publicvoidrun(){ try{ is=s.getInputStream(); os=s.getOutputStream(); DataOutputStreamdos=newDataOutputStream(os); DataInputStreamdis=newDataInputStream(is); Randomrd=newRandom(3);//0代表石头,1代表剪刀,2代表布 while(true){ intrandom=rd.nextInt(); intnumber=dis.readInt(); if(number==3){ System.out.println("客户端退出"); break; } intrs=-1;//1代表获胜,2代表失败,3代表平局 if(random==0){ if(number==1){ rs=2; }elseif(number==2){ rs=1; }else{ rs=3; } }elseif(random==1){ if(number==0){ rs=1; }elseif(number==2){ rs=2; }else{ rs=3; } }else{ if(number==0){ rs=2; }elseif(number==1){ rs=1; }else{ rs=3; } } dos.writeInt(rs); dos.flush(); } }catch(Exceptione){ e.printStackTrace(); } } publicvoidclose(){ try{ is.close(); os.close(); }catch(Exceptione){ e.printStackTrace(); } } }
上面的代码实现了客户端的输入,并将判断结果反馈给服务器的操作。服务器端直接调用该线程即可,实现代码如下。
importjava.net.ServerSocket; importjava.net.Socket; /** *@authorMNH *@version1.0 *@projectName:JavaSenior *@fileName:PlayServer *@desc功能描述 *@date2020/8/19 *@time9:30 *@byIDE:IntelliJIDEA */ publicclassPlayServer{ publicstaticvoidmain(String[]args){ ServerSocketss=null; System.out.println("服务器启动......"); try{ ss=newServerSocket(4567); while(true){ Sockets=ss.accept(); newThread(newPlayThread(s)).start();//启动线程 } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ ss.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
最后,客户端的作用就是从控制台获取用户输入的选择,然后,将用户输入的值传递给服务器,再从服务器中获取反馈的结果输出到控制台上即可。客户端的代码如下。
importjava.io.DataInputStream; importjava.io.DataOutputStream; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.Socket; importjava.util.Scanner; publicclassPlayClient{ publicstaticvoidmain(String[]args){ InputStreamis=null; OutputStreamos=null; Sockets=null; try{ s=newSocket("127.0.0.1",4567); is=s.getInputStream(); os=s.getOutputStream(); while(true){ DataInputStreamdis=newDataInputStream(is); DataOutputStreamdos=newDataOutputStream(os); System.out.println("欢迎来到猜拳游戏"); System.out.println("请选择:"); System.out.println("0:石头"); System.out.println("1:剪刀"); System.out.println("2:布"); System.out.println("3:退出"); Scannersc=newScanner(System.in); intchoose=sc.nextInt(); if(choose>=0&&choose<=2){ dos.writeInt(choose); dos.flush(); }elseif(choose==3){ dos.writeInt(choose); dos.flush(); System.out.println("游戏结束!"); break; }else{ System.out.println("输入错误,请重新输入"); } intrs=dis.readInt();//获取判断结果1代表获胜,2代表失败,3代表平局 if(rs==1){ System.out.println("本局比赛获胜"); }elseif(rs==2){ System.out.println("本局比赛失败"); }else{ System.out.println("本局比赛平局"); } } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ is.close(); os.close(); s.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
至此,基本的猜拳游戏程序就编程完成了。有兴趣的小伙伴还可以在其中加入猜拳输赢的次数统计等功能。在运行上面的程序时,服务器端会一直处于运行的状态,等待客户端的连接。当有客户端退出时,会在服务器端的控制台上打印“客户端退出”。
客户端的运行效果如下。
如有错误,请各位给予指正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。