草庐IT

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

Java Fans 2025-05-02 原文

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。

🍎个人主页:乐趣国学的博客

🍊个人信条:不迁怒,不贰过。小知识,大智慧。

💞当前专栏:Java案例分享专栏

✨特色专栏:国学周更-心性养成之路

🥭本文内容:Java——“21点”扑克游戏系统(变量+循环)

更多内容点击👇

                       Java——对象和类案例代码详解

目录

⛳️ 一、项目需求

⛳️ 二、代码实现

⛳️ 三、效果展示


⛳️ 一、项目需求

    编写“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、需求一效果展示

2、需求二效果展示

3、需求三效果展示

4、需求四效果展示

       码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

有关13、Java——“21点”扑克游戏系统(变量+循环)的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