版权声明:您好,欢迎来到我的技术博客。 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();
}
}