Java 网络斗地主

项目要求:
运用多线程知识构建一个多客户端的斗地主程序,斗地主功能完善,利用Socket实现客户端和服务器端的信息交互。

未完成 进展:
客户端:
MainJFrame类

public class MainFrame extends JFrame{public MyPanel myPanel;public String uname;public Socket socket;public SendThread sendThread;public MainFrame(String uname, Socket socket){this.uname = uname;this.socket = socket;//设置窗口属性this.setSize(1200,700);this.setVisible(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//添加MypanelmyPanel = new MyPanel();myPanel.setBounds(0,0,1200,700);this.add(myPanel);//启动发消息的线程sendThread = new SendThread(socket,uname);sendThread.start();}
}

MyPanel类

public class MyPanel extends JPanel {@Overrideprotected void paintComponent(Graphics g) {Image image = new ImageIcon("images/bg/bg1.png").getImage();g.drawImage(image,0,0,this.getWidth(),this.getHeight(),null);}
}

Login类

public class Login extends JFrame {private JLabel uanmeJLabel;private JTextField unameJTextField;private JButton btnJButton;public Login(){this.uanmeJLabel = new JLabel("登录名:");this.unameJTextField = new JTextField();this.btnJButton = new JButton("登录");this.setSize(500,200);this.setVisible(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setLayout(new GridLayout(1,3));this.add(uanmeJLabel);this.add(unameJTextField);this.add(btnJButton);//创建我们的监听器对象 绑定到按钮上MyEvent myEvent = new MyEvent();this.btnJButton.addActionListener(myEvent);}//创建事件监听器class MyEvent implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {//获取用户名String uname = unameJTextField.getText();//创建一个socket连接服务器try {Socket socket = new Socket("127.0.0.1",6666);//跳转到主窗口new MainFrame(uname,socket);} catch (IOException e1) {e1.printStackTrace();}}}
}

SendThread类

public class SendThread extends Thread {private Socket socket;private String msg;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Socket getSocket() {return socket;}public void setSocket(Socket socket) {this.socket = socket;}public SendThread(){}public SendThread(Socket socket){this.socket = socket;}public SendThread(Socket socket,String msg){this.socket = socket;this.msg = msg;}public void run(){//字节流//转换   数据流  数据的输入输出流可以写任何类型的数据DataOutputStream dataOutputStream ;try {dataOutputStream = new DataOutputStream(socket.getOutputStream());while (true) {//如果消息不为空if (msg != null) {//发送消息dataOutputStream.writeUTF(msg);//之后清空消息msg = null;}}} catch (IOException e) {e.printStackTrace();}//wirteUTF  写出UTF格式的字符串}
}

服务器端

MainJFrame类

public class MainFrame {//创建玩家列表public List<Player> players = new ArrayList<Player>();public int index = 0;//全部扑克的列表public List<Poker> allPokers = new ArrayList<Poker>();public MainFrame() {//创建扑克列表createPoker();try {//创建服务器端的SocketServerSocket serverSocket = new ServerSocket(6666);//需要一直接收加一个whilewhile (true) {//接收客户端的SocketSocket socket = serverSocket.accept();//开启线程,处理客户端的SocketAcceptThread acceptThread = new AcceptThread(socket);acceptThread.start();}} catch (IOException e) {e.printStackTrace();}}//创建一个内部线程class AcceptThread extends Thread{Socket socket;public AcceptThread(Socket socket){this.socket = socket;}public void run(){try {//和客户端对应也是用的数据流DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());while (true){String msg = dataInputStream.readUTF();//创建一个player对象Player player = new Player(index++,msg);player.setSocket(socket);players.add(player);System.out.println("这是客户端传来的消息:"+ msg + "上线了");System.out.println("上线人数:"+players.size());}} catch (IOException e) {e.printStackTrace();}}}//创建所有扑克public void createPoker(){}
}

poker类

//扑克类
public class Poker {private int id;//扑克idprivate String name;//扑克名称private int num;//扑克数量private boolean isOut;//是否打出public Poker() {}public Poker(int id, String name, int num) {this.id = id;this.name = name;this.num = num;}public boolean isOut() {return isOut;}public void setOut(boolean out) {isOut = out;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNamr() {return name;}public void setNamr(String name) {this.name = name;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}
}

player类

//玩家类
public class Player {private int id;//玩家idprivate String name;//玩家名称private Socket socket;//玩家对应的Socketprivate List<Poker> pokers = new ArrayList<>();//玩家的扑克public Player() {}public Player(int id) {this.id = id;}public Player(int id, String name) {this.id = id;this.name = name;}public Player(int id, String name, Socket socket, List<Poker> pokers) {this.id = id;this.name = name;this.socket = socket;this.pokers = pokers;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Socket getSocket() {return socket;}public void setSocket(Socket socket) {this.socket = socket;}public List<Poker> getPokers() {return pokers;}public void setPokers(List<Poker> pokers) {this.pokers = pokers;}
}

暂时效果:


写一个扑克标签类
PokerLabel
重写compareTo便于之后比较

//扑克标签类
public class PokerLabel extends JLabel implements Comparable{private int id;private String name;private int num;private boolean isOut;private boolean isUp;private boolean isSelected;  //是否选中public boolean isSelected() {return isSelected;}public void setSelected(boolean isSelected) {this.isSelected = isSelected;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public boolean isOut() {return isOut;}public void setOut(boolean isOut) {this.isOut = isOut;}public boolean isUp() {return isUp;}public void setUp(boolean isUp) {this.isUp = isUp;}public PokerLabel(){this.setSize(105, 150);}public PokerLabel(int id,String name,int num){this.id=id;this.name=name;this.num=num;this.setSize(105, 150);}public PokerLabel(int id,String name,int num,boolean isOut,boolean isUp){this.id=id;this.name=name;this.num=num;this.isOut=isOut;this.isUp=isUp;if(isUp)turnUp();else {turnDown();}this.setSize(105, 150);}public void turnUp(){this.setIcon(new ImageIcon("images/poker/"+id+".jpg"));}public void turnDown(){this.setIcon(new ImageIcon("images/poker/down.jpg"));}@Overridepublic int compareTo(Object arg0) {// TODO Auto-generated method stubPokerLabel pokerLabel=(PokerLabel)arg0;if(this.num<pokerLabel.num)return 2;else if(this.num>pokerLabel.num)return -2;elsereturn 0;}
}

写一个显示扑克的方法

