java利用多线程和Socket实现猜拳游戏
作者:一只楚楚猫 发布时间:2022-10-03 08:03:30
标签:java,猜拳
本文实例为大家分享了利用多线程和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();
}
}
}
}
至此,基本的猜拳游戏程序就编程完成了。有兴趣的小伙伴还可以在其中加入猜拳输赢的次数统计等功能。在运行上面的程序时,服务器端会一直处于运行的状态,等待客户端的连接。当有客户端退出时,会在服务器端的控制台上打印“客户端退出”。
客户端的运行效果如下。
如有错误,请各位给予指正。
来源:https://blog.csdn.net/julac/article/details/108094329


猜你喜欢
- 本文实例为大家分享了Android检测手机多点触摸点数的具体代码,供大家参考,具体内容如下多点触摸点数效果图Circle.javapacka
- 【题目】 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中
- 解压的工具类package com.example.videodemo.zip; public class ZipProgressUtil
- 序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(
- (一)单线程递归方式package com.taobao.test;import java.io.File;public class Tot
- 本文实例讲述了spring AOP定义AfterThrowing增加处理。分享给大家供大家参考,具体如下:一 配置<?xml vers
- C# 连接海康威视/// <summary> /// 海康威视SDK ///
- 本文实例为大家分享了Android仿QQ讨论组头像展示的具体代码,供大家参考,具体内容如下一、效果图二、实现基本实现过程:1.将原图片读取为
- 下面我给各位朋友整理了一篇C# 获取图片文件扩展名的例子,这里方法都非常的简单,我们只用到了image.RawFormat.Guid就实现了
- 概述1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任
- 一. struts2读取进度原理分析(作为草稿存了好久,刚刚发布出来......)1.在strut2中控制文件上传信息的类是实现MultiP
- 当需要重绘TabControl的背景颜色时,有两种方法。方法一网上有很多文章介绍,将tabControl的DrawMode属性设为Owner
- 一、讲个事故接口安全老生常谈了过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的
- 本文实例讲述了C#实现简单获取及设置Session类。分享给大家供大家参考。具体分析如下:这是一个简单的C#获取Session、设置Sess
- 一、Steam的优势java8中Stream配合Lambda表达式极大提高了编程效率,代码简洁易懂(可能刚接触的人会觉得晦涩难懂),不需要写
- Spring整合mybatis注解扫描是否成功IDEA spring整合mybatis会使用注解扫描的配置<context:compo
- 序列化一般应用与以下场景之中:1.永久性保存对象,把对象通过序列化字节流保存到本地文件中;2.通过序列化在网络中传输对象3.通过序列化在进程
- 一、代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机
- 本文实例为大家分享了Java实现打字游戏的具体代码,供大家参考,具体内容如下新建一个项目,然后在src里面建一个MyGame.java文件,
- 看到这个标题,相信不少人会感到疑惑,回忆你们自己的场景会发现,在Spring的项目中很少有使用多线程处理任务的,没错,大多数时候我们都是使用