首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制台上的敲击

控制台上的敲击
EN

Code Review用户
提问于 2014-10-13 12:58:20
回答 2查看 1.9K关注 0票数 9

我决定创建一个控制台Blackjack游戏,作为我的最后一个Java项目。请看我的代码,并给我一些反馈。

我试着使游戏尽可能面向对象。我有五门不同的课。

Player类:

代码语言:javascript
复制
public class Person extends Dealer{

Random ran = new Random ();
Scanner scan = new Scanner (System.in);
public static int personcard, persontotal;
static ArrayList <String> name = new ArrayList <String> ();


public void shufflePerson () throws InterruptedException {

    name.add("Bert");

    personcard = ran.nextInt(14);

    while (personcard < 1) {
        personcard = ran.nextInt(14);
    }

    switch (personcard) {

    case 11:
        System.out.println(name + " drew a Jack");
        persontotal = 10 + persontotal;
        Thread.sleep(2500);
        System.out.println(name +"s total is: " + persontotal);
        break;

    case 12:
        Thread.sleep(2500);
        System.out.println(name +" drew a Queen");
        persontotal = 10 + persontotal;
        Thread.sleep(2500);
        System.out.println(name +"s total is: " + persontotal); 
        break;
    case 13:
        Thread.sleep(2500);
        System.out.println(name +" drew a King");
        persontotal = 10 + persontotal;
        Thread.sleep(2500);
        System.out.println(name + "s total is: " + persontotal);    
        break;

    case 14:
        Thread.sleep(2500);
        System.out.println(name +" drew an Ace");
        persontotal = 11 + persontotal;
        Thread.sleep(2500);
        System.out.println(name + "s total is: " + persontotal);    
        break;

    default:
        Thread.sleep(2500);
        System.out.println(name + " drew a: " + personcard);
        persontotal = persontotal + personcard;
        Thread.sleep(2500);
        System.out.println(name + "s total is: " + persontotal);
    }

    if (persontotal > 21) {
        System.out.println(name +" busted.");
        playAgain p = new playAgain ();
        p.again();
    }
    else {

    System.out.println("Hit or stay?");

    String hitorstay = scan.nextLine();

    if (hitorstay.equals("hit")) {
        shufflePerson();
    }
    else {
        System.out.println("Okay, dealers turn.");
        Dealer d = new Dealer ();
        d.shuffleDealer();
    }
    }
}

Dealer类:

代码语言:javascript
复制
public class Dealer {
Random ran = new Random ();
public static int dealercard, dealertotal;

public void shuffleDealer () throws InterruptedException {

    dealercard = ran.nextInt(14);

    while (dealercard < 1) { 
        dealercard = ran.nextInt(14);
    }
    switch (dealercard) {
    case 11:
        System.out.println("Dealer drew a Jack");
        dealertotal = 10 + dealertotal;
        Thread.sleep(2500);
        System.out.println("Dealers total is: " + dealertotal);
        break;


    case 12:
        Thread.sleep(2500);
        System.out.println("Dealer drew a Queen");
        dealertotal = 10 + dealertotal;
        Thread.sleep(2500);
        System.out.println("Dealers total is: " + dealertotal);
        break;

    case 13:
        Thread.sleep(2500);
        System.out.println("Dealer drew a King");
        dealertotal = 10 + dealertotal;
        Thread.sleep(2500);
        System.out.println("Dealers total is: " + dealertotal);
        break;


    case 14:
        Thread.sleep(2500);
        System.out.println("Dealer drew an Ace");
        dealertotal = 11 + dealertotal;
        Thread.sleep(2500);
        System.out.println("Dealers total is: " + dealertotal);
        break;


    default:
        System.out.println("Dealers drew a " + dealercard);
        // vår formel för total
        dealertotal = dealercard + dealertotal;
        Thread.sleep(2500);
        System.out.println("Dealers total is: " + dealertotal);
    }

    if (dealertotal > 21) {
        System.out.println("Dealer busted.");
        playAgain p = new playAgain ();
        p.again();
    }

    else if (dealertotal < 15) { 
        System.out.println("Dealer chooses to hit.");
        shuffleDealer ();
    }
    else {
        System.out.println("Dealer chooses to stay.");
        displayWinner w = new displayWinner ();
        w.showWinner();
    }
}

displayWinner类:

代码语言:javascript
复制
public class displayWinner extends Person {

public void showWinner () throws InterruptedException {

    if (persontotal > dealertotal) {
        System.out.println(name +" won!");
        playAgain p = new playAgain ();
        p.again();
    }
    else if (dealertotal > persontotal){
        System.out.println("Dealer won!");
        playAgain p = new playAgain ();
        p.again();

    }
    else {
        System.out.println("Draw.");
        playAgain p = new playAgain ();
        p.again();
    }
}

playAgain类:

代码语言:javascript
复制
public class playAgain {
Scanner scan = new Scanner (System.in);


public void again () throws InterruptedException {

    System.out.println("Game ended. Play again? y/n");
    String yn = scan.nextLine();
    if (yn.equals("y")) {
        Person p = new Person ();
        p.shufflePerson();
    }
    else {
        System.out.println("Goodbye.");
        System.exit(0);
    }
}

主类:

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    System.out.println();
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println("~   Welcome     ~");
    System.out.println("~   to BlackJack!   ~");
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println("\nShuffling cards...");
    Thread.sleep(0);