 public void showAllPlayersInfo(List<Player> players) {// 1.显示三个玩家的名称// 2.显示当前玩家的扑克列表for (int i = 0; i < players.size(); i++) {if (players.get(i).getName().equals(uname)) {currentPlayer = players.get(i);}}List<Poker> pokers = currentPlayer.getPokers();for (int i = 0; i < pokers.size(); i++) {// 创建扑克标签Poker poker = pokers.get(i);PokerLabel pokerLabel = new PokerLabel(poker.getId(),poker.getName(), poker.getNum());pokerLabel.turnUp(); // 显示正面图// 添加到面板中this.myPanel.add(pokerLabel);this.pokerLabels.add(pokerLabel);// 动态的显示出来this.myPanel.setComponentZOrder(pokerLabel, 0);// 一张一张的显示出来GameUtil.move(pokerLabel, 300 + 30 * i, 450);}// 对扑克列表排序Collections.sort(pokerLabels);// 重新移动位置for (int i = 0; i < pokerLabels.size(); i++) {this.myPanel.setComponentZOrder(pokerLabels.get(i), 0);GameUtil.move(pokerLabels.get(i), 300 + 30 * i, 450);}//System.out.println(currentPlayer);}

捕捉点击事件

      //捕捉扑克点击事件public void addClickEventTopoker(){for (int i = 0; i < pokerLabels.size(); i++) {pokerLabels.get(i).addMouseListener(new PokerEvent());}}

点击事件

class PokerEvent implements MouseListener{@Overridepublic void mouseClicked(java.awt.event.MouseEvent e) {PokerLabel pokerLabel = (PokerLabel) e.getSource();if(pokerLabel.isSelected()){pokerLabel.setSelected(false);pokerLabel.setLocation(pokerLabel.getX(), pokerLabel.getY()+30);}else {pokerLabel.setSelected(true);pokerLabel.setLocation(pokerLabel.getX(), pokerLabel.getY()-30);}}@Overridepublic void mousePressed(java.awt.event.MouseEvent e) {}@Overridepublic void mouseReleased(java.awt.event.MouseEvent e) {}@Overridepublic void mouseEntered(java.awt.event.MouseEvent e) {}@Overridepublic void mouseExited(java.awt.event.MouseEvent e) {}
}


Java网络斗地主小程序相关推荐

  1. Java实现微信小程序校验图片是否含有违法违规内容

    文章目录 1.Java实现微信小程序校验图片是否含有违法违规内容(security.imgSecCheck) 2.接口文档简述 3.Java实现对接接口 4.压缩图片(Thumbnails) 5.整合 ...

  2. java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器

    java ee的小程序 Lightbend最近对2000多个JVM开发人员进行了一项调查,结果刚刚发布. 开展该调查的目的是发现:发展趋势与IT基础架构趋势之间的相关性,处于数字化转型前沿的组织如何使 ...

  3. java ee的小程序_Java EE调度程序

    java ee的小程序 Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库. Java EE 6和7完整配置文件上提供的Jav ...

  4. java ee的小程序_在Java EE应用程序中实现自动重试

    java ee的小程序 最初,我想将此博客称为" 具有拦截器驱动的重试策略的灵活超时 ",但后来我认为它太"繁重". 该声明以及修改后的标题应该(希望)使您了解 ...

  5. java ee的小程序_扩展Java EE应用程序的基础

    java ee的小程序 老实说,"可扩展性"是一个详尽的主题,并且通常没有被很好地理解. 通常,它被认为与高可用性相同. 我已经看到新手程序员和"经验丰富"的建 ...

  6. java ee的小程序_Java EE应用程序的单片到微服务重构

    java ee的小程序 您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么? 该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧. ...

  7. java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

    java ee的小程序 如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻. 谁决定将Java Day Tokyo置于今年的这个无聊的时间里,做得很好,并给了我一个写关于新的和即将到来的 ...

  8. java与微信小程序通讯_java与微信小程序实现websocket长连接

    本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...

  9. java中的基本小程序_12个用Java编写基础小程序经典案例(收藏篇)

    原标题:12个用Java编写基础小程序&经典案例(收藏篇) 如果是刚接触或者刚学习java,练习一些基础的算法还是必须的,可以提升思维和语法的使用. 1.输出两个int数中的最大值 impor ...

最新文章

  1. 销售人员26个致命弱点
  2. pandas.DataFrame.iloc的使用
  3. 每日程序C语言10-欧几里德算法
  4. Deeplab unexpected label
  5. 使用JShell的Java 9 Streams API
  6. jsp中forward与sendRedirect的区别
  7. 数字图像处理 直方图规定化 MATLAB实验
  8. Chrome 实现前端页面自动刷新
  9. thinkphp 表单令牌
  10. 简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态...
  11. curl以cookie的方式登录
  12. 中移杭研 | 面向互联网应用的实时业务风控系统
  13. 从微软重返诺基亚:Juha Alakarhu是何许人也?
  14. 可用的码支付系统源码
  15. python拆分excel列_python自动化办公:实现按照一列内容拆分excel
  16. 如何加水印在图片上面?
  17. tkmybatis 子查询_最全的真假童子命查询方法!不想被忽悠就看看
  18. 用计算机播放cd,电脑上怎么放光盘_播放CD的方法步骤
  19. C++模版与特化与偏特化
  20. 字体单位 html,CSS字体单位

热门文章

  1. python中matlab中xlabel数值_如何在matlab中的xlabel,ylabel,legend和text函数中使用latex...
  2. 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗
  3. EFM8烧录不进去的问题
  4. SD-WAN是面向分支机构的新兴、不断发展的解决方案
  5. BIM来了,结构工程师就不用画图了吧?
  6. 从零学Java(11)之算术运算符(加减乘除余、字符连接)
  7. win10蓝屏处理经验总结 终止代码:CRITICAL_PROCESS_DIED(已解决)
  8. java大师_著名的Java并发编程大师都这么说了,你还不知道伪共享么!
  9. 树状结构 | 北邮OJ | 109. 中序遍历树
  10. 什么是柔性制造?相比传统的生产有什么特点?