13、Java——“21点”扑克游戏系统(变量+循环)

简介: 13、Java——“21点”扑克游戏系统(变量+循环)

⛳️ 一、项目需求


   编写“21点”的扑克游戏(每个需求用一个测试类来完成测试)


   需求一: 计算机随机地向用户发5张牌,如果牌的总点数小於或等於21点,则用户赢;超过21点则计算机赢。


       注意类的没有参数的构造器随机产生一张牌,并且不会重复发牌。类模仿真实牌局的行为,可以用getValue方法从一副牌中重复抽取牌。


       你的程序应该:


       抽取一张牌;


       向用户显示这张牌;


       显示到目前为止已发牌的总点数


   需求二: 为使程序更象真实的牌局,用户应该能与计算机互动玩牌。修改刚才的程序,计算机仍然抽取5张牌,不超过21点的是赢家,如果双方都不超过21点,则双方都不算赢,你的程序应该能准确地报告结果。


       程序应该:


       为用户和计算机抽牌;


       向用户显示牌;


       分别显示用户和计算机的当前总点数;


       为使游戏更加有趣,每抽一张新牌时都要显示牌和总点数


   需求三: 修改程序使用户可以选择是否抽牌,而规定计算机必须抽5张牌或直到牌的总点数大於等於21


   需求四: 修改程序使得用户可以一直玩下去,并分别累计用户和计算机赢的牌局数。


⛳️ 二、代码实现


1、提供默认引用类Card类,代码如下:


package cn.bdqn.demo04 ;
/**
 * Represents a playing card
 * @author Roger Garside/John Mariani
 * @version Last Rewritten: 16th Sept 1997
 */
import java.util.* ;
public class Card
    {
    // Card Class Variables
    private static boolean initialised = false ;
    private static Random rand = new Random() ;
    private static boolean[][] dealt = new boolean[4][13] ;
    private static int noDealt ;
    // Card Instance Variables
    /*
     * the suit of the card (0 to 3)
     */
    private int suit ;
    /*
     * the value of the card (0 to 12)
     */
    private int value ;
    // Card Class Constants
    /**
    * Constant - Spades
    */
    public static final int SPADES = 0 ;
    /**
    * Constant - Hearts
    */
    public static final int HEARTS = 1 ;
    /**
    * Constant - Clubs
    */
    public static final int CLUBS = 2 ;
    /**
    * Constant - Diamonds
    */
    public static final int DIAMONDS = 3 ;
    // Card Constructor Methods
    /**
     * Creates an instance of the Card class with random values
     * (if all have been dealt, then starts again)
     */
    public Card()
  {
        if (noDealt == 52)
            {
     System.err.println("all 52 cards dealt") ;
            initialised = false ;
            }
  if (!initialised)
     {
     for (int i = 0 ; i < 4 ; i++)
         for (int j = 0 ; j < 13 ; j++)
      dealt[i][j] = false ;
     initialised = true ;
     noDealt = 0 ;
     }
  int s, v ;
  do
     {
     s = (int) (Math.abs(rand.nextInt()) % 4) ;
     v = (int) (Math.abs(rand.nextInt()) % 13) ;
     }
        while (dealt[s][v]) ;
  dealt[s][v]  = true ;
        suit = s ;
  value = v ;
        noDealt++ ;
  } // end of constructor method
    /**
     * Creates an instance of the Card class with specified values
     * (if all have been dealt, then starts again)
     * @param s suit of the card
     * @param v value of the card
     */
    public Card(int s, int v)
  {
        if (noDealt == 52)
            {
     System.err.println("all 52 cards dealt") ;
            initialised = false ;
            }
  if (!initialised)
     {
     for (int i = 0 ; i < 4 ; i++)
         for (int j = 0 ; j < 13 ; j++)
      dealt[i][j] = false ;
     initialised = true ;
     noDealt = 0 ;
     }
        if ((s < 0) || (s > 3))
            {
            System.out.println("invalid suit") ;
            System.exit(1) ;
            }
        if ((v < 0) || (v > 12))
            {
            System.out.println("invalid value") ;
            System.exit(1) ;
            }
        if (dealt[s][v]) ;
            {
            System.out.println("card already used") ;
            System.exit(1) ;
            }
  dealt[s][v]  = true ;
        suit = s ;
  value = v ;
        noDealt++ ;
  } // end of constructor method
    // Card Instance Methods - Selectors
    /**
     * returns the suit attribute of the card
     * @return the suit attribute of the card
     */
    public int getSuit()
  {
  return suit ;
  } // end of method getSuit
    /**
     * returns the suit attribute of the card as a string
     * @return the suit attribute of the card as a string
     */
    public String getSuitString()
  {
  switch (suit)
     {
     case SPADES :
  return "Spades" ;
     case HEARTS :
  return "Hearts" ;
     case CLUBS :
  return "Clubs" ;
     case DIAMONDS :
  return "Diamonds" ;
            default :
  return "Unknown" ;
            }
  } //end of method getSuitString
    /**
     * returns the value attribute of the card
     * @return the value attribute of the card
     */
    public int getValue()
  {
  return value ;
  } // end of class getValue
    /**
     * returns the value attribute of the card as a string
     * @return the value attribute of the card as a string
     */
    public String getValueString()
  {
  switch (value)
     {
     case 0 :
  return "Ace" ;
     case 1 :
  return "two" ;
     case 2 :
  return "three" ;
     case 3 :
  return "four" ;
     case 4 :
  return "five" ;
     case 5 :
  return "six" ;
     case 6 :
  return "seven" ;
     case 7 :
  return "eight" ;
     case 8 :
  return "nine" ;
     case 9 :
  return "ten" ;
     case 10 :
  return "Jack" ;
     case 11 :
  return "Queen" ;
     case 12 :
  return "King" ;
     default :
  return "Unknown" ;
            }
  } //end of method getValueString
    // Other Card Methods
    /**
     * Resets the deck of cards to all undealt
     */
    public void restart()
  {
  for (int i = 0 ; i < 4 ; i++)
     for (int j = 0 ; j < 13 ; j++)
  dealt[i][j] = false ;
        noDealt = 0 ;
        } // end of method restart
    /**
     * return a string representing the card
     * @return details of the card ('value of suit')
     */
    public String toString()
        {
        return getValueString() + " of " + getSuitString() ;
        } // end of method toString
    /* public void setSuit(int s)
  {
  // s should be in the range 0 to 3
  if ((s < 0) || (s > 3)) suit = 0;
  else suit = s;
  } // end of method setSuit
    public void setValue(int v)
  {
  // value should be in the range 0 to 12
  if ((v < 0) || (v > 12)) value = 0;
  else value = v;
  } // end of method setValue */
    } // end of class card

