2017-10-28 55 views
1

這是我第一次在論壇上發帖,我不完全確定我的問題是否有效,但我會盡量具體並遵循指導原則。遵循指導原則,這是一個基於班級作業的問題。這項任務是創建一個代表一副牌並添加幾個特徵的'甲板'對象的代碼。我目前被困在這個過程中。無法讓卡片/卡片目標程序正常工作

我的問題就在於這個代碼中:

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 

}

大部分此類項目已經具備了任務,但我們要增加幾個功能。這些功能中的第一個功能是一種洗牌方法,我可以做到。在下一個功能中,我們將創建一個'Hand'類,向用戶交付一張牌並計算他們有多少點,就好像它是一個二十一點遊戲。 這是這一步的確切用詞是:

'添加一個包含5個卡片引用數組的Hand類。讓程序處理兩手牌並將其顯示給用戶。告訴用戶他們有多少分,並詢問他們是否需要另一張卡。繼續允許玩家添加卡,直到他們達到5張卡或總數大於21張。「

我已經通過幾種方式,我覺得我可以創建這個類,但似乎沒有工作。目前的迭代與我已經接近。不過,我目前很難過。我的問題是;我不知道爲什麼當我嘗試使用Hand類時出現類型錯誤,但我不知道如何實現getPoints()方法。創建Hand類後有幾個步驟,但如果我能弄清楚如何使這個類工作,我相信我可以通過它們。我處在我的牆上打孔的邊緣,所以任何幫助修復這個代碼都是絕對值得讚賞的。

+0

?使代碼不易讀。稍後嘗試你的代碼 – Stefan

+0

編輯我的答案,如果你需要更多的解釋請問。這是一個有用的例子,但是沒有理解的複製只會給未來帶來更多的問題;) – Stefan

+0

'公共靜態類Hand'用於內部類而不需要SilasAlmgrenS6L1CardCreate對象。或者一個單獨的文件。 –

回答

0

第一個問題是您的Hand類是您的靜態類Deck的子類。這樣你不能在你的main方法中使用它,因爲那不是封閉的類。

編輯

因此,我在這裏做了一點小事。希望它對你有意義。

首先,我們有你的主要課程。爲了不想輸入那個長名字,我重命名了它。我將你的HandDeck對象添加爲變量,因爲這隻手不屬於甲板或其他方式,但它們都是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 class Deck { 

private Card[] cardArray = new Card[52]; 
private int currentIndex = 0; 

public 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 
} 

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 

public Card[] getCardArray() { 
    return cardArray; 
} 

public Card getRandomCard(){ 
    Card nextCard = cardArray[currentIndex]; 
    currentIndex += 1; 
    return nextCard; 
} 


//And ends here 
///////////////////////////////////////////////// 


public void print() { 
    for (int i = 0; i < cardArray.length; i++) 
     System.out.println(cardArray[i]); 
} //End print loop 
} 

手工類 addCard更新點,以便隨時得到numberOfCards或點,權值返回

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 
+0

這似乎解決了'無法解決類型問題,但現在我在同一行提示:'沒有可以訪問SilasAlmgrenS6L1CardCreate類型的封閉實例。必須用SilasAlmgrenS6L1CardCreate類型的封閉實例來限定分配(例如,x.new A(),其中x是SilasAlmgrenS6L1CardCreate的一個實例)。我對Java仍然很陌生,這個問題究竟意味着什麼? –

+0

我會盡快更新我的答案,詳細信息。掛在那裏;) – Stefan

-1

首先,您的Hand類位於Deck類中,因此您無法直接訪問它。你必須寫:

Deck.Hand f = new Deck.Hand(d); 

但手工類的構造函數仍然unaccessable,所以你必須讓你的手類的靜態拿到手類的訪問方法(構造函數的方法)。

public static class Hand 

UPDATE:此代碼是關於你爲什麼在子文件使用幾類獲得卡的積分總和在你的手

public static 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]); 
      //UPDATED 
      System.out.println("You have " + getPointsSum(playerHand)); 

     } 
     public int getPointsSum(Card[] playerHand) 
     { 
      int pointsSum = 0; 
      for (int i = 0; i < playerHand.length ; i++) { 
       pointsSum += playerHand[i].points; 
      } 
      return pointsSum; 
     } 
    } 
+0

WOO!這兩個人允許我使用這個班,並將兩張卡片顯示給用戶。我一直在繼續嘗試和開發這個程序,但我仍然對如何使用已經提供給我的'getPoints'方法感到困惑。在計算Hand類內的點數時,語法看起來如何? –

+0

我已經更新了答案。 – RaiseLtwiCe

+0

我會用這個方法來初始化Card類的「points」字段,並使用另一種方法(現在在我的回答中)代替。 – RaiseLtwiCe