2013-12-18 105 views
0

在我的游戏代码中,我试图添加一张牌。只要我这样做,我的阵列就出界了。一切看起来不错,但也许我错过了一些东西。Java数组索引超出界限?

仅供参考,一个和两个是播放器实例。从主类相关的代码(约格式化对不起,我吮吸将其转移到堆栈溢出):

import java.util.*; 

public class Program { 

    public static void main(String args[]) { 
     String[] rank = {"two", "three", "four", "five", "six", "seven", "eight", 
        "nine", "ten", "jack", "queen", "king", "ace"}; 
     String[] suit = {"hearts", "diamonds", "spades", "clubs"}; 
     Scanner scan = new Scanner(System.in); 
     String something = "yes", something2 = "yes"; //Use with while loop 
     String winner = "yes"; //Use for while loop 
     String temp; //Use with setting names 
     Card[] deck = new Card[52]; //Deck array 
     int playercount = 0; 
     Player one = new Player("temp"); 
     Player two = new Player("temp"); 
     Player three = new Player("temp"); 
     Player four = new Player("temp"); 

     while (something2.equals("yes") || playercount < 2) { //Add players to game 

      System.out.println("Would a(nother) player like to join?"); 
      something2 = scan.nextLine(); 
      System.out.println(); 
      if (something2.equals("yes")) { 
       if (playercount <= 4) { 
        if (playercount == 0) { 
         System.out.println("What is your name: "); 
         Player one1 = new Player(scan.nextLine()); 
         one = one1; 
         playercount++; 
         System.out.println(); 
        } 
        else if (playercount == 1) { 
         System.out.println("What is your name: "); 
         Player two2 = new Player(scan.nextLine()); 
         two = two2; 
         playercount++; 
         System.out.println(); 
        } 
        else if (playercount == 2) { 
         System.out.println("What is your name: "); 
         Player three3 = new Player(scan.nextLine()); 
         three = three3; 
         playercount++; 
         System.out.println(); 
        } 
        else if (playercount == 3) { 
         System.out.println("What is your name: "); 
         Player four4 = new Player(scan.nextLine()); 
         four = four4; 
         playercount++; 
         System.out.println(); 
        } 
        else {System.out.println("Only four players are allowed."); 
         something2 = "no";} 
       } 
      } 
      else if (playercount < 2) { 
       System.out.println("You need at least two players..."); 
       System.out.println(); 
      } 
      else something2 = "no"; 
     } 

     //Start game 
     while (something.equals("yes")) { 
      //Prepare game 
      Card.makeDeck(deck, rank, suit); 
      deck = Card.getDeck(); 
      Card.shuffle(deck); 
      deck = Card.getDeck(); 

      //Deal cards 
      if (playercount == 2) { 
       for (int i = 1; i < 8; i++) { 
        one.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        two.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
       } 
      } 
      else if (playercount == 3) { 
       for (int i = 1; i < 8; i++) { 
        one.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        two.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        three.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
       } 
      } 
      else { 
       for (int i = 1; i < 8; i++) { 
        one.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        two.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        three.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
        four.addCard(Card.draw(deck)); 
        deck = Card.getDeck(); 
       } 
      } 
     } 
    } 
} 

卡类:

import java.util.*; 

public class Card { 
    private String suit; 
    private String rank; 
    private static int temp = 0, temp2 = 0; //Use for reseting rank and suit 
    private static Card temp3; //Use for draw method 
    private static int temp4; //Use for shuffle method 
    private static Card[] deck = new Card[52]; 

    //Constructors 
    public Card() { 
     this.rank = "two"; 
     this.suit = "hearts"; 
    } 
    public Card(String r, String s) { 
     this.rank = r; 
     this.suit = s; 
    } 

    //Mutators 
    //Make deck 
    public static void makeDeck(Card[] c, String[] r, String[] s) { 
     for (int i = 0; i < c.length; i++) { 
      c[i] = new Card(r[temp], s[temp2]); 
      temp++; temp2++; 
      //Reset rank and suit 
      if (temp > 12) 
       temp = 0; 
      if (temp2 > 3) 
       temp2 = 0; 
     } 
     deck = c; 
    } 