2、需求一代码实现如下:


package cn.bdqn.demo04;
public class CardTest1 {
  public static void main(String[] args) {
  System.out.println("欢迎来到“21点”的扑克游戏!");
  int num=0;
  int sum=0;
  for (int i = 1; i <= 5; i++) {
    Card card=new Card();
    num=card.getValue()+1;
    System.out.println("第"+i+"张牌为:"+num);
          sum+=num;
  }
      System.out.println("现在的总点数为:"+sum);
        if(sum>21) {System.out.println("很遗憾,计算机赢,再接再厉!");}
        else  System.out.println("恭喜你,玩家赢!");
  }
}



3、需求二代码实现如下:


package cn.bdqn.demo04;
public class CardTest2 {
  public static void main(String[] args) {
  System.out.println("欢迎来到“21点”的扑克游戏!");
  int num = 0;
  int sum1 = 0;
  int sum2 = 0;
  // 为计算机抽牌
  System.out.println("计算机抽牌:");
  for (int i = 1; i <= 5; i++) {
    Card card = new Card();
    num = card.getValue() + 1;
    System.out.println("第" + i + "张牌为:" + num);
    sum1 += num;
  }
  System.out.println("计算机的总点数为:" + sum1);
  // 为用户抽牌
  System.out.println("用户抽牌:");
  for (int i = 1; i <= 5; i++) {
    Card card = new Card();
    num = card.getValue() + 1;
    System.out.println("第" + i + "张牌为:" + num);
    sum2 += num;
  }
  System.out.println("用户的总点数为:" + sum2);
  //判断
  if(sum1<=21&&sum2>21){
    System.out.println("很遗憾,计算机赢,再接再厉!");
  }else if(sum1<=21&&sum2<=21){
    System.out.println("很遗憾,双方都不算赢!");
  }else if(sum1>21&&sum2<=21){
    System.out.println("恭喜玩家赢!");
  }else{
    System.out.println("很遗憾,双方都超过21点!");
  }
  }
}

4、需求三代码实现如下:


