java利用多线程和Socket实现猜拳游戏

 更新时间:2020年08月21日 17:25:00   作者:一只楚楚猫  
这篇文章主要为大家详细介绍了java利用多线程和Socket实现猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下

实例:猜拳游戏

猜拳游戏是指小时候玩的石头、剪刀、布的游戏。客户端与服务器的“较量”,服务器会自动随机产生出石头、剪刀或者布,客户端则由用户输入石头、剪刀、布之一,然后服务器通过比较告知比较结果。比如,客户端出石头,而服务器出的是剪刀,那么,服务器就会告知客户端,用户赢了。猜拳游戏也要制作一个多线程的程序,让多个客户端能够共同参与游戏。在该程序中,要包括猜拳的业务逻辑的线程类、客户端类、服务器类。

根据实例的要求,猜拳游戏的业务逻辑线程类的代码如下。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Random;

/**
 * @author MNH
 * @version 1.0
 * @project Name: JavaSenior
 * @file Name: PlayThread
 * @desc 功能描述
 * @date 2020/8/19
 * @time 8:53
 * @by IDE: IntelliJ IDEA
 */
public class PlayThread implements Runnable{
 Socket s;
 InputStream is=null;
 OutputStream os=null;
 public PlayThread(Socket s){
  this.s=s;
 }

 @Override
 public void run() {
  try {
   is = s.getInputStream();
   os = s.getOutputStream();

   DataOutputStream dos = new DataOutputStream(os);
   DataInputStream dis = new DataInputStream(is);
   Random rd = new Random(3);//0代表石头,1代表剪刀,2代表布
   while (true) {
    int random = rd.nextInt();
    int number = dis.readInt();
    if (number == 3) {
     System.out.println("客户端退出");
     break;
    }
    int rs = -1;//1代表获胜,2代表失败,3代表平局
    if (random == 0) {
     if (number == 1) {
      rs = 2;
     } else if (number == 2) {
      rs = 1;
     } else {
      rs = 3;
     }
    } else if (random == 1) {
     if (number == 0) {
      rs = 1;
     } else if (number == 2) {
      rs = 2;
     } else {
      rs = 3;
     }
    } else {
     if (number == 0) {
      rs = 2;
     } else if (number == 1) {
      rs = 1;
     } else {
      rs = 3;
     }
    }
    dos.writeInt(rs);
    dos.flush();
   }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void close(){
  try{
   is.close();
   os.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}

上面的代码实现了客户端的输入,并将判断结果反馈给服务器的操作。服务器端直接调用该线程即可,实现代码如下。

import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author MNH
 * @version 1.0
 * @project Name: JavaSenior
 * @file Name: PlayServer
 * @desc 功能描述
 * @date 2020/8/19
 * @time 9:30
 * @by IDE: IntelliJ IDEA
 */
 
public class PlayServer {
 public static void main(String[] args) {
  ServerSocket ss=null;
  System.out.println("服务器启动......");
  try{
   ss=new ServerSocket(4567);
   while(true){
    Socket s=ss.accept();
    new Thread(new PlayThread(s)).start();//启动线程
   }
  }catch (Exception e){
   e.printStackTrace();
  }finally {
   try{
    ss.close();
   }catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

最后,客户端的作用就是从控制台获取用户输入的选择,然后,将用户输入的值传递给服务器,再从服务器中获取反馈的结果输出到控制台上即可。客户端的代码如下。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class PlayClient {
 public static void main(String[] args) {
  InputStream is=null;
  OutputStream os=null;
  Socket s=null;
  try{
   s=new Socket("127.0.0.1",4567);
   is=s.getInputStream();
   os=s.getOutputStream();
   while(true) {
    DataInputStream dis = new DataInputStream(is);
    DataOutputStream dos = new DataOutputStream(os);
    System.out.println("欢迎来到猜拳游戏");
    System.out.println("请选择:");
    System.out.println("0:石头");
    System.out.println("1:剪刀");
    System.out.println("2:布");
    System.out.println("3:退出");
    Scanner sc=new Scanner(System.in);
    int choose=sc.nextInt();
    if(choose>=0&&choose<=2){
     dos.writeInt(choose);
     dos.flush();
    }else if(choose==3){
     dos.writeInt(choose);
     dos.flush();
     System.out.println("游戏结束!");
     break;
    }else{
     System.out.println("输入错误,请重新输入");
    }
    int rs=dis.readInt();//获取判断结果 1代表获胜,2代表失败,3代表平局
    if(rs==1){
     System.out.println("本局比赛获胜");
    }else if(rs==2){
     System.out.println("本局比赛失败");
    }else{
     System.out.println("本局比赛平局");
    }
   }

  }catch(Exception e){
   e.printStackTrace();
  }finally {
   try{
    is.close();
    os.close();
    s.close();
   }catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

至此,基本的猜拳游戏程序就编程完成了。有兴趣的小伙伴还可以在其中加入猜拳输赢的次数统计等功能。在运行上面的程序时,服务器端会一直处于运行的状态,等待客户端的连接。当有客户端退出时,会在服务器端的控制台上打印“客户端退出”。

客户端的运行效果如下。

如有错误,请各位给予指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java实现的简单猜数字游戏代码

    java实现的简单猜数字游戏代码

    这篇文章主要介绍了java实现的简单猜数字游戏代码,通过随机数与逻辑判断来实现游戏功能,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • Java正则表达式,提取双引号中间的部分方法

    Java正则表达式,提取双引号中间的部分方法

    今天小编就为大家分享一篇Java正则表达式,提取双引号中间的部分方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 详解Java的回调机制

    详解Java的回调机制

    最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,本文介绍了Java的回调机制,有兴趣的同学可以了解一下
    2016-10-10
  • Springboot加载所有Bean之后运行方式

    Springboot加载所有Bean之后运行方式

    这篇文章主要介绍了Springboot加载所有Bean之后运行方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot配置拦截器方式实例代码

    SpringBoot配置拦截器方式实例代码

    在本篇文章里小编给大家分享的是关于SpringBoot配置拦截器方式实例代码,有需要的朋友们可以参考下。
    2020-04-04
  • RabbitMQ 实现延迟队列的两种方式详解

    RabbitMQ 实现延迟队列的两种方式详解

    很多场景下我们都需要延迟队列。这篇文章主要以RabbitMQ为例来和大家聊一聊延迟队列的玩法。文中的代码具有一定的学习价值,感兴趣的同学可以了解一下
    2021-12-12
  • 关于Java中的CAS如何使用

    关于Java中的CAS如何使用

    这篇文章主要介绍了关于Java中的CAS如何使用,CAS是Compare And Swap(比较并交换)的缩写,是一种非阻塞式并发控制技术,用于保证多个线程在修改同一个共享资源时不会出现竞争条件,从而避免了传统锁机制的各种问题,需要的朋友可以参考下
    2023-09-09
  • JAVA 添加、修改和删除PDF书签的示例代码

    JAVA 添加、修改和删除PDF书签的示例代码

    这篇文章主要介绍了JAVA 添加、修改和删除PDF书签的示例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Java 逻辑控制详解分析

    Java 逻辑控制详解分析

    在程序开发的过程之中一共会存在有三种程序逻辑:顺序结构、分支结构、循环结构,对于之前所编写的代码大部分都是顺序结构的定义,即:所有的程序将按照定义的代码顺序依次执行
    2021-11-11
  • java基础之方法详解

    java基础之方法详解

    这篇文章主要介绍了java基础之方法详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-07-07

最新评论