java四人网络斗地主游戏《服务端》

来源:互联网 发布:王向远 知乎 编辑:程序博客网 时间:2024/06/10 04:08

这是本人写的四人斗地主

河南南阳地区的玩法,一副牌,没有大小王

Server

 

import javax.swing.*;import java.net.*;import java.io.*;import java.awt.event.*;import ds.*;public class Server extends JFrame implements ActionListener,Runnable{JPanel jp;JTextArea jta;JScrollPane jsp;JButton jb;ServerSocket ss;static DsMap<Socket,User> dsMap=new DsMap<Socket,User>();static Game game[][]=new Game[20][4];public static void main(String[] args) {new Server();}public Server(){for(int i=0;i<20;i++){for(int j=0;j<4;j++){game[i][j]=new Game();}}jp=new JPanel();jta=new JTextArea();jsp=new JScrollPane(jta);jb=new JButton("启动服务器");jb.addActionListener(this);jp.add(jb);this.add(jp,"North");this.add(jsp);this.setTitle("服务器");this.setSize(323, 200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==jb){try {ss=new ServerSocket(5555);jta.append("服务器启动成功"+"\r\n");Thread t=new Thread(this);t.start();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {Socket s=ss.accept();jta.append("存在客户连接"+"\r\n");ServerThread st=new ServerThread(s);Thread t=new Thread(st);t.start();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}}


DealThread

import ds.*;import java.util.*;import java.io.*;public class DealThread implements Runnable{LinkedList<Poke> llPoke=new LinkedList<Poke>();PrintStream ps[]=new PrintStream[4];@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0;i<13;i++){for(int j=0;j<4;j++){Poke poke=new Poke(i,j);llPoke.push(poke);}}Collections.shuffle(llPoke);//获得socketfor(int i=0;i<4;i++){try {ps[i] = new PrintStream(Server.game[ServerThread.currUser.getDesk()-1][i].getS().getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Poke flagPoke=new Poke(0,0);String str="底牌"+"拆";for(int i=0;i<4;i++){Poke p=llPoke.removeLast();if(p.equals(flagPoke)){flagPoke=new Poke(0,flagPoke.getPokeColor()+1); System.out.println(flagPoke +"    flagPokeeeeee1");}str+=p+"拆";}str+="底牌";//记录 控制牌发给谁了int flag = -1;//发牌for(int i=0;i<4;i++){ps[i].println(str);}//发牌for(int i=0;i<12;i++){for(int j=0;j<4;j++){Poke p = llPoke.removeFirst();if(p.equals(flagPoke)){flag=j;}ps[j].println("发牌"+"拆"+p+"拆"+"发牌");}try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//叫地主for(int i=0;i<4;i++){ps[i].println("叫地主"+"拆"+(flag+1)+"拆"+"叫地主");}}}


DsMap<K ,V>

import java.util.*;public class DsMap<K ,V> extends HashMap<K ,V>{//通过value值删除key对public void removeByValue(Object value) {for (Object key : keySet()){if (get(key).equals(value)&& get(key).hashCode() == value.hashCode()){remove(key);break;}}}// 获取所有value组成的Set集合public Set<V> valueSet() {Set<V> result = new HashSet<V>();// 遍历所有key组成的集合for (K key : keySet()){// 将每个key对应的value添加到result集合中result.add(get(key));}return result;}// 根据value查找key。public K getKeyByValue(V val) {// 遍历所有key组成的集合for (K key : keySet()){// 如果指定key对应的value与被搜索的value相同// 则返回对应的keyif (get(key).equals(val) && get(key).hashCode() == val.hashCode()){return key;}}return null;}// 重写HashMap的put方法,该方法不允许value重复public V put(K key,V value){// 遍历所有value组成的集合for (V val : valueSet() ){// 如果指定value与试图放入集合的value相同// 则抛出一个RuntimeException异常if (val.equals(value) && val.hashCode() == value.hashCode()){throw new RuntimeException("DsMap实例中不允许有重复value!"); }}return super.put(key , value);}public boolean containsValue(Object obj){for (V val : valueSet() ){if (val.hashCode() == obj.hashCode()){return true;}}return false;}}


ServerThread

import java.net.*;import java.io.*;import ds.*;public class ServerThread implements Runnable{Socket s;static User currUser;boolean tuiChu=true;public ServerThread(Socket s){this.s=s;currUser =new User();}@Overridepublic synchronized void run() {// TODO Auto-generated method stubBufferedReader br=null;PrintStream ps=null;try {br=new BufferedReader(new InputStreamReader(s.getInputStream()));ps=new PrintStream(s.getOutputStream());String info=null;while(tuiChu){while((info=br.readLine())==null);if(info.startsWith("登陆")&&info.endsWith("登陆")){String arr[]=info.split("拆");String userName=arr[1];if(!Server.dsMap.containsValue(new User(userName))){currUser.setUserName(userName);ps.println("登陆成功");//广播for(Socket ss:Server.dsMap.keySet()){ps=new PrintStream(ss.getOutputStream());ps.println("广播"+"拆"+userName+"拆"+"广播");}//所有for(User uu:Server.dsMap.valueSet()){ps=new PrintStream(s.getOutputStream());ps.println("所有"+"拆"+uu.getUserName()+"拆"+uu.getDesk()+"拆"+uu.getSite()+"拆"+"所有");}//添加Server.dsMap.put(s, currUser);}else{ps.println("姓名重复");}}else if(info.startsWith("坐下")&&info.endsWith("坐下")){String arr[]=info.split("拆");int desk=Integer.parseInt(arr[2]);int site=Integer.parseInt(arr[3]);//这直接和客户端连接,所以直接用currUser,而不用dsMapcurrUser.setDesk(desk);currUser.setSite(site);//添加gameServer.game[desk-1][site-1]=new Game(arr[1],s);//转发for(Socket ss:Server.dsMap.keySet()){if(ss!=s){ps=new PrintStream(ss.getOutputStream());ps.println(info);}}//转发其他准备的for(int i=0;i<4;i++){if(Server.game[desk-1][i].isReady()&&i!=(site-1)){ps=new PrintStream(s.getOutputStream());ps.println("准备" + "拆"+ Server.game[desk - 1][i].getUserName()+ "拆" + "准备");}}}else if(info.startsWith("准备")&&info.endsWith("准备")){String arr[]=info.split("拆");String userName=arr[1];int desk=Integer.parseInt(arr[2]);int site=Integer.parseInt(arr[3]);Server.game[desk-1][site-1].setReady(true);//转发for(int i=0;i<4;i++){//表示该位置上有人了,应该转发给他if(Server.game[desk-1][i].getS() != null){Socket ss=Server.game[desk-1][i].getS();ps=new PrintStream(ss.getOutputStream());ps.println(info);}}//是否都是准备boolean allReady=true;for(int i=0;i<4;i++){if(!Server.game[desk-1][i].isReady()){allReady=false;break;}}if(allReady){//广播开始for(int i=0;i<4;i++){Socket ss=Server.game[desk-1][i].getS();ps=new PrintStream(ss.getOutputStream());ps.println("开始" + "开始");}//启动发牌线程DealThread dt=new DealThread();Thread t=new Thread(dt);t.start();}}else if(info.startsWith("游戏开始")&&info.endsWith("游戏开始")){String arr[]=info.split("拆");String usrName=arr[1];int site=Integer.parseInt(arr[2]);for (int i = 0; i < 4; i++) {Socket ss = Server.game[currUser.getDesk()-1][i].getS();ps = new PrintStream(ss.getOutputStream());ps.println(info);}}else if(info.startsWith("重新发牌")&&info.endsWith("重新发牌")){//广播开始for(int i=0;i<4;i++){Socket ss=Server.game[currUser.getDesk()-1][i].getS();ps=new PrintStream(ss.getOutputStream());ps.println("开始" + "开始");}//启动发牌线程//new DealThread(Server.game[currUser.getDesk() - 1]).start();DealThread dt=new DealThread();Thread t=new Thread(dt);t.start();}else if(info.startsWith("不叫")&&info.endsWith("不叫")){String arr[]=info.split("拆");String usrName=arr[1];int site=Integer.parseInt(arr[2]);if(site+1==5){site=1;}else{site+=1;}for (int i = 0; i < 4; i++) {Socket ss = Server.game[currUser.getDesk()-1][i].getS();ps = new PrintStream(ss.getOutputStream());ps.println("不叫"+"拆"+site+"拆"+"不叫");}} else if (info.startsWith("出牌") && info.endsWith("出牌")|| (info.startsWith("不出") && info.endsWith("不出"))|| (info.startsWith("最大") && info.endsWith("最大"))) {for (int i = 0; i < 4; i++){Socket ss = Server.game[currUser.getDesk()-1][i].getS();//向其他人转发//if(i != (currUser.getSite() - 1)){if(ss!=s){ps =new PrintStream (ss.getOutputStream());ps.println(info);}}}else if((info.startsWith("游戏结束")&& info.endsWith("游戏结束"))){int deskNum = currUser.getDesk();for (int i = 0; i < 4; i++){//向所有人通知游戲結束的消息,包括自己ps =new PrintStream (Server.game[deskNum - 1][i].getS().getOutputStream());ps.println(info);//同时修改对应的准备消息Server.game[deskNum - 1][i].setReady(false);}}else if((info.startsWith("退出")&& info.endsWith("退出"))){String[] arr = info.split("拆");int deskNum = Integer.parseInt(arr[1]);int site = Integer.parseInt(arr[2]);Server.game[deskNum - 1][site - 1] = new Game();//同时修改同桌人的状态for (int i= 0;i <4 ;i++ ){Server.game[deskNum - 1][i].setReady(false);Server.game[deskNum - 1][i].setStart(false);}//修改用户在服务器端的消息User uu = Server.dsMap.get(s);uu.setUserName("");uu.setDesk(0);uu.setSite(0);//同时转发给其他人for (Socket  ss : Server.dsMap.keySet()){//不向自己转发if(ss != s){ps = new PrintStream(ss.getOutputStream());ps.println(info);}}//退出线程tuiChu=false;}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


以下放在ds包下

Game

package ds;import java.net.*;public class Game {String userName;Socket s;private boolean isStart;boolean isReady;public Game(){}public Game(String userName,Socket s){this.userName=userName;this.s=s;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Socket getS() {return s;}public void setS(Socket s) {this.s = s;}public boolean isReady() {return isReady;}public void setReady(boolean isReady) {this.isReady = isReady;}public boolean isStart() {return isStart;}public void setStart(boolean isStart) {this.isStart = isStart;}}


Poke

package ds;public class Poke {int pokeNum;int pokeColor;public Poke(){}public Poke(int pokeNum,int pokeColor){this.pokeColor=pokeColor;this.pokeNum=pokeNum;}public int getPokeNum() {return pokeNum;}public void setPokeNum(int pokeNum) {this.pokeNum = pokeNum;}public int getPokeColor() {return pokeColor;}public void setPokeColor(int pokeColor) {this.pokeColor = pokeColor;}public String toString(){return pokeNum+"分"+pokeColor;}public boolean equals(Object obj){if(obj == this)return true;if(obj != null && obj.getClass() == Poke.class){Poke poke = (Poke) obj;if(poke.getPokeNum() == pokeNum &&poke.getPokeColor() == pokeColor){return true;}}return false;}public int compareTo(Object obj){Poke p = (Poke)obj;if(pokeNum == p.getPokeNum() && pokeNum == 13)return pokeColor - p.getPokeColor();elsereturn pokeNum -  p.getPokeNum() ;}}


User

package ds;public class User {private String userName;private int desk;private int site;public User(){}public User(String userName){this.userName=userName;}public int getDesk() {return desk;}public void setDesk(int desk) {this.desk = desk;}public int getSite() {return site;}public void setSite(int site) {this.site = site;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public boolean equals(Object obj){if(obj == this)return true;if(obj instanceof User){User user = (User)obj;return userName.equals(user.userName);}else{return false;}}public int hashCode(){return userName.hashCode();}}


 

原创粉丝点击