亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java利用多線程和Socket實(shí)現(xiàn)猜拳游戲

 更新時(shí)間:2020年08月21日 17:25:00   作者:一只楚楚貓  
這篇文章主要為大家詳細(xì)介紹了java利用多線程和Socket實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了利用多線程和Socket實(shí)現(xiàn)猜拳游戲的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)例:猜拳游戲

猜拳游戲是指小時(shí)候玩的石頭、剪刀、布的游戲??蛻舳伺c服務(wù)器的“較量”,服務(wù)器會(huì)自動(dòng)隨機(jī)產(chǎn)生出石頭、剪刀或者布,客戶端則由用戶輸入石頭、剪刀、布之一,然后服務(wù)器通過(guò)比較告知比較結(jié)果。比如,客戶端出石頭,而服務(wù)器出的是剪刀,那么,服務(wù)器就會(huì)告知客戶端,用戶贏了。猜拳游戲也要制作一個(gè)多線程的程序,讓多個(gè)客戶端能夠共同參與游戲。在該程序中,要包括猜拳的業(yè)務(wù)邏輯的線程類、客戶端類、服務(wù)器類。

根據(jù)實(shí)例的要求,猜拳游戲的業(yè)務(wù)邏輯線程類的代碼如下。

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();
  }
 }
}

上面的代碼實(shí)現(xiàn)了客戶端的輸入,并將判斷結(jié)果反饋給服務(wù)器的操作。服務(wù)器端直接調(diào)用該線程即可,實(shí)現(xiàn)代碼如下。

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("服務(wù)器啟動(dòng)......");
  try{
   ss=new ServerSocket(4567);
   while(true){
    Socket s=ss.accept();
    new Thread(new PlayThread(s)).start();//啟動(dòng)線程
   }
  }catch (Exception e){
   e.printStackTrace();
  }finally {
   try{
    ss.close();
   }catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

最后,客戶端的作用就是從控制臺(tái)獲取用戶輸入的選擇,然后,將用戶輸入的值傳遞給服務(wù)器,再?gòu)姆?wù)器中獲取反饋的結(jié)果輸出到控制臺(tái)上即可??蛻舳说拇a如下。

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("歡迎來(lái)到猜拳游戲");
    System.out.println("請(qǐng)選擇:");
    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("游戲結(jié)束!");
     break;
    }else{
     System.out.println("輸入錯(cuò)誤,請(qǐng)重新輸入");
    }
    int rs=dis.readInt();//獲取判斷結(jié)果 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();
   }
  }
 }
}

至此,基本的猜拳游戲程序就編程完成了。有興趣的小伙伴還可以在其中加入猜拳輸贏的次數(shù)統(tǒng)計(jì)等功能。在運(yùn)行上面的程序時(shí),服務(wù)器端會(huì)一直處于運(yùn)行的狀態(tài),等待客戶端的連接。當(dāng)有客戶端退出時(shí),會(huì)在服務(wù)器端的控制臺(tái)上打印“客戶端退出”。

客戶端的運(yùn)行效果如下。

如有錯(cuò)誤,請(qǐng)各位給予指正。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實(shí)現(xiàn)的簡(jiǎn)單猜數(shù)字游戲代碼

    java實(shí)現(xiàn)的簡(jiǎn)單猜數(shù)字游戲代碼

    這篇文章主要介紹了java實(shí)現(xiàn)的簡(jiǎn)單猜數(shù)字游戲代碼,通過(guò)隨機(jī)數(shù)與邏輯判斷來(lái)實(shí)現(xiàn)游戲功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • Java正則表達(dá)式,提取雙引號(hào)中間的部分方法

    Java正則表達(dá)式,提取雙引號(hào)中間的部分方法

    今天小編就為大家分享一篇Java正則表達(dá)式,提取雙引號(hào)中間的部分方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解Java的回調(diào)機(jī)制

    詳解Java的回調(diào)機(jī)制

    最近學(xué)習(xí)java,接觸到了回調(diào)機(jī)制(CallBack)。初識(shí)時(shí)感覺(jué)比較混亂,而且在網(wǎng)上搜索到的相關(guān)的講解,本文介紹了Java的回調(diào)機(jī)制,有興趣的同學(xué)可以了解一下
    2016-10-10
  • Springboot加載所有Bean之后運(yùn)行方式

    Springboot加載所有Bean之后運(yùn)行方式

    這篇文章主要介紹了Springboot加載所有Bean之后運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot配置攔截器方式實(shí)例代碼

    SpringBoot配置攔截器方式實(shí)例代碼

    在本篇文章里小編給大家分享的是關(guān)于SpringBoot配置攔截器方式實(shí)例代碼,有需要的朋友們可以參考下。
    2020-04-04
  • RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的兩種方式詳解

    RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的兩種方式詳解

    很多場(chǎng)景下我們都需要延遲隊(duì)列。這篇文章主要以RabbitMQ為例來(lái)和大家聊一聊延遲隊(duì)列的玩法。文中的代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的同學(xué)可以了解一下
    2021-12-12
  • 關(guān)于Java中的CAS如何使用

    關(guān)于Java中的CAS如何使用

    這篇文章主要介紹了關(guān)于Java中的CAS如何使用,CAS是Compare And Swap(比較并交換)的縮寫,是一種非阻塞式并發(fā)控制技術(shù),用于保證多個(gè)線程在修改同一個(gè)共享資源時(shí)不會(huì)出現(xiàn)競(jìng)爭(zhēng)條件,從而避免了傳統(tǒng)鎖機(jī)制的各種問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • JAVA 添加、修改和刪除PDF書簽的示例代碼

    JAVA 添加、修改和刪除PDF書簽的示例代碼

    這篇文章主要介紹了JAVA 添加、修改和刪除PDF書簽的示例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Java 邏輯控制詳解分析

    Java 邏輯控制詳解分析

    在程序開(kāi)發(fā)的過(guò)程之中一共會(huì)存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對(duì)于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行
    2021-11-11
  • java基礎(chǔ)之方法詳解

    java基礎(chǔ)之方法詳解

    這篇文章主要介紹了java基礎(chǔ)之方法詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-07-07

最新評(píng)論