
✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:乐趣国学的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容: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、需求一效果展示
2、需求二效果展示
3、需求三效果展示
4、需求四效果展示
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试使用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
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作: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作为该等式的第二部分,但这仍然是主要问题。
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我