玩家类 Player.java
import java.util.ArrayList;
/**
* Created by zhuqiuhui on 2017/6/18.
*/
public class Player {
public int balance = 100; //玩家拥有的金币
public boolean bust = false; // 输了
public boolean black = false; //黑jack
public ArrayList<Integer> al = new ArrayList<Integer>(); //存放牌面
public int currentPoint = 0; //当前点数
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Player() {
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public boolean isBust() {
return bust;
}
public void setBust(boolean bust) {
this.bust = bust;
}
public boolean isBlack() {
return black;
}
public void setBlack(boolean black) {
this.black = black;
}
public ArrayList<Integer> getAl() {
return al;
}
public void setAl(ArrayList<Integer> al) {
this.al = al;
}
public int getCurrentPoint() {
return currentPoint;
}
public void setCurrentPoint(int currentPoint) {
this.currentPoint = currentPoint;
}
}
服务器:CardServer.java
import domain.Player;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by zhuqiuhui on 2017/6/20.
*/
public class CardServer {
List<ClientThread> clients = new ArrayList<ClientThread>();
private int[] pai = new int[52];
private String[] huase = {"黑", "红", "梅", "方"};
private String[] paiM = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
private int currentPage = 0;
private int playerNum = 1;
private String totoalStr = "";
private int totalmoney = 0;
public static void main(String[] args) {
new CardServer().start();
}
/**
* 启动服务器中...
*/
public void start() {
try {
boolean iConnect = false;
ServerSocket ss = new ServerSocket(1320);
iConnect = true;
totoalStr = packMsg(totoalStr, "服务器已经启动....\r\n");
sendClientMsg(totoalStr);
while (iConnect) {
Socket s = ss.accept();
totoalStr = packMsg(totoalStr, "玩家 " + playerNum + " 绑定服务器端口成功!\r\n");
sendClientMsg(totoalStr);
ClientThread currentClient = new ClientThread(s, "玩家 " + playerNum);//创建线程引用
clients.add(currentClient);//把当前客户端加入集合
totoalStr = packMsg(totoalStr, "玩家 " + playerNum + " 加入....\r\n");
sendClientMsg(totoalStr);
if (playerNum == 3) {
totoalStr = packMsg(totoalStr, "已经到达玩家上限,不再允许玩家进入游戏!\r\n");
sendClientMsg(totoalStr);
break;
}
++playerNum;
}
totoalStr = packMsg(totoalStr, "游戏开始,庄家开始洗牌....\r\n");
sendClientMsg(totoalStr);
xipai();// 洗牌
totoalStr = packMsg(totoalStr, "洗牌完毕,庄家开始发牌....\r\n");
sendClientMsg(totoalStr);
// 给玩家发牌、玩家下注、要牌
for (int i = 0; i < clients.size(); i++) {
// 发牌
String originalStr = new String(totoalStr);
ClientThread c = clients.get(i);
String fapai_res = fapai(c.getPlayer());
originalStr = packMsg(originalStr, fapai_res);
c.sendMsg(originalStr);
// 玩家下注
originalStr = packMsg(originalStr, "玩家下注....\r\n");
c.sendMsg(originalStr);
xiazhu(c.getPlayer());
// 要牌
originalStr = packMsg(originalStr, "请选择 A:要牌 B:双倍赌注 C:不要\r\n");
c.sendMsg(originalStr);
// 接收消息
String answer = c.recMsg();
if ("A".equals(answer)) {
originalStr = packMsg(originalStr, "玩家要牌:\r\n");
c.sendMsg(originalStr);
while (true) {
String cards = "";
for (Integer integer : c.getPlayer().getAl()) {
cards += xianshi(integer);
}
cards += " 当前点数是:" + c.getPlayer().getCurrentPoint() + "\r\n";
originalStr += cards;
c.sendMsg(originalStr);
if (c.getPlayer().getCurrentPoint() >= 21) {
originalStr = packMsg(originalStr, "您的点数已经超过21点了\r\n");
c.sendMsg(originalStr);
c.getPlayer().setCurrentPoint(0);
break;
}
originalStr = packMsg(originalStr, "是否要牌,Y or N ?\r\n");
c.sendMsg(originalStr);
String yesNo = c.recMsg();
if (yesNo.equalsIgnoreCase("N")) {
originalStr = packMsg(originalStr, "玩家不再要牌\r\n");
c.sendMsg(originalStr);
break;
} else {
c.getPlayer().getAl().add(pai[currentPage]);
c.getPlayer().setCurrentPoint(c.getPlayer().getCurrentPoint() + calPoint(pai[currentPage]));
currentPage++;
}
} // while
c.sendMsg(originalStr);
} else if ("B".equals(answer)) {
originalStr = packMsg(originalStr, "玩家选择下双倍赌注!\r\n");
c.sendMsg(originalStr);
double_bet(c.getPlayer());
} else if ("C".equals(answer)) {
originalStr = packMsg(originalStr, "玩家选择不要牌!\r\n");
c.sendMsg(originalStr);
} else {
originalStr = packMsg(originalStr, "玩家输入有误!\r\n");
c.sendMsg(originalStr);
}
}
// 计算总点数
String calRes = "计算牌的点数\r\n";
System.out.println("计算牌的点数....");
calRes += result(clients.get(0).getPlayer(), clients.get(1).getPlayer(), clients.get(2).getPlayer());
sendClientMsg(calRes);
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}
/**
* 客户端的进程
*/
class ClientThread implements Runnable {
private Socket s;
private DataInputStream dis;
private DataOutputStream dos;
private String str;
private boolean iConnect = false;
private Player player;
ClientThread(Socket s, String name) {
this.s = s;
iConnect = true;
this.player = new Player();
this.player.setName(name);
}
public String recMsg() {
try {
dis = new DataInputStream(s.getInputStream());
str = dis.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
public void run() {
// System.out.println("run方法启动了!");
// try {
//
// while (iConnect) {
// dis = new DataInputStream(s.getInputStream());
// str = dis.readUTF();
// System.out.println(str);
// for (int i = 0; i < clients.size(); i++) {
// System.out.println("转发消息中..." + i);
// ClientThread c = clients.get(i);
// c.sendMsg(str);
// }
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
}
/**
* 将送至服务器的消息发送给每个连接到的客户端
*/
public void sendMsg(String str) {
try {
dos = new DataOutputStream(this.s.getOutputStream());
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public Socket getS() {
return s;
}
public void setS(Socket s) {
this.s = s;
}
public DataInputStream getDis() {
return dis;
}
public void setDis(DataInputStream dis) {
this.dis = dis;
}
public DataOutputStream getDos() {
return dos;
}
public void setDos(DataOutputStream dos) {
this.dos = dos;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public boolean isiConnect() {
return iConnect;
}
public void setiConnect(boolean iConnect) {
this.iConnect = iConnect;
}
public Player getPlayer() {
return player;
}
public void setPlayer(Player player) {
this.player = player;
}
}
/**
* 依次给玩家发消息
*
* @param str
*/
private void sendClientMsg(String str) {
for (int i = 0; i < clients.size(); i++) {
ClientThread c = clients.get(i);
c.sendMsg(str);
}
}
private void xipai() {
for (int i = 0; i < 52; i++) {
pai[i] = i;
}
for (int j = 0; j < 26; j++) {
Random r = new Random();
int i1 = Math.abs(r.nextInt() % 52);
int i2 = Math.abs(r.nextInt() % 52);
int temp = pai[i2];
pai[i2] = pai[i1];
pai[i1] = temp;
}
}
/**
* 发牌
*/
private String fapai(Player player) {
int first = currentPage;
int second = currentPage + 1;
player.getAl().add(pai[first]);
player.getAl().add(pai[second]);
if ((calPoint(pai[first]) == 1 && calPoint(pai[second]) == 10) || (calPoint(pai[first])) == 10 && calPoint(pai[second]) == 1) {
player.setBlack(true);
player.setCurrentPoint(21);
} else {
player.setCurrentPoint(player.getCurrentPoint() + calPoint(pai[first]));
player.setCurrentPoint(player.getCurrentPoint() + calPoint(pai[second]));
}
currentPage += 2;
return "庄家发了:" + xianshi(pai[first]) + " 和 " + xianshi(pai[second]) + " \r\n" + "当前点数:" + String.valueOf(player.getCurrentPoint()) + "\r\n";
}
private int calPoint(int i) {
int temp = 0;
if (i % 13 + 1 > 10) {
temp = 10;
} else {
temp = (i + 1) % 13;
}
return temp;
}
/**
* 显示牌面的点数
*
* @param i
* @return
*/
private String xianshi(int i) {
return huase[i / 13] + " " + paiM[i % 13];
}
/**
* 下注,一次下20
*
* @param player
*/
private void xiazhu(Player player) {
player.setBalance(player.getBalance() - 20);
totalmoney += 20;
}
/**
* 下双倍赌注,一次下40
*
* @param p
*/
private void double_bet(Player p) {
p.setBalance(p.getBalance() - 40);
totalmoney = totalmoney + 40;
}
/**
* 计算三位玩家的结果
*
* @param p1
* @param p2
* @param p3
*/
private String result(Player p1, Player p2, Player p3) {
String res = "";
if (p1.isBlack()) {
p1.setBalance(p1.getBalance() + totalmoney);
res += p1.getName() + " win!\r\n";
} else if (p2.isBlack() && p3.isBlack()) {
p2.setBalance(p2.getBalance() + totalmoney / 2);
p3.setBalance(p3.getBalance() + totalmoney / 2);
res += p2.getName() + " and " + p3.getName() + " win!\r\n";
} else if (p2.isBlack()) {
p2.setBalance(p2.getBalance() + totalmoney);
res += p2.getName() + " win!\r\n";
} else if (p3.isBlack()) {
p3.setBalance(p3.getBalance() + totalmoney);
res += p3.getName() + " win!\r\n";
} else if ((p1.getCurrentPoint() == p2.getCurrentPoint() && p1.getCurrentPoint() == p3.getCurrentPoint()) || (p1.getCurrentPoint() > p2.getCurrentPoint() && p1.getCurrentPoint() > p3.getCurrentPoint())) {
p1.setBalance(p1.getBalance() + totalmoney);
res += p1.getName() + " win!\r\n";
} else if (p2.getCurrentPoint() > p1.getCurrentPoint() && p2.getCurrentPoint() > p3.getCurrentPoint()) {
p2.setBalance(p2.getBalance() + totalmoney);
res += p2.getName() + " win!\r\n";
} else if (p3.getCurrentPoint() > p1.getCurrentPoint() && p3.getCurrentPoint() > p2.getCurrentPoint()) {
p3.setBalance(p3.getBalance() + totalmoney);
res += p3.getName() + " win!\r\n";
} else if (p2.getCurrentPoint() > p1.getCurrentPoint() && p2.getCurrentPoint() == p3.getCurrentPoint()) {
p2.setBalance(p2.getBalance() + totalmoney / 2);
p3.setBalance(p3.getBalance() + totalmoney / 2);
res += p2.getName() + " and " + p3.getName() + " win!\r\n";
} else if (p3.getCurrentPoint() > p1.getCurrentPoint() && p2.getCurrentPoint() == p3.getCurrentPoint()) {
p2.setBalance(p2.getBalance() + totalmoney / 2);
p3.setBalance(p3.getBalance() + totalmoney / 2);
res += p2.getName() + " and " + p3.getName() + " win!\r\n";
}
String balance1 = p1.getName() + " 的金币最后剩下:" + String.valueOf(p1.getBalance()) + "\r\n";
String balance2 = p2.getName() + " 的金币最后剩下:" + String.valueOf(p2.getBalance()) + "\r\n";
String balance3 = p3.getName() + " 的金币最后剩下:" + String.valueOf(p3.getBalance()) + "\r\n";
res = res + balance1 + balance2 + balance3;
System.out.println(res);
return res;
}
/**
* package messsage
* @param originStr
* @param str
* @return
*/
private String packMsg(String originStr, String str) {
System.out.print(str);
originStr += str;
return originStr;
}
}
客户端:CardClient.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Created by zhuqiuhui on 2017/6/20.
*/
public class CardClient extends Frame {
private TextField tfText;
private TextArea taContent;
private Socket s;
private DataOutputStream dos;
private DataInputStream dis;
public static void main(String[] args) {
new CardClient().launchFrame();
}
public void launchFrame(){
tfText = new TextField();
taContent = new TextArea();
this.setSize(300,300);
this.setLocation(300,300);
this.tfText.addActionListener(new TFListener());
this.add(tfText, BorderLayout.SOUTH);
this.add(taContent,BorderLayout.NORTH);
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}});
this.pack();
this.connect();
this.setVisible(true);
}
public void connect() {
try {
s = new Socket("127.0.0.1",1320);
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
new Thread(new SendThread()).start();
} catch (UnknownHostException e) {
System.out.println("UnknownHostException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}finally{
//关闭
}
}
class TFListener implements ActionListener {
private String str;
public void actionPerformed(ActionEvent e) {
str = tfText.getText().trim();
tfText.setText("");
try {
dos.writeUTF(str);
} catch (IOException e1) {
System.out.println("IOException");
e1.printStackTrace();
}
}
}
/**
* 客户端接收消息的线程
*
*/
class SendThread implements Runnable{
private String str;
private boolean iConnect = false;
public void run(){
iConnect = true;
recMsg();
}
public void recMsg() {
try {
while(iConnect){
str = dis.readUTF();
taContent.setText(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行界面: