Java 无法使卡/牌组对象程序工作
这是我第一次在论坛上发帖,我不完全确定我的问题是否正确,但我会尽量具体并遵循指导原则。在遵循指导原则时,这是一个基于课堂作业的问题。这个任务是获取代码,创建一个代表一副牌的“牌组”对象,并添加几个功能。我目前正处于这个过程中 我的问题在于这一准则:Java 无法使卡/牌组对象程序工作,java,arrays,playing-cards,Java,Arrays,Playing Cards,这是我第一次在论坛上发帖,我不完全确定我的问题是否正确,但我会尽量具体并遵循指导原则。在遵循指导原则时,这是一个基于课堂作业的问题。这个任务是获取代码,创建一个代表一副牌的“牌组”对象,并添加几个功能。我目前正处于这个过程中 我的问题在于这一准则: public class SilasAlmgrenS6L1CardCreate { public static void main(String args[]) { Deck d = new Deck(); d.shuffle
public class SilasAlmgrenS6L1CardCreate {
public static void main(String args[]) {
Deck d = new Deck();
d.shuffle();
Hand f = new Hand(d); //Returns error 'Hand cannot be resolved to a type'
}
public static class Deck {
Card[] cardArray = new Card[52];
Deck() { //constructor
int suits = 4;
int cardType = 13;
int cardCount = 0;
for (int i = 1; i <= suits; i++)
for (int j = 1; j <= cardType; j++) {
cardArray[cardCount] = new Card(i, j);
cardCount++;
} //End loop
} //End deck() constructor
////////////////////////////////////////////////////////
//My code starts here
public class Hand {
Hand(Deck a) {
Card[] Hand = {a.cardArray[0], a.cardArray[1], a.cardArray[2], a.cardArray[3], a.cardArray[4]};
Card[] playerHand = {Hand[0], Hand[1]};
System.out.println("You have " + playerHand[0] + " and " + playerHand[1] );
} //End hand constructor
} //End hand class
public void shuffle() {
//Runs loop for the length of the deck
for(int i = 0; i < cardArray.length; i++) {
int num = (int) (Math.random() * (51 - 0)) + 0; //Creates a random number between 0 and 51; used to shuffle
Card placeHolder = cardArray[i]; //Picks a place holder card from the deck
cardArray[i] = cardArray[num]; //Picks two random cards and make them equal
cardArray[num] = placeHolder; //Assigns one of the duplicate cards to the placeholder value
} //End for
} //End shuffle
//And ends here
/////////////////////////////////////////////////
public void print() {
for (int i = 0; i < cardArray.length; i++)
System.out.println(cardArray[i]);
} //End print loop
} //End print class
public static class Card {
String suit, name;
int points;
Card(int n1, int n2) {
suit = getSuit(n1);
name = getName(n2);
points = getPoints(name);
} //End card class
public String toString() {
return "The " + name + " of " + suit;
} //End toString
public String getName(int i) {
if (i == 1) return "Ace";
if (i == 2) return "Two";
if (i == 3) return "Three";
if (i == 4) return "Four";
if (i == 5) return "Five";
if (i == 6) return "Six";
if (i == 7) return "Seven";
if (i == 8) return "Eight";
if (i == 9) return "Nine";
if (i == 10) return "Ten";
if (i == 11) return "Jack";
if (i == 12) return "Queen";
if (i == 13) return "King";
return "error";
} //End getName String
public int getPoints(String n) {
if (n == "Jack" || n == "Queen" || n == "King" || n == "Ten")
return 10;
if (n == "Two")
return 2;
if (n == "Three")
return 3;
if (n == "Four")
return 4;
if (n == "Five")
return 5;
if (n == "Six")
return 6;
if (n == "Seven")
return 7;
if (n == "Eight")
return 8;
if (n == "Nine")
return 9;
if (n == "Ace")
return 11;
return -1;
} //End int getPoints
public String getSuit(int i) {
if (i == 1) return "Diamonds";
if (i == 2) return "Clubs";
if (i == 3) return "Spades";
if (i == 4) return "Hearts";
return "error";
} //End getSuit String
} //End Deck class
公共类SilasalMgrens6lCardCreate{
公共静态void main(字符串参数[]){
甲板d=新甲板();
d、 洗牌();
Hand f=new Hand(d);//返回错误“Hand无法解析为类型”
}
公共静态类甲板{
Card[]cardArray=新卡[52];
Deck(){//构造函数
int=4;
int cardType=13;
int cardCount=0;
对于(int i=1;i来说,第一个问题是您的Hand
类是静态Deck
类的子类。这样,您就不能在main
方法中使用它,因为它不是封闭类
编辑
所以,我有点过火了。希望这对你有意义
首先,我们有你的主类。为了不想输入这么长的名称,我对它进行了重命名。我添加了你的Hand
和Deck
对象作为变量,因为手既不属于Deck,也不属于其他方面,但它们都是main
类的一部分,让我们称之为游戏
你从洗牌开始。当你有牌组时,你可以得到一张随机牌。这是由牌组提供的。(我将很快讨论这个方法)
一旦你有一手牌,你可以向用户显示他们的点数,并询问他们是否想要一张额外的牌(如果numberOfPoints<22,numberOfCards<5)。如果他们确实想要一张额外的牌,请向牌组索要一张随机牌并将其添加到手牌中。继续,直到满足任何边界
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CardExample {
private Hand playHand;
private Deck playDeck;
private Scanner reader = new Scanner(System.in); // Reading from System.in
public static void main(String args[]) {
new CardExample().play();
}
public void play(){
playDeck = new Deck();
playDeck.shuffle();
Card firstCard = playDeck.getRandomCard();
Card secondCard = playDeck.getRandomCard();
List<Card> startCards = new ArrayList<>();
startCards.add(firstCard);
startCards.add(secondCard);
playHand = new Hand(startCards);
requestInput();
}
private void requestInput(){
System.out.println("You have " + playHand.getPoints() + " points");
System.out.println("New card? (Y/N)");
String input = reader.next();
if(input.equalsIgnoreCase("y")){
Card newCard = playDeck.getRandomCard();
playHand.addCard(newCard);
if(playHand.getNumberOfCards() < 5 && playHand.getPoints() < 22) {
requestInput();
}else if(playHand.getPoints() >= 22){
System.out.println("You have " + playHand.getPoints() + "points. You're dead, sorry.");
reader.close();
} else{
System.out.println("You have 5 cards, that's the max");
reader.close();
}
}else{
System.out.println("Your score is " + playHand.getPoints() + " points");
reader.close();
}
}
}
卡片类别(未更改,但单独文件)
第一个问题是,您的Hand
类是静态Deck
类的子类。这样,您就不能在main
方法中使用它,因为它不是封闭类
编辑
所以,我有点过火了。希望这对你有意义
首先,我们有你的主类。为了不想输入这么长的名称,我对它进行了重命名。我添加了你的Hand
和Deck
对象作为变量,因为手既不属于Deck,也不属于其他方面,但它们都是main
类的一部分,让我们称之为游戏
你从洗牌开始。当你有牌组时,你可以得到一张随机牌。这是由牌组提供的。(我将很快讨论这个方法)
一旦你有一手牌,你可以向用户显示他们的点数,并询问他们是否想要一张额外的牌(如果numberOfPoints<22,numberOfCards<5)。如果他们确实想要一张额外的牌,请向牌组索要一张随机牌并将其添加到手牌中。继续,直到满足任何边界
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CardExample {
private Hand playHand;
private Deck playDeck;
private Scanner reader = new Scanner(System.in); // Reading from System.in
public static void main(String args[]) {
new CardExample().play();
}
public void play(){
playDeck = new Deck();
playDeck.shuffle();
Card firstCard = playDeck.getRandomCard();
Card secondCard = playDeck.getRandomCard();
List<Card> startCards = new ArrayList<>();
startCards.add(firstCard);
startCards.add(secondCard);
playHand = new Hand(startCards);
requestInput();
}
private void requestInput(){
System.out.println("You have " + playHand.getPoints() + " points");
System.out.println("New card? (Y/N)");
String input = reader.next();
if(input.equalsIgnoreCase("y")){
Card newCard = playDeck.getRandomCard();
playHand.addCard(newCard);
if(playHand.getNumberOfCards() < 5 && playHand.getPoints() < 22) {
requestInput();
}else if(playHand.getPoints() >= 22){
System.out.println("You have " + playHand.getPoints() + "points. You're dead, sorry.");
reader.close();
} else{
System.out.println("You have 5 cards, that's the max");
reader.close();
}
}else{
System.out.println("Your score is " + playHand.getPoints() + " points");
reader.close();
}
}
}
卡片类别(未更改,但单独文件)
为什么要在子文件中使用多个类?这会降低代码的可读性。如果您需要更多解释,请询问。这是一个有效的示例,但不理解的复制只会在将来带来更多问题;)public static class Hand
用于不需要SilasalMgrens6lCardCreate对象的内部类。或单独的文件。我同意简单的复制和粘贴将在将来引起问题。此外,按原样转换示例将使用我在类中尚未学习的代码。我目前正在开发一个使用s来自您和RaiseLtwiCe答案的部分。现在情况好多了,我的墙感谢您保存它。您找到答案了吗?为什么在子文件中使用几个类?使代码可读性降低。将在稍后尝试您的代码编辑我的答案,如果您需要更多解释,请询问。这是一个工作示例,但复制w没有理解只会在将来带来更多问题;)public static class Hand
用于内部类,而不需要SilasalMgrens6lCardCreate对象。或单独的文件。我同意简单的复制和粘贴将在将来导致问题。此外,按原样转换示例将使用我没有看到的代码位已经在课堂上获得。我目前正在研究一个解决方案,使用您和RaiseLtwiCe答案中的片段。现在情况好多了,我的墙感谢您保存它。您找到了吗?这似乎解决了“无法解决类型问题,但现在我在同一行上得到提示:”没有封闭的类型实例e SilasalMgrens6lCardCreate是可访问的。必须使用SilasalMgrens6lCardCreate类型的封闭实例限定分配(例如x.new A(),其中x是SilasalMgrens6lCardCreate的实例)“我对Java还是很陌生,这个问题到底意味着什么?我将很快更新我的答案,并提供更多详细信息。请稍候;)这似乎解决了“无法解析为类型问题”,但现在我在同一行上得到提示:“无法访问SilasalMgrens6lCardCreate类型的封闭实例。必须限定分配。”一个silasalmgrens6lcardcreate类型的封闭实例(例如x.new A(),其中x是silasalmgrens6lcardcreate的实例)。“我对Java还是很陌生,这个问题到底意味着什么?我将很快更新我的答案,并提供更多详细信息。请稍候;”
import java.util.ArrayList;
import java.util.List;
public class Hand {
private int points = 0;
private int numberOfCards = 0;
private List<Card> hand = new ArrayList<>();
public Hand(List<Card> cards) {
hand.addAll(cards);
numberOfCards += cards.size();
for(Card card: cards){
points += card.points;
}
} //End hand constructor
public void addCard(Card card){
hand.add(card);
points += card.points;
numberOfCards += 1;
}
public int getNumberOfCards() {
return numberOfCards;
}
public int getPoints() {
return points;
}
}
public class Card {
String suit, name;
int points;
Card(int n1, int n2) {
suit = getSuit(n1);
name = getName(n2);
points = getPoints(name);
} //End card class
public String toString() {
return "The " + name + " of " + suit;
} //End toString
public String getName(int i) {
if (i == 1) return "Ace";
if (i == 2) return "Two";
if (i == 3) return "Three";
if (i == 4) return "Four";
if (i == 5) return "Five";
if (i == 6) return "Six";
if (i == 7) return "Seven";
if (i == 8) return "Eight";
if (i == 9) return "Nine";
if (i == 10) return "Ten";
if (i == 11) return "Jack";
if (i == 12) return "Queen";
if (i == 13) return "King";
return "error";
} //End getName String
public int getPoints(String n) {
if (n == "Jack" || n == "Queen" || n == "King" || n == "Ten")
return 10;
if (n == "Two")
return 2;
if (n == "Three")
return 3;
if (n == "Four")
return 4;
if (n == "Five")
return 5;
if (n == "Six")
return 6;
if (n == "Seven")
return 7;
if (n == "Eight")
return 8;
if (n == "Nine")
return 9;
if (n == "Ace")
return 11;
return -1;
} //End int getPoints
public String getSuit(int i) {
if (i == 1) return "Diamonds";
if (i == 2) return "Clubs";
if (i == 3) return "Spades";
if (i == 4) return "Hearts";
return "error";
} //End getSuit String
} //End Deck class