2016-12-28 14 views
0

自由な時間に戦争の自動生成ゲームを開発しているうちに、「StackOverFlow」エラーが発生しました。このスタックオーバーフローエラーを修正する方法に関するアドバイスはありますか? Java

エラーが発生したDeckクラスは次のとおりです。 これはcompare()メソッドで発生します。このエラーを回避するために私が何ができるかについての洞察は、私がこれを修正するために何ができるかを理解するのに苦労しているので、このエラーが再帰がうまくいっていないことを意味しています。ありがとう!

import java.util.*; 
import java.math.*; 
public class Deck 
{ 
    private int num = 0; 
    private int cardnum2 = 0; 
    private int cardnum = 0; 
    private int decrease = 0; 
    private int rnd = 0; 
    private int winner = 0; 
    private String suit = " "; 
    private int suitNum = 0; 
    private int val = 1; 
    private String name = ""; 
    private ArrayList<Card> Deck = new ArrayList<Card>(); 
    private Card[] cardCheck = new Card[51]; 
    private ArrayList<Card> play1 = new ArrayList<Card>(); 
    private ArrayList<Card> play2 = new ArrayList<Card>(); 
    public Deck() 
    { 
     createDeck(); 
    } 
    public void createDeck() 
    { 
     for(int i = 0; i < 4; i++) 
     { 
      val = 1; 
      suit = " "; 
      name = " "; 
      suitNum++; 
      System.out.println(); 
      System.out.println(); 
      for(int z = 0; z < 13; z++) 
      { 
       if(suitNum == 1) 
       { 
        suit = "Hearts"; 
       } 
       if(suitNum == 2) 
       { 
        suit = "Diamonds"; 
       } 
       if(suitNum == 3) 
       { 
        suit = "Spades"; 
       } 
       if(suitNum == 4) 
       { 
        suit = "Clubs"; 
       } 
       if(val == 1) 
       { 
        name = "Ace"; 
       } 
       else if(val == 11) 
       { 
        name = "Jack"; 
       } 
       else if(val == 12) 
       { 
        name = "Queen"; 
       } 
       else if(val == 13) 
       { 
        name = "King"; 
       } 
       else { 
        name = ""; 
       } 
       Card myCards = new Card(val, suit, name); 
       Deck.add(myCards); 
       System.out.print(myCards + " "); 
       val++; 
      } 
     } 
    } 
     public void Deal() 
     { 
      int size = 52/2; 
      for(int i = 0; i < size; i++) 
      { 
        Random(); 
        for(int z = 0; z < cardCheck.length; z++) 
        { 
         if(cardCheck[i] == null) 
         { 
          cardCheck[i] = Deck.get(rnd); 
          play1.add(cardCheck[i]); 
          System.out.println(play1); 
         } 
         else 
         { 
          Random(); 
         } 
        } 
      } 
      System.out.println(); 
      System.out.println(); 
      for(int i = 0; i < size; i++){ 
       Deck.remove(play1.get(i)); 
      } 
       for(int i = 0; i < size; i++){ 
        play2.add(Deck.get(i)); 
      } 
      for(int i = 0; i < size; i++) 

      { 
       System.out.println(play2.get(i)); 
      } 
    } 
    public void Random() 
    { 
     rnd = (int)(Math.random() * 52) - decrease; 
    } 

    public void flip() 
    { 
     if(play1.indexOf(cardnum) >= play1.size() || play2.indexOf(cardnum2) >= play2.size()) 
     { 
     cardnum = (int)(Math.random() * play1.size()); 
     System.out.println(play1.get(cardnum)); 
     cardnum2 = (int)(Math.random() * play2.size()); 
     System.out.println(play2.get(cardnum2)); 
     } 
    } 
    public void compare() 
    { 
     System.out.println("War!!!\n"); 
     if(play1.get(cardnum).getNum() > play2.get(cardnum2).getNum()) 
     { 
      System.out.println(); 
      winner = 1; 
      System.out.println(play1.get(cardnum) + " vs " + play2.get(cardnum2)); 
      play1.add(play2.get(cardnum2)); 
      play2.remove(cardnum2); 
      System.out.println("Player 1 took the cards!"); 
      System.out.println(); 
      printDecks(); 
     } 
     if(play1.get(cardnum).getNum() < play2.get(cardnum2).getNum()) 
     { 
      System.out.println(); 
      winner = 2; 
      System.out.println(play1.get(cardnum) + " vs " + play2.get(cardnum2)); 
      play2.add(play1.get(cardnum)); 
      play1.remove(cardnum); 
      System.out.println("Player 2 took the cards!"); 
      System.out.println(); 
      printDecks(); 
      } 
     if(play1.get(cardnum).getNum() == play2.get(cardnum2).getNum()) 
     { 
      System.out.println(); 
      System.out.println(play1.get(cardnum) + " vs " + play2.get(cardnum2)); 
      System.out.println("War!!"); 
      winner = 0; 
      flip(); 
      flip(); 
      flip(); 
      compare(); 
      System.out.println(); 
      printDecks(); 
     } 
     } 

    public void playW() 
    { 
     while(play1.size() > 0 || play2.size() > 0) 
     { 
      flip(); 
      compare(); 
     } 
    } 
    public void printDecks() 
    { 
     for(int i = 0; i < play1.size(); i++) 
     { 
      System.out.print(play1.get(i) + " "); 
     } 
     System.out.println(); 
     for(int i = 0; i < play2.size(); i++) 
     { 
      System.out.print(play2.get(i) + " "); 
     } 
     System.out.println(); 
     System.out.println("Player 1 has: " + play1.size() + " cards"); 
     System.out.println("Player 2 has: " + play2.size() + " cards"); 
    } 
} 
+3

はい、比較 '呼び出すことはありません...比較メソッド内で呼び出されるメソッドの比較によるものである()' '***比較()'メソッド内。また、なぜあなたはクラス、デッキ、同じ名前のフィールド、デッキArrayListを与えているのですか?それだけでなく、私たちも将来もあなたを混乱させます。 –

+0

このように言えば、ユーザーインターフェイスを主要な構造クラスに無差別に混ぜることで、プログラム構造全体が壊れてしまいます。これを書き直して、デッキからユーザーインターフェイスを取り出してください。名前については申し訳ありません –

+0

@HovercraftFullOfEelsは....私は、Javaに新しいですし、私は分割する必要があるいくつかの貧しい人々の習慣確立しています:だから、あなたがそこに戦争があると(私の比較を使用して、私は場合には、別の方法を記述し推薦する/し)メソッドがありますか?ありがとう、これは私の最初の完全に独立したプロジェクトであり、私はそれをあまりうまく計画していませんでしたが、少なくとも学習経験でした:) – RyanWantsToLearn

答えて

1

と私のクラスは、再帰がうまく行われていないほか、このエラーも何を意味するのかに関して、少しの知識を持っています。

はい、コードには再帰があり、簡単に見つけることができます。あなたは問題がcompareメソッドから来ていることを知っているので、そのメソッド内でcompare()を調べて、メソッド呼び出しのどこにいるのかを調べるだけです。

解決策は、それ自体の中でメソッドを呼び出すのではなく、どうしてこのようにしなければならないのですか?

クラス構造が壊れていることが原因の一部です。デッキクラスは、カードのデッキの構造と振る舞いを表現するクラスです。public void shuffle()のようなメソッド(public Card Deal()など)を持つ必要があります。ユーザーと直接対話するコードを持つべきではありません。このコードは、おそらくドライバやゲームクラスのどこか、あるいは別のクラスとして使用する必要があります。

私はあなたがハンドクラスを持っていると思っています。ハンドクラスはプレーヤーの手を保持していて、おそらくこのクラスの中には、現在のハンドを別のハンドと比較する比較メソッドがあります。パラメータ。

ゲームクラスには、1つまたは複数のプレーヤーオブジェクトを保持するデッキを保持する勝者またはドローがあるときに終了する、プレイを制御するゲームループが必要です。

例えば、

public enum Suit { 
    CLUBS, DIAMONDS, HEARTS, SPADES 
} 

public enum Value { 
    //.... 
}  

public class Card { 
    private Suit suit; 
    private Value value; 

    // TODO: constructor, methods including equals, hashCode 
} 

public class Deck { 
    private List<Card> cards = new ArrayList<>(); 

    public Card deal() { 
     return cards.remove(0); 
    } 

    public void shuffle() { 
     Collection.shuffle(cards); 
    } 

    //.... 

} 

class Player { 
    // either use a List in each Player or create a class called hand 
    private List<Card> hand; 
    private int cash; 
    private String name; 
    private Game game; 

    // TODO: constructor 
    // TODO: methods including receiveCard(Card c), List<Card> showHand(),... 
} 

public class Game { 
    private Player p1; 
    private Player p2; 
    private Deck deck; 
    private int moneyPot; 
+0

ありがとうございました!私は少し落胆しているように感じますが、私は再起動して迅速にスピードアップできると思います。良い学習曲線と私はこれが私のモチベーションを向上させ続ける燃料になると思います。 – RyanWantsToLearn

+0

あなたの能力を少し上回るプロジェクトを進めることが最善の方法です。あなたの悪い習慣を修正するのを助けるために、あなたのコードを他の開発者に示すことをためらってください。がんばろう。 – Sharcoux

1

これは、より多くのコメントですが、それはあまりにも長くなりました。

このコードについては、多くのことが言えます。 ifの代わりにswitch caseを使用してください。または、少なくとも他の場合に使用します。ケースを内部で使用する場合、forループのポイントは何ですか?あなたがsuitNum変数をインクリメントした場合の 'i'変数は何ですか?メソッドに大文字を使用しないでください。クラスのみ。なぜRandomは変数を編集してvoidを返しますか?そこ言ってより多くのですが、それは良いスタートであるあなたが望む結果、あなたは役に立たない変数「RND」が無料になります。この方法を返すランダム()という

より論理的だろう。要するに、あなたのエラーについては、スタックオーバーフローはあなたのプログラムが多すぎるメモリを使用していることを意味します。これは、無限ループを含むコードで特に一般的です。ここでは、無限の再帰が

関連する問題