21点游戏多玩家Java代码

玩家类 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();
            }

        }

    }

}

运行界面:


  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的21游戏Java代码示例: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int playerScore = 0; int dealerScore = 0; // 开始游戏,发两张牌给玩家和庄家 System.out.println("欢迎来到21游戏!"); System.out.println("玩家的回合:"); playerScore += drawCard(); playerScore += drawCard(); // 玩家回合,可以选择继续要牌或停止要牌 while (true) { System.out.println("你的当前分数为:" + playerScore); System.out.print("是否要牌?(y/n) "); String choice = scanner.nextLine(); if (choice.equalsIgnoreCase("y")) { playerScore += drawCard(); } else { break; } if (playerScore > 21) { System.out.println("你的分数超过21,你输了!"); return; } } // 庄家回合,一直要牌直到分数大于等于17 System.out.println("庄家的回合:"); dealerScore += drawCard(); dealerScore += drawCard(); while (dealerScore < 17) { System.out.println("庄家的分数为:" + dealerScore + ",继续要牌。"); dealerScore += drawCard(); } System.out.println("庄家的最终分数为:" + dealerScore); // 比较分数,判断胜负 if (dealerScore > 21) { System.out.println("庄家的分数超过21,你赢了!"); } else if (dealerScore > playerScore) { System.out.println("庄家的分数比你高,你输了!"); } else if (dealerScore < playerScore) { System.out.println("你的分数比庄家高,你赢了!"); } else { System.out.println("平局!"); } } // 抽一张牌,返回其数 public static int drawCard() { int card = (int) (Math.random() * 10) + 1; System.out.println("抽到了一张" + card + "的牌!"); return card; } } ``` 这是一个简单的控制台程序,实现了21游戏的基本功能。当然,你可以根据自己的需求和想法进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值