2013-10-18 55 views
0

我正在試圖製作一個模擬紙牌遊戲戰爭的程序。空指針異常Java卡牌遊戲戰爭

類Project2的

package proj2; 
import java.util.Scanner; 

public class Project2 { 

public static void main(String[ ] args) 
{ 
    Scanner keybd = new Scanner(System.in); 

    // Get player names 
    System.out.println("Welcome to WAR!!"); 
    System.out.print("Please enter player 1's name: "); 
    String p1Name = keybd.nextLine(); 
    System.out.print("Please enter player 2's name: "); 
    String p2Name = keybd.nextLine(); 

    // Get random number generator (RNG) seed and initialize the game 
    System.out.print ("Please enter the RNG seed for shuffling: "); 
    long rngSeed = keybd.nextLong(); 
    Game war = new Game(p1Name, p2Name, rngSeed); 
    int turn = 1; 

    // While game is being played, print details and results of each turn 
    while (!war.gameComplete()) 
    { 
     System.out.printf("Turn %2d\n", turn); 
     System.out.println("-----"); 
     System.out.println(war.nextTurn()); 
     ++turn; 
    } 

    // All turns complete; print the game results 
    System.out.println("Game Over!!"); 
    System.out.println(war.gameResult()); 
    } 
} 

類遊戲:

package proj2; 
public class Game { 
private Deck deck; 
private Player player1; 
private CardPile p1Deck; 
private Player player2; 
private CardPile p2Deck; 
private int warCount; 
private int turns; 
public Game(String p1, String p2, long rngSeed) 
{ 
    this.deck = new Deck(); 
    deck.Shuffle((int) rngSeed); 
    this.player1 = new Player(p1, 0, 0); 
    this.p1Deck = new CardPile(deck.Deal()); 
    this.player2 = new Player(p2, 0, 0); 
    this.p2Deck = new CardPile(deck.Deal()); 
    this.turns = 1; 
    this.warCount = 0; 
} 

public String nextTurn() 
{ 
    p1Card = p1Deck.drawCard(); 
(ERROR)---> String p1Turn = player1.getName() + " shows " + p1Card.cardString(); 
    Card p2Card = p2Deck.drawCard(); 
    String p2Turn = player2.getName() + " shows " + p2Card.cardString(); 
    String winner = ""; 
    if(p1Card.getValue() > p2Card.getValue()) 
    { 
     Card[] wonCards = new Card[2]; 
     wonCards[0] = p1Card; 
     wonCards[1] = p2Card; 
     p1Deck.addCard(wonCards, 2); 
     player1.setCardsWon(wonCards.length); 
     winner = player1.getName() + " wins 2 cards" ; 
    } 
    if(p2Card.getValue() > p1Card.getValue()) 
    { 
     Card[] wonCards = new Card[2]; 
     wonCards[0] = p2Card; 
     wonCards[1] = p1Card; 
     p1Deck.addCard(wonCards, 2); 
     player2.setCardsWon(wonCards.length); 
     winner = "/n" + player2.getName() + " wins 2 cards"; 
    } 
    String warTurn = ""; 
    if(p1Card.getValue() == p2Card.getValue()) 
    { 
     this.warCount = warCount + 1; 
     warTurn = "WAR!!"; 
     Card[] wonCards = new Card[8]; 
     while(p1Card.getValue() != p2Card.getValue()) 
     { 
      wonCards[0] = p1Deck.drawCard(); 
      wonCards[2] = p1Deck.drawCard(); 
      wonCards[4] = p1Deck.drawCard(); 
      Card p1WarCard = p1Deck.drawCard(); 
      wonCards[6] = p1WarCard; 
      wonCards[1] = p2Deck.drawCard(); 
      wonCards[3] = p2Deck.drawCard(); 
      wonCards[5] = p2Deck.drawCard(); 
      Card p2WarCard = p2Deck.drawCard(); 
      wonCards[7] = p2WarCard; 
      if(p1WarCard.getValue() > p2WarCard.getValue()) 
      { 
       p1Deck.addCard(wonCards, wonCards.length); 
       player1.setCardsWon(wonCards.length); 
      } 
      if(p2WarCard.getValue() > p2WarCard.getValue()) 
      { 
       p2Deck.addCard(wonCards, wonCards.length); 
       player2.setCardsWon(wonCards.length); 
      } 
     } 
    } 
    String turnResults = p1Turn + "/n" + p2Turn + "/n" + warTurn + winner; 
    return turnResults; 
} 

public boolean gameComplete() 
{ 
    boolean result = false; 
    if(turns == 20) { 
     result = true; 
    } 
    return result; 
} 

public String gameResult() 
{ 
    String p1Result = (player1.getName() + " won " + player1.getCardsWon() + "and" 
      + player1.getWarsWon() + "war(s)" + "/n"); 
    String p2Result = (player2.getName() + " won " + player2.getCardsWon() + "and" 
      + player1.getWarsWon() + "war(s)" + "/n"); 
    String winner = ""; 
    if(player1.getCardsWon() > player2.getCardsWon()) 
    { 
     winner = "Winner: " + player1.getName(); 
    } 
    if(player2.getCardsWon() < player2.getCardsWon()) 
    { 
     winner = "Winner: " + player2.getName(); 
    } 
    if(player1.getCardsWon() == player2.getCardsWon()) 
    { 
     winner = "Game is a draw"; 
    } 
    String finalResult = ("Game Over!!" + "There were " + warCount 
      + "war(s)" + p1Result + "/n" + p2Result + "/n" + winner); 
    return finalResult; 
    } 
} 

