最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

實例:猜拳游戲

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

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

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

上面的代碼實現(xiàn)了客戶端的輸入,并將判斷結果反饋給服務器的操作。服務器端直接調(diào)用該線程即可,實現(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("服務器啟動......");
  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();
   }
  }
 }
}

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

客戶端的運行效果如下。

如有錯誤,請各位給予指正。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java中綴表達式轉后綴表達式實現(xiàn)方法詳解

    Java中綴表達式轉后綴表達式實現(xiàn)方法詳解

    這篇文章主要介紹了Java中綴表達式轉后綴表達式實現(xiàn)方法,結合實例形式分析了Java中綴表達式轉換成后綴表達式的相關算法原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • Java中BigDecimal的基本運算(詳解)

    Java中BigDecimal的基本運算(詳解)

    下面小編就為大家?guī)硪黄狫ava中BigDecimal的基本運算(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 一篇文章帶你認識Java8接口的默認方法

    一篇文章帶你認識Java8接口的默認方法

    這篇文章主要給大家介紹了如何通過一篇文章帶你認識Java8接口的默認方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Struts2學習筆記(4)-通配符的使用

    Struts2學習筆記(4)-通配符的使用

    本文主要介紹Struts2中通配符的使用,簡單實用,希望能給大家做一個參考。
    2016-06-06
  • 從最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    從最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    本文會介紹從一個最基本的java工程,到Web工程,到集成Spring、SpringMVC、SpringDataJPA+Hibernate,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-05-05
  • 淺談Java中的LinkedHashSet哈希鏈表

    淺談Java中的LinkedHashSet哈希鏈表

    這篇文章主要介紹了淺談Java中的LinkedHashSet哈希鏈表,LinkedHashSet 是 Java 中的一個集合類,它是 HashSet 的子類,并實現(xiàn)了 Set 接口,與 HashSet 不同的是,LinkedHashSet 保留了元素插入的順序,并且具有 HashSet 的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • 淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時、持久、游離)

    淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時、持久、游離)

    下面小編就為大家?guī)硪黄獪\談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時、持久、游離)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    這篇文章主要介紹了SpringSecurity?用戶帳號已被鎖定,本文給大家分享問題原因及解決方式,需要的朋友可以參考下
    2023-12-12
  • jdbc連接oracle數(shù)據(jù)庫功能示例

    jdbc連接oracle數(shù)據(jù)庫功能示例

    這篇文章主要介紹了jdbc連接oracle數(shù)據(jù)庫功能,結合實例形式詳細分析了java基于jdbc連接Oracle數(shù)據(jù)庫的具體操作步驟與相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • list,set,map,數(shù)組之間的相互轉換詳細解析

    list,set,map,數(shù)組之間的相互轉換詳細解析

    以下是對Java中l(wèi)ist,set,map,數(shù)組之間的相互轉換進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09

最新評論

永登县| 敦煌市| 汪清县| 汤阴县| 巴楚县| 丰城市| 灌云县| 塔河县| 潞城市| 轮台县| 菏泽市| 武夷山市| 平原县| 新邵县| 钟祥市| 万宁市| 綦江县| 临猗县| 松滋市| 永春县| 赫章县| 紫云| 宁强县| 洱源县| 连江县| 绥江县| 进贤县| 罗定市| 太原市| 道孚县| 宜兰县| 修武县| 游戏| 铁岭县| 阿拉善左旗| 夏津县| 周口市| 确山县| 济阳县| 黔江区| 金川县|