zoukankan      html  css  js  c++  java
  • Java network programmingguessing game

    猜数字游戏

    游戏的规则如下:

    当客户端第一次连接到服务器端时,服务器端生产一个【0,50】之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入”quit”时结束程序。
    为了实现这个游戏,我写了三个类,客户端,服务器端以及一个实现多客户端的线程类。

    该程序是以前学习 Java 网络编程时所写(写于2013年5月),还有很多地方有待完善,可以参考牛人的文章

    客户端类

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.io.InputStreamReader;
    5. import java.io.OutputStream;
    6. import java.net.Socket;
    7. public class TCPGameClient
    8. {
    9. static BufferedReader br = null;
    10. static Socket socket = null;
    11. static InputStream is = null;
    12. static OutputStream os = null;
    13. final static String HOST = "localhost";
    14. final static int PORT = 10008;
    15. public final static String EQUALS = "E" ;
    16. public final static String GREATER = "G";
    17. public final static String LESSER = "L";
    18. public final static String NEXT = "NEXT";
    19. public static void main(String[] args) throws Exception
    20. {
    21. //初始化socket,输入输出流
    22. init();
    23. System.out.println("The Game Begain!");
    24. byte[] bufResult = new byte[10];
    25. while(true)
    26. {
    27. //获取server产生的随机数
    28. String strDate = new String(receive());
    29. System.out.println("Please enter your guess:(If you want to end,input quit)");
    30. //从控制板获取输入字符
    31. String str = br.readLine();
    32. if(isQuit(str))
    33. {
    34. System.out.println("Bye!");
    35. break;
    36. }
    37. //client端控制猜谜次数
    38. int count = 5;
    39. while(count > 0)
    40. {
    41. //向 server端发送client 猜的数字
    42. send(str.getBytes());
    43. //接收来自server的对比后的反馈
    44. bufResult = receive();
    45. String result = new String(bufResult);
    46. if(EQUALS.equalsIgnoreCase(result))
    47. {
    48. System.out.println("Congratulations! You are rgiht.");
    49. send(NEXT.getBytes());
    50. break;
    51. } else if(GREATER.equalsIgnoreCase(result))
    52. {
    53. count --;
    54. System.out.println("Greater!");
    55. System.out.println("You have " + count + " chances left.");
    56. } else if(LESSER.equalsIgnoreCase(result))
    57. {
    58. count --;
    59. System.out.println("Lesser!");
    60. System.out.println("You have " + count + " chances left.");
    61. } else{;}
    62. //猜谜次数未到?继续
    63. if(count > 0)
    64. {
    65. System.out.println("Please enter your guess:");
    66. str = br.readLine();
    67. }
    68. //猜谜次数已到,还没猜出?打印谜底,同时告诉server开始下一轮猜谜游戏
    69. if(count == 0)
    70. {
    71. System.out.println("The right answer is: " + strDate);
    72. send(NEXT.getBytes());
    73. }
    74. }
    75. }
    76. close();
    77. }
    78. private static void init() throws IOException
    79. {
    80. br = new BufferedReader(new InputStreamReader(System.in));
    81. socket = new Socket(HOST, PORT);
    82. is = socket.getInputStream();
    83. os = socket.getOutputStream();
    84. }
    85. private static byte[] receive() throws IOException
    86. {
    87. byte[] buf = new byte[10];
    88. int len = is.read(buf);
    89. byte[] receiveData = new byte[len];
    90. System.arraycopy(buf, 0, receiveData, 0, len);
    91. return receiveData;
    92. }
    93. private static void send(byte[] b) throws IOException
    94. {
    95. os.write(b);
    96. }
    97. private static boolean isQuit(String str)
    98. {
    99. boolean flag = false;
    100. if(null == str)
    101. flag = false;
    102. else
    103. {
    104. if("quit".equalsIgnoreCase(str))
    105. {
    106. flag = true;
    107. }
    108. else
    109. {
    110. flag = false;
    111. }
    112. }
    113. return flag;
    114. }
    115. private static void close() throws Exception
    116. {
    117. socket.close();
    118. is.close();
    119. os.close();
    120. }
    121. }

    服务器类

    1. import java.io.IOException;
    2. import java.net.ServerSocket;
    3. import java.net.Socket;
    4. public class TCPGameServer
    5. {
    6. static ServerSocket serverSocket = null;
    7. final static int PORT = 10008;
    8. public static void main(String[] args) throws IOException
    9. {
    10. try
    11. {
    12. //初始化ServerSocke,开始监听
    13. serverSocket = new ServerSocket(PORT);
    14. System.out.println("The Server started.");
    15. while(true)
    16. {
    17. Socket socket = serverSocket.accept();
    18. new TCPGameThread(socket).start();
    19. }
    20. }
    21. catch (Exception e)
    22. {
    23. e.printStackTrace();
    24. }
    25. serverSocket.close();
    26. }
    27. }

    线程类

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.io.OutputStream;
    4. import java.net.Socket;
    5. import java.util.Random;
    6. public class TCPGameThread extends Thread
    7. {
    8. Socket socket = null;
    9. InputStream is = null;
    10. OutputStream os = null;
    11. public final static String EQUALS = "E" ;
    12. public final static String GREATER = "G";
    13. public final static String LESSER = "L";
    14. public final static String NEXT = "NEXT";
    15. public TCPGameThread(Socket socket) throws IOException
    16. {
    17. this.socket = socket;
    18. is = this.socket.getInputStream();
    19. os = this.socket.getOutputStream();
    20. }
    21. @Override
    22. public void run()
    23. {
    24. try
    25. {
    26. while(true)
    27. {
    28. //产生一个在[0,50]之间的随机数
    29. int randomData = -1;
    30. randomData = createRandom(0, 50);
    31. String str = String.valueOf(randomData);
    32. System.out.println("random data: " + randomData);
    33. try
    34. {
    35. //将该随机数发送给client端
    36. send(str.getBytes());
    37. }catch(Exception e){
    38. break;
    39. }
    40. while(true)
    41. {
    42. try
    43. {
    44. //接收来自client端的猜数
    45. byte[] b = receive();
    46. String strReceive = new String(b, 0, b.length);
    47. System.out.println("strReceive: " + strReceive);
    48. if(isNext(strReceive))break;
    49. //比较谜底和猜数之间的关系并反馈比较结果
    50. String checkResult = checkClientData(randomData, strReceive);
    51. send(checkResult.getBytes());
    52. }
    53. catch (IOException e)
    54. {
    55. break;
    56. }
    57. }
    58. }
    59. }
    60. catch (Exception e)
    61. {
    62. try
    63. {
    64. close();
    65. }
    66. catch (Exception e1)
    67. {
    68. // TODO Auto-generated catch block
    69. e1.printStackTrace();
    70. }
    71. }
    72. }
    73. private byte[] receive() throws IOException
    74. {
    75. byte[] buf = new byte[10];
    76. int len = is.read(buf);
    77. byte[] receiveData = new byte[len];
    78. System.arraycopy(buf, 0, receiveData, 0, len);
    79. return receiveData;
    80. }
    81. private void send(byte[] b) throws IOException
    82. {
    83. os.write(b);
    84. }
    85. private int createRandom(int start, int end)
    86. {
    87. Random r = new Random();
    88. return r.nextInt(end - start + 1) + start;
    89. }
    90. private String checkClientData(int randomData, String data)
    91. {
    92. String checkResult = null;
    93. int buf = Integer.parseInt(data);
    94. if(buf == randomData)
    95. {checkResult = EQUALS;}
    96. else if(buf > randomData)
    97. {checkResult = GREATER;}
    98. else if(buf < randomData)
    99. {checkResult = LESSER;}
    100. else
    101. {;}
    102. return checkResult ;
    103. }
    104. private void close() throws Exception
    105. {
    106. socket.close();
    107. is.close();
    108. os.close();
    109. }
    110. private static boolean isNext(String str)
    111. {
    112. boolean flag = false;
    113. if(null == str)
    114. flag = false;
    115. else
    116. {
    117. if(NEXT.equalsIgnoreCase(str))
    118. {
    119. flag = true;
    120. }
    121. else
    122. {
    123. flag = false;
    124. }
    125. }
    126. return flag;
    127. }
    128. }




  • 相关阅读:
    fb 4.7英文版 显示行数
    《笨办法学Python》 第40课手记
    《笨办法学Python》 第39课手记
    《笨办法学Python》 第38课手记
    《笨办法学Python》 第37课手记
    《笨办法学Python》 第36课手记
    《笨办法学Python》 第35课手记
    《笨办法学Python》 第34课手记
    《笨办法学Python》 第33课手记
    Js获取当前日期时间及其它操作(转)
  • 原文地址:https://www.cnblogs.com/zeweiwu/p/4753266.html
Copyright © 2011-2022 走看看