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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。