用JAVA写一个简单的21点游戏(不设置庄主的情况下)

在某次的恶劣的JAVA上机中,菜鸟博主嗅到了一丝蔑视的味道——上个班的这个作业听说好像有点难!

怎么会!

看我!

……

好吧我看了,我好像也写不出来~

当然事实可能是有点难度了,毕竟对于JAVA初学者来说做这样个东西确实会有点难的。

上机作业打开的那一瞬间,我首先捕获到了 21点。呃,二十一点是什么东西!(博主承认在电影里确实描绘过这种****的场景,当然纯洁的博主自然是不会受***的“熏陶”的)。在经历过一系列的求助度娘之后,博主用自己可怜的理解力截取了一些有用的信息:发牌、庄家、闲家、黑杰克、爆了……好吧为了保护自己残存的脑细胞,博主选择自动过滤一些字眼,然后就用来设计自己的上机作业。

作业也没有要求完全模拟二十一点游戏,只要求是随机产生纸牌和判断结果,所以博主很自觉地忽略掉了庄家和闲家的概念,为此一下代码将不含有复杂的思路!仅仅是脑力缺失人士的个人成果展。

代码如下:

public class PlayingCard {
    private int[] card = new int[52];                           //总牌
    private boolean[] cardFlag = new boolean[52];               //标记被抽到过的牌

    public PlayingCard() {
        this.CardInit();                                         //初始化
    }

    public int DealCard() {                                     //用于产生随机牌的方法
        int card = 0;
        while (true) {                                           //为了保证出来的随机数是有用的
            card = Deal();
            if(card != -1) {
                return card;
            }
            else
                continue;
        }
    }

    private int Deal() {
        int cardNum = (int)(Math.random() * 51 + 1);       //产生随机数
        while (true) {
            if (cardFlag[cardNum] == false) {
                cardFlag[cardNum] = true;                   //牌已经被抽到过
                return card[cardNum];
            }
            else return -1;
        }
    }