當我試圖訪問類的卡,我得到一個空指針異常錯誤。我不確定是什麼導致了錯誤。

public class Card { 

    private char rank; 
    private String suit; 
    private int value; 

    public Card(char rank, String suit, int value) 
    { 
     this.rank = rank; 
     this.suit = suit; 
     this.value = value; 
    } 

    public char getRank() 
    { 
     return rank; 
    }  

    public String getSuit() 
    { 
     return suit; 
    } 

    public int getValue() 
    { 
     return value; 
    } 

    public String cardString() 
    { 
     String card = (rank + " of " + suit); 
     return card; 
    } 
} 

我試着用google搜索解決方案,它告訴我在引用對象之前初始化對象。我嘗試初始化,但它仍然產生空指針異常錯誤。

我得到的錯誤是這個。

Exception in thread "main" java.lang.NullPointerException 
    at proj2.Game.nextTurn(Game.java:29) 
    at proj2.Project2.main(Project2.java:37) 

drawCard()方法來自這個類。

package proj2; 

public class CardPile { 

    private Card[] playerDeck; 

    public CardPile(Card[] deck) 
    { 
     this.playerDeck = deck; 
    } 

    public Card drawCard() 
    { 
     Card topCard = playerDeck[0]; 
     Card[] newPlayerDeck = new Card[playerDeck.length - 1]; 
     int counter = 0; 
     for(int i = 1; i < playerDeck.length; i++) 
     { 
      newPlayerDeck[counter] = playerDeck[i]; 
      counter++; 
     } 
     this.playerDeck = newPlayerDeck; 
     return topCard; 
    } 
} 
+0

那麼哪一行會拋出異常? – Jason

+0

請發佈您的stacktrace的相關部分 –

+0

另外,您的'Deck.drawCard'返回的是什麼? – Amadan

回答

0

它返回一個NULL點異常,因爲你沒有傳遞任何參數。嘗試傳遞參數給你的構造函數。

e.g

Card p1Card = new Card(rank,suit,value); 
Card p2Card = new Card(rank,suit,value); 
+0

如果是這樣的問題,它會導致*編譯時錯誤*而不是*運行時錯誤* – amit

0

由於p1Card空,則p1Deck.drawCard()返回null - 這意味着playerDeck [0]是零,這意味着新的CardPile(deck.Deal());創建並清空甲板,這意味着甲板上有些問題.Deal()。 「有些東西是錯誤的」,我的意思是它可能會創建並返回一個帶有空值的數組,如:[null,null,null,null,null](或者可能是第一個值是唯一的空值)。

+0

據他介紹,他已經測試過並且p1Card爲空。 – CodingBird

+0

是的,當我看到玩家是如何創建的時,我自己想到了這一點=) – Plux