    //Accessors 
    //Return deck 
    public static Card[] getDeck() { 
     return deck; 
    } 
    //Shuffle 
    public static Card[] shuffle(Card[] c) { 
     for (int i = 0; i < c.length; i++) { 
      int rand = (int)(Math.random()*(i + 1)); 
      //Don't let anything be in a slot that doesn't exist 
      while (rand > c.length) { 
       temp4 = (int)Math.random(); 
       rand -= temp4; 
      } 
      if (rand < 0) 
       rand += temp4; 
       Card temp = c[i]; 
       c[i] = c[rand]; 
       c[rand] = temp; 
     } 
     deck = c; 
     return deck; 
    } 
    //Draw 
    public static Card draw(Card[] c) { 
     if (c != null) { 
     for (int i = 0; i < c.length; i++) { 
     if (c[i] != null) { 
      try { 
        return c[i]; 
       } finally { 
        c[i] = null;} //Remove i from c 
      } 
     } 
     }  
     return null; 
    } 
} 

Player类:

import java.util.*; 

public class Player { 
    private String name; 
    private Card[] hand = new Card[52]; 
    private int handsize = 0; 

    //Constructor 
    public Player(String n) { 
    name = n; 
    } 

    //Mutators 
    public void addCard(Card c) { 
     hand[handsize] = c; 
     handsize++; 
    } 

    //Accessors 
    public String getName() { 
     return name; 
    } 
    public Card[] getHand() { 
     return hand; 
    } 
} 
+2

与您的错误没有关系,但这些Player方法/变量都不应该是静态的。 –

+0

我不认为你的错误出现在你发布的代码中。你能展示你的整个程序吗? –

+0

@DavidWallace https://compilr.com/bottomsniffer/final/Card.java – William

回答

0

问题是与你的循环

while (something.equals("yes")) 

有没有什么设置something为任何其他值的,所以这个循环只是善有善报不休,直到所有的球员都有超过52张牌。一旦有人拥有超过52张卡片,添加一张新卡片会导致异常。

我认为你需要删除这个while。它内部的代码只能运行一次。

+0

谢谢。我会摆脱它,看看这是否解决了我的问题,但我需要它能够重放我的游戏。 – William

+0

我才意识到我的一些代码失踪,当我跑它由于某种原因..我补充回来,我仍然得到同样的错误......它不是while循环。 – William

+0

你的意思是,它不是while循环。 @David提供了明确的解释,这是严重的问题。如果你想重播你的游戏,你必须重新在玩家手中的牌(即重置handsize为0每while循环(如果你认为球员应该只有8在给定的时间卡) – Mani

1

你平局方法被破坏。

// get the first non-null Card from the cards "c". 
public static Card draw(Card[] c) { 
    if (c != null) { 
    for (int i = 0; i < c.length; i++) { 
     if (c[i] != null) { 
     try { 
      return c[i]; 
     } finally { 
      // now remove element i from the `c` array. 
      c[i] = null; 
     } 
     } 
    } 
    } 
    return null; 
} 
+0

原始'draw'方法破坏的方式是什么?对我来说这看起来很好,除了它会在牌组中创建大量最后一张牌的副本(这不会导致ArrayIndexOutOfBoundsException)。 –

+0

@DavidWallace你看不到线路'c = deck;'的问题? –

+0

只是把它放在里面,我在同一个地方也有同样的错误。它发生在我的玩家类的手里[handsize] = c; 其他部分在我所在的位置one.addCard(...); – William

0

我觉得你的代码的顺序是不正确的(很难用这个代码告诉)

for (int i = 1; i < 8; i++) 
{ 
one.addCard(Card.draw(deck)); 
deck = Card.getDeck(); 
two.addCard(Card.draw(deck)); 
deck = Card.getDeck(); 
} 

也许应该

for (int i = 1; i < 8; i++) 
{ 
deck = Card.getDeck(); 
one.addCard(Card.draw(deck)); 
deck = Card.getDeck(); 
two.addCard(Card.draw(deck)); 
} 

更新

而且

public void addCard(Card c) { 
    hand[handsize] = c; 
    handsize++; 
} 

handsize永远不会增加 - 它始终是0

+0

我有一个 甲板= Card.getDeck(); 但它没有显示。我的整个代码是https://compilr.com/bottomsniffer/final/Program.java – William

+0

对不起,我不希望在另一个网站在这里为了回答您的问题进行登记。为什么不发布相关的代码。 –

+0

我将现在发布全部 – William