    private void CardInit() {
        for (int i = 0;i < 52;i++) {
            int Num  = (i + 4) / 4;                         //给牌赋值
            if (Num >= 10){
                Num = 10;                                   // 10、J、Q、K 都作为 10
            }
            card[i] = Num;                                  //赋值
            cardFlag[i] = false;                            //牌的初始状态为未抽到过
        }
    }
}
这个是为纸牌创建的一个类,主要是用来定义纸牌、初始化纸牌和随机产生纸牌的类,没有难以理解的地方,主要原因是博主脑容量有限。

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class MainProcess {
    static String[] player = new String[]{"p1","p2","p3","p4"};                     //创建四个玩家
    static int NumberAmount[] = new int[4];                                             //储存每个玩家的牌的总和
    static boolean[] playerFlag = new boolean[]{true,true,true,true};               //记录玩家是否死掉
    static boolean[] repeatFlag = new boolean[]{false,false,false,false};
    static boolean[] CardNeed = new boolean[]{true,true,true,true};               //记录玩家是否要牌

    public static void main(String[] args) {
        RequireDealCard();                                                              //调用发牌方法
        Result();                                                                       //调用判断输赢方法

        Scanner sc = new Scanner(System.in);
        sc.next();
    }

    public static void RequireDealCard() {

        PlayingCard pc = new PlayingCard();                                             //创建纸牌对象
        Scanner sc = new Scanner(System.in);

        int[][] card = new int[player.length][44];                                                  //记录玩家的手牌

        for (int i = 0;i < player.length;i++) {                                                     //首轮发牌
            try{
            card[i][0] = pc.DealCard();
            card[i][1] = pc.DealCard();
            NumberAmount[i] = card[i][0] + card[i][1];
            System.out.printf("The person %s gets his cards,which are %d and %d.\n and the point-number of he is %d.\n\n",player[i],card[i][0],card[i][1],NumberAmount[i]);
            }
            catch (Exception e){
                System.out.printf(e.toString());
            }
        }

        boolean DontNeedFlag[] = new boolean[player.length];
        int DontNeed = 0;
        while (DontNeed != 4) {
            for (int i = 0; i < player.length; i++) {
                if (playerFlag[i] && CardNeed[i]) {                                                                        //如果玩家还活着
                    System.out.printf("\ndoes %s needs any cards?\n[0-20]",player[i]);           //
                    int cardAmount = sc.nextInt();                                              //输入发牌的张数,玩家是否要求发牌

                    if (!(cardAmount == 0)) {
                        int CardLength = FindNotZero(card[i]);
                        System.out.printf("%s gets %d card(s),\nand there are ",player[i],cardAmount);
                        for (int j = CardLength; j < (cardAmount + CardLength); j++) {
                            card[i][j] = pc.DealCard();                                               //调用随机发牌方法
                            System.out.printf("%-4d",card[i][j]);                               //输出玩家刚刚拥有的牌
                            NumberAmount[i] += card[i][j];                                       //计算玩家所有的手牌和
                        }

                        CardLength = FindNotZero(card[i]);
                        System.out.printf("\n%s has ",player[i]);
                        for (int j = 0; j < (CardLength); j++) {
                            System.out.printf("%-4d",card[i][j]);                               //输出玩家所有的手牌
                        }
                    }
                    else {                                                                    //玩家不要牌了
                        int CardLength = FindNotZero(card[i]);
                        System.out.printf("\n%s has ",player[i]);
                        for (int j = 0; j < CardLength; j++) {
                            System.out.printf("%-4d",card[i][j]);
                        }
                        CardNeed[i] = false;
                    }

                    System.out.printf("\nsum is %d.",NumberAmount[i]);
                    if (NumberAmount[i] > 21) {                                                     //如果玩家牌和超过21就死掉
                        playerFlag[i] = false;                                                  //玩家死亡标志
                        System.out.printf("\n\t%s is killed.",player[i]);
                        CardNeed[i] = false;
                        NumberAmount[i] = 0;                                                    //将玩家的手牌和置为空,便于后面的统计输出
                    }
                    System.out.println();
                }

                else if (playerFlag[i] && !CardNeed[i]) {
                    if (i == 4) {
                        break;
                    }
                    else
                        continue;
                }
            }

            for (int i = 0; i < player.length; i++) {                                       //统计有多少个人不要牌了
                if (!DontNeedFlag[i]) {
                    if (!CardNeed[i]) {
                        DontNeedFlag[i] = true;
                        DontNeed++;
                    }
                }
            }
        }
    }

    public static void Result() {
        //所有人都死了,平局

        //只有一个人或者两个人死了,比较大小谁更接近 21

        //只有一个人活着,他就是赢家
        int count = 0;                                                                  //记录有多少个玩家还未死亡
        for (int i = 0; i < playerFlag.length; i++) {
            if(playerFlag[i] == true) {
                count++;
            }
        }

        if(count > 1) {                                                                 //如果有两个以上玩家活着
            //主要是为了怕有两个人的点数一样
            if(CheckRepeat(NumberAmount)) {
                System.out.printf("\n\n\t\tThe winners are ");
                for (int i = 0; i < player.length; i++) {
                    if (repeatFlag[i]) {
                        System.out.printf("%3s",player[i]);
                    }
                }
            }
            else {
                System.out.printf("\n\n\t\tThe winner is %s.",player[Arrays.binarySearch(NumberAmount,getMax(NumberAmount))]);
            }
        }
        else if(count == 1) {                                                           //如果只有一个人活着
            for (int i = 0; i < playerFlag.length; i++) {
            if (playerFlag[i]) {                                                         //寻找那个活着的玩家
                    System.out.printf("\n\n\t\tThe winner is %s.",player[i]);
                }
            }
        }
        else if (count == 0) {                                                          //全死了
            System.out.printf("\n\n\t\tNo winner!");
        }
    }

    public static int getMax(int[] arr){                            //获取最大的那个人的纸牌
        int max = arr[0];
        for(int i = 1;i < arr.length;i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }

    public static boolean CheckRepeat(int[] arr) {                  //检测是否有多个赢家
        int m = Arrays.binarySearch(NumberAmount,getMax(NumberAmount));
        boolean flag = false;
        //两层循环来判断是否有重复的元素
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == arr[m]) {
                flag = true;
                repeatFlag[i] = true;
            }
        }
        return flag;
    }

    public static int FindNotZero(int[] arr) {                  //返回的是当前数组的开始为0的那一位元素
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                return i;
            }
        }
        return arr.length;
    }
}
对的,这个就是主类了,主要包含~很多东西~,至于为什么要塞那么多东西给主类,这就是用多了C语言留下来的后遗症,大学嘛,不都是这样教的~。

写完这个东西之后,博主觉得自己可牛*了,这么个东西都给弄出来了,自我感觉良好,亟待一杯咖啡。


  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值