    Person p = new Person ();
    p.shufflePerson();
}
EN

回答 2

Code Review用户

发布于 2014-10-13 13:18:54

面向对象的总体设计是不自然的:

  • PersonDealer的一种?通常情况是相反的:Person是更一般的类型,DealerPerson的子类型。在现实生活中,每个人都是Person,但不是每个人都是Dealer,对吗?
  • Person有一个shufflePerson方法..。这到底是什么意思?如果你把它放在英语句子里,那就没有意义了:你不能“洗牌一个人”。你不应该在纸牌游戏中洗牌吗?DealershuffleDealer也是如此
  • 投掷InterruptedException的方法很多。在现实生活中,当在赌场或与朋友玩黑杰克时,这会是什么意思呢?它不对应任何东西,因此它不应该是实现的公共接口(= public方法)的一部分。
  • displayWinner是类的糟糕名称。听起来像是一种行动。OOP是“面向对象的编程”,而不是“面向行动的编程”。名词是好的类名,而不是动作动词。当你无法用名词来描述你的类所做的事情时,问问自己这个类是否代表了一个很好的对象,它是一个真实的自然模型还是特定问题领域中的一个概念。更糟糕的是,这个类扩展了Person。当ClassA扩展ClassB时,问问自己:“ClassA是ClassB吗?”在本例中:displayWinnerPerson吗?事实并非如此。所以它不应该是Person的子类。
  • 一个playAgain类..。什么类型的对象是playAgain对象?它代表了什么?这里的目标应该是游戏:如果你给我一个游戏,我自然会假设它是我可以玩的东西。但是如果你给我一个"playAgain",那又是什么意思呢?

如何重新设计这个?

  • 重新考虑组成程序的基本类。以现实为例是很好的。下面是一些直观的类:经销商,玩家,卡片,甲板,手,游戏。
  • 想想每个类的责任,您可以对它们执行哪些操作(=方法),以及它们应该具有哪些其他对象(=字段)。例如:
    • 需要一个通用甲板,经销商和玩家都可以使用它。
    • 甲板可以洗牌。
    • 一个球员有一只手
    • 一只手可以是一只赢的手,也可以是一只输的手,或者两者都不能。
    • ..。(继续思考)

所有这些似乎都是关于程序如何工作的自然和合乎逻辑的假设。有一个自然的设计使得实现更容易,更少的混乱,更少的复杂。

  • 写下每个类应该拥有的方法,但是没有实现任何东西。这一切都应该适合1-2页。阅读它,它将作为一个高水平的概述你的程序.检查每个类和方法,以验证它是否合乎逻辑。如果您发现逻辑错误,请重新处理它,移动组件,就像我写的关于Person.shufflePerson的文章一样,它应该是Deck.shuffle
  • 迭代。在完成了第一个设计之后,您可能会注意到一个更好的设计的新机会。即使是最好的程序员也会这样做,扔掉他们的第一,第二,第三设计,直到他们最终达成一些不让他们想吐的东西。
票数 11
EN

Code Review用户

发布于 2014-10-13 13:08:14

一些快速射击

  • ArrayList<String> name = new ArrayList<String>() 3要注意
    • 字段应该命名为names,因为列表可以包含多个名称。
    • 您应该使用金刚石算子 (需要Java 7)
    • 您不应该针对实现编写代码,而应该针对接口编写代码,因此:List<String> names = new ArrayList<>();

  • 干(不要重复)
    • shufflePerson()shuffleDealer已经是非常奇怪的名字了,您应该将它们命名为shuffleCardsFor(String name)。应该使用name参数,而不是将硬编码播放器"Bert“添加到names和更硬编码的播放机Dealer中。
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/66528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档