0-设计思路:

  你画我猜顾名思义,有一个人画,一个人猜,两个思路:

  1)一个中央服务器,中转数据,两个client端:,a画对应点的数据通过服务器发给客户端b,b通过这些数据进行绘画,换颜色人,等等,这种东西可以通过类似处理命令的方式用正则提取参数;

  2)两个用户一个做服务端,一个做客户端,直接通信,a发送数据给b,然后b通过数据进行绘画;

1-技术准备:

  1)用Java做绘图,详细方法请参见上一篇博客;

  2)用java做socket字符窜传输;

  3)正则表达式;自己了解一下

2-具体实现:

  设计一个用于绘图的画板功能,1)可以控制画板是否可以编辑(只有画的一端可以编辑),2)可以实现绘图功能,3)内部实现socket的发送

  代码如下:

package socket;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.*;
import java.net.Socket; import javax.swing.JFrame; public class DrawPanel extends Canvas{
Bean lastbean=null;
boolean startdraw=false;
Socket client=null;
BufferedReader is =null;//input from client
PrintWriter os=null;
public void setClient(Socket s) {
this.client=s;
try {
is = new BufferedReader(new InputStreamReader(client.getInputStream()));
os=new PrintWriter(client.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public DrawPanel(Boolean candraw) {
DrawPanel that=this;
MouseMotionListener mml=new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
int x=e.getX();
int y=e.getY();
if(that.client!=null) {
os.println(""+x+","+y);
os.flush();
}
that.draw(x, y);;
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
} };
this.setPreferredSize(new Dimension(300,300));
if(candraw) {
this.addMouseMotionListener(mml);
} }
public void draw(int x,int y) {
this.lastbean=new Bean(x,y);
this.repaint();
}
public void paint(java.awt.Graphics g) {
}
public void update(java.awt.Graphics g) {
//g.clearRect(0, 0, 300, 300);
/*if(list.isEmpty()) {
}else{*/
int x=this.lastbean.getX()-4;
int y=this.lastbean.getY()-4;
System.out.println("-----------------");
g.setColor(Color.black);
g.fillOval(x, y, 8, 8);
//} }
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame j=new JFrame();
j.add(new DrawPanel(true));
j.pack();
j.setVisible(true);
j.setResizable(false);
} }

  设计一个数据bean其实可有可无,起到一个封装数据的作用,编译传输;代码如下:

package socket;

public class Bean {
private int x;
private int y;
public Bean() { }
public Bean(int x,int y) {
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
} }

设计server端,在此我用的是画的人做server端)server端的画板是可编辑的:

代码如下:

package socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; import javax.swing.JFrame;
public class Server{
DrawPanel dp=new DrawPanel(true);
public Server() {
boolean listenSuccess=false;
int nowport=6000;
ServerSocket server=null;
Socket client=null;
while(!listenSuccess) {
try {
System.out.println("listensing on port:"+nowport);
server=new ServerSocket(nowport);
System.out.println("I'm success listening on port ---->"+nowport);
listenSuccess=true;
} catch (IOException e) {
System.out.println("filed listensing on port:"+nowport);
nowport++;
}
}
try {
client=server.accept();//先实验一次坚挺
dp.setClient(client);
JFrame j=new JFrame();
j.add(dp);
j.pack();
j.setVisible(true);
j.setResizable(false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] a) {
new Server();
}
}

最后是clent端:

package socket;

import java.io.IOException;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.swing.JFrame; public class Client {
DrawPanel dp=new DrawPanel(false);
Socket client=null;
public Client() {
String pattern="([0-9]*),([0-9]*)";//[\\u4e00-\\u9fa5]*
Pattern r = Pattern.compile(pattern);
try {
client=new Socket("127.0.0.1",6000);
JFrame j=new JFrame();
j.add(dp);
j.pack();
j.setVisible(true);
j.setResizable(false);
PrintWriter os=new PrintWriter(client.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));//由client对象构造一个输入流
while(true) {
String s=is.readLine();
Matcher m = r.matcher(s);
if(m.find()) {
System.out.println("0"+m.group(0));
System.out.println("1"+m.group(1));
System.out.println("2"+m.group(2));
int x=Integer.parseInt(m.group(1));
int y=Integer.parseInt(m.group(2));
dp.draw(x, y); } }
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
public static void main(String[] a) {
new Client();
}
}

OK,最后演示一下结果吧;

很简陋对不对,因为篇幅有限,所以就先做到这里上面提供了优化的思路,看完代码自己优化一下吧!!!!

java 你画我猜 了解一下的更多相关文章

  1. Node学习笔记(三):基于socket.io web版你画我猜(一)

    经过惨淡的面试,也是知道了自己的不足,刚好最近在学习node,心中便有了做一个web版的你画我猜的想法 首先说下思路,在做准备工作的时候,有两个大概的思路: 1.规定一块div,捕捉鼠标事件,动态生成 ...

  2. Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

    Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...

  3. Java编写画图板程序细节-保存已画图形

    没有Java编写画图板程序细节-保存已画图形   一.为何我们要保存画图板上已画图形呢? 有很多人会问,为什么我们一定要保存画图板上已经画好了的图形呢?原因很简单.当我们在画图板上画完自己想画的图形后 ...

  4. Java实现画八卦

    八卦是由多个圆叠加而成,如果我们让每个圆都有自己的颜色,那么具体结构便一目了然,如下图所示: 显然只要令对应的圆颜色相同,就能达到我们预期的效果. 用Java就能轻松画出来: import java. ...

  5. java GUI画满天星

    import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon ...

  6. 用JAVA自己画一张二维码

    我们都知道,最近2年移动支付在中国堪称新四大发明之一. 二维码无处不在,特别是最近的支付宝扫码领红包,微信,qq,到处在发,阿里有点攻占腾讯移动支付市场的势头啊~博主忽然就对二维码是怎么画的有了点好奇 ...

  7. java动态画圈圈。运用多线程,绘图

    总结:只是意外的收获吧.之前一篇是老师教的,一个点,从底层开始升起,到鼠标按下的地方开始画圈圈, 现在改变了一下,因为点上升的一个循环和画圈的循环是分开的 现在让点点自己跑,并且边跑边画圈.而且在fo ...

  8. [Java画图]画函数图像

    利用Graphics类画任意显式函数图像,只需修改代码中的F()函数即可,另外调整timesx和timesy参数来分方向放大或缩小图像.需要重定义坐标系. package test; import j ...

  9. Node学习笔记(三):基于socket.io web版你画我猜(二)

    上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...

随机推荐

  1. 关于visual studio的一些日常总结

    一.常用的VS快捷键 批量注释:ctrl + k ctrl + c 批量解除注释:ctrl + k ctrl + u 转到声明:ctrl + F12 查找:ctrl + F 添加断点:F9 逐过程调试 ...

  2. 多线程之 Thread类

    一.多线程第一种方式的实现步骤(继承Thread类) 代码演示: 1.定义MyThread类,继承Thread类 2.重写了里面的run方法,在run方法中定义线程要执行的任务 public clas ...

  3. 20145338 《网络对抗》 MSF基础应用

    20145338<网络对抗> MSF基础应用 实验内容 ·掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路. 具体需要完成(1)一个主动攻击;(2)一个针对浏览器的攻击 ...

  4. jenkins+svn完整打包并上传到linux服务器上

    因为公司用的是svn版本管理工具并且部署在了windows服务器上,所以测试环使用jenkins需要部署两套环境, 一套是在本地windows服务器,jenkins从svn下载代码完成打包并上传到li ...

  5. Properties类

    简介: Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...

  6. hdu4044

    题意:给你一颗树有n个节点,树的根节点为1,表示为敌人的基地,其他叶子节点为你的基地,你一开始有m元,给你每个节点可以建造的塔的数量和塔的价格和可以照成的伤害,每个节点至多建立一座塔.敌人的基地每次会 ...

  7. 策略模式(Strategy Model)

    定义:一个类的行为或算法能在运行时被改变,将一组算法封装成一系列对象,通过这些对象灵活改变系统功能: 实现方式: 首先定义个strategy接口,然后创建一系列对象(strategy objects) ...

  8. 安装SSD

    前面两篇文章讲了用SSD检测框架训练自己的数据集,这篇补充一下SSD的安装.github链接:https://github.com/weiliu89/caffe/tree/ssdSSD是16年ECCV ...

  9. 分页(pagination)样式表

    ul { list-style: none; padding:; margin:; } .pagination{ display:inline-block; padding-left:; border ...

  10. Linux常用命令之Yum

    Linux Yum命令详解Yum全称Yellow dog Updater,Modified,是一个在Fedora和RedHat以及SUSE中提供的基于RPM包的软件包管理工具,能够从指定的服务器自动下 ...