我决定创建一个控制台Blackjack游戏,作为我的最后一个Java项目。请看我的代码,并给我一些反馈。
我试着使游戏尽可能面向对象。我有五门不同的课。
Player类: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类: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类: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类: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);
}
}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();
}发布于 2014-10-13 13:18:54
面向对象的总体设计是不自然的:
Person是Dealer的一种?通常情况是相反的:Person是更一般的类型,Dealer是Person的子类型。在现实生活中,每个人都是Person,但不是每个人都是Dealer,对吗?Person有一个shufflePerson方法..。这到底是什么意思?如果你把它放在英语句子里,那就没有意义了:你不能“洗牌一个人”。你不应该在纸牌游戏中洗牌吗?Dealer和shuffleDealer也是如此InterruptedException的方法很多。在现实生活中,当在赌场或与朋友玩黑杰克时,这会是什么意思呢?它不对应任何东西,因此它不应该是实现的公共接口(= public方法)的一部分。displayWinner是类的糟糕名称。听起来像是一种行动。OOP是“面向对象的编程”,而不是“面向行动的编程”。名词是好的类名,而不是动作动词。当你无法用名词来描述你的类所做的事情时,问问自己这个类是否代表了一个很好的对象,它是一个真实的自然模型还是特定问题领域中的一个概念。更糟糕的是,这个类扩展了Person。当ClassA扩展ClassB时,问问自己:“ClassA是ClassB吗?”在本例中:displayWinner是Person吗?事实并非如此。所以它不应该是Person的子类。playAgain类..。什么类型的对象是playAgain对象?它代表了什么?这里的目标应该是游戏:如果你给我一个游戏,我自然会假设它是我可以玩的东西。但是如果你给我一个"playAgain",那又是什么意思呢?如何重新设计这个?
所有这些似乎都是关于程序如何工作的自然和合乎逻辑的假设。有一个自然的设计使得实现更容易,更少的混乱,更少的复杂。
Person.shufflePerson的文章一样,它应该是Deck.shuffle。发布于 2014-10-13 13:08:14
一些快速射击
ArrayList<String> name = new ArrayList<String>() 3要注意names,因为列表可以包含多个名称。List<String> names = new ArrayList<>();shufflePerson()和shuffleDealer已经是非常奇怪的名字了,您应该将它们命名为shuffleCardsFor(String name)。应该使用name参数,而不是将硬编码播放器"Bert“添加到names和更硬编码的播放机Dealer中。https://codereview.stackexchange.com/questions/66528
复制相似问题