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


 


相关文章
|
16天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
50 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
16天前
|
存储 Java
java基础(7)变量以及变量的分类
Java变量是内存中存储数据的基本单元,包含数据类型、名称和字面值。变量的数据类型决定了分配的内存空间大小。变量声明格式为“数据类型 变量名;”,变量名应符合标识符命名规范。变量可以重新赋值,但数据类型需一致。变量可以一行声明多个,作用域决定了变量的可用范围。变量分为局部变量和成员变量,局部变量定义在方法体内,成员变量定义在方法体外、类体内。
30 2
|
2天前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
15 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
1天前
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
7 1
java制作游戏,如何使用libgdx,入门级别教学
|
13天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
14天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
40 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
14天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
25 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
16天前
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
34 4
java基础(2)循环语句for、while、do...while
|
16天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
34 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
1天前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
5 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题