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

版权声明:您好,欢迎来到我的技术博客。 https://blog.csdn.net/zwyjg/article/details/8944595

这是本人写的四人斗地主

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

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);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(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 block
				e1.printStackTrace();
			}
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(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 block
				e1.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];
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(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);
		//获得socket
		for(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 block
				e.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 block
				e.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相同
			// 则返回对应的key
			if (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();
	}
	@Override
	public synchronized void run() {
		// TODO Auto-generated method stub
		BufferedReader 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,而不用dsMap
					currUser.setDesk(desk);
					currUser.setSite(site);
					//添加game
					Server.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 block
			e.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();
		else
			return 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();
	}
}


 

猜你喜欢

转载自blog.csdn.net/zwyjg/article/details/8944595
今日推荐