package cn.bdqn.demo04;
import java.util.Scanner;
public class CardTest3 {
  public static void main(String[] args) {
  //键盘输入
  Scanner sc=new Scanner(System.in);
  System.out.println("欢迎来到“21点”的扑克游戏!");
  int num = 0;
  int sum1 = 0;
  int sum2 = 0;
  // 为计算机抽牌
  System.out.println("计算机抽牌:");
  for (int i = 1; i <= 5; i++) {
    Card card = new Card();
    num = card.getValue() + 1;
    System.out.println("第" + i + "张牌为:" + num);
    sum1 += num;
    if(sum1>21){
    break;
    }
  }
  System.out.println("计算机的总点数为:" + sum1);
  // 为用户抽牌
  System.out.println("请您输入1(抽牌)/0(不抽牌)选择是否抽牌:");
  int isNum=sc.nextInt();
  if(isNum==0){
    System.out.println("您选择了不抽牌,游戏结束!");
  }else if(isNum==1){
    System.out.println("用户抽牌:");
    for (int i = 1; i <= 5; i++) {
    Card card = new Card();
    num = card.getValue() + 1;
    System.out.println("第" + i + "张牌为:" + num);
    sum2 += num;
    }
    System.out.println("用户的总点数为:" + sum2);
    //判断
    if(sum1<=21&&sum2>21){
    System.out.println("很遗憾,计算机赢,再接再厉!");
    }else if(sum1<=21&&sum2<=21){
    System.out.println("很遗憾,双方都不算赢!");
    }else if(sum1>21&&sum2<=21){
    System.out.println("恭喜玩家赢!");
    }else{
    System.out.println("很遗憾,双方都超过21点!");
    }
  }else{
    System.out.println("选择错误,游戏结束!");
  }
  }
}


5、需求四代码实现如下:


package cn.bdqn.demo04;
import java.util.Scanner;
public class CardTest4 {
  public static void main(String[] args) {
  // 键盘输入
  Scanner sc = new Scanner(System.in);
  System.out.println("欢迎来到“21点”的扑克游戏!");
  // 默认初始值
  boolean flag = true;
  // 循环初始值
  int zeroNum = -1;
  // 用户赢牌总局数
  int userNums = 0;
  // 计算机赢牌总局数
  int comNums = 0;
  do {
    int num = 0;
    int sum1 = 0;
    int sum2 = 0;
    // 为计算机抽牌
    System.out.println("计算机抽牌:");
    for (int i = 1; i <= 5; i++) {
    Card card = new Card();
    num = card.getValue() + 1;
    System.out.println("第" + i + "张牌为:" + num);
    sum1 += num;
    if (sum1 > 21) {
      break;
    }
    }
    System.out.println("计算机的总点数为:" + sum1);
    // 为用户抽牌
    boolean isChou = false;
    System.out.println("请您输入1(抽牌)/0(不抽牌)选择是否抽牌:");
    int isNum = sc.nextInt();
    if (isNum == 0) {
    System.out.println("您选择了不抽牌,游戏结束!");
    break;
    } else if (isNum == 1) {
    System.out.println("用户抽牌:");
    for (int i = 1; i <= 5; i++) {
      Card card = new Card();
      num = card.getValue() + 1;
      System.out.println("第" + i + "张牌为:" + num);
      sum2 += num;
    }
    System.out.println("用户的总点数为:" + sum2);
    // 判断
    if (sum1 <= 21 && sum2 > 21) {
      userNums++;
      System.out.println("计算机赢,总牌局数为:" + userNums);
    } else if (sum1 <= 21 && sum2 <= 21) {
      System.out.println("很遗憾,双方都不算赢!");
    } else if (sum1 > 21 && sum2 <= 21) {
      comNums++;
      System.out.println("用户赢,总牌局数为:" + comNums);
    } else {
      System.out.println("很遗憾,双方都超过21点!");
    }
    } else {
    System.out.println("选择错误,游戏结束!");
    break;
    }
    if (flag) {
    System.out.println("输入0返回游戏:");
    zeroNum = sc.nextInt();
    } else {
    break;
    }
  } while (zeroNum == 0);
  }
}


⛳️ 三、效果展示


1、需求一效果展示


4.png


2、需求二效果展示



3.png

3、需求三效果展示



2.png

4、需求四效果展示


1.gif


 


相关文章
|
4天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
4天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
12天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
10天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
40 3
|
14天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
19天前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
34 6
|
16天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
19天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
20天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
21天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
44 1