2016-12-28 1 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

예, compare() 메소드 내에서 compare()를 호출하지 마십시오. 또한 왜 당신은 클래스, Deck, 같은 이름의 필드 인 Deck ArrayList를 제공합니까? 그러면 우리 모두와 미래가 혼란 스러울 것입니다. –

+0

이렇게 말하면 사용자 인터페이스를 핵심 구조 클래스와 무차별 적으로 섞으면 전체 프로그램 구조가 손상됩니다. 이것을 다시 작성하고 사용자 인터페이스를 갑판에서 꺼내십시오. –

+0

@HovercraftFullOfEels 이름에 대해 유감스럽게 생각합니다. 저는 자바를 처음 사용하고 있으며 휴식이 필요한 가난한 습관을 몇 가지 설정했습니다./그래서 전쟁이있는 경우 별도의 방법을 쓰고 내 비교 방법을 사용하는 것이 좋습니다.) 방법 거기? 고마워, 이것이 내 첫 번째 완전히 독립적 인 프로젝트 였고 너무 잘 계획하지 못했지만 적어도 학습 경험이었습니다 :) – RyanWantsToLearn

답변

1

및 내 클래스는 재귀 잘하지 않는 외에이 오류도 무엇을 의미하는지에 관해서는 약간의 지식을 가지고있다.

예, 코드에 재귀가 있으며 쉽게 찾을 수 있습니다. 당신은 문제가 compare 메소드 내에서 발생한다는 것을 알고 있으므로, 그 메소드 내에서 compare()을보고 메소드 호출이있는 곳을 찾아야한다.

해결 방법은 그 자체로 메서드를 호출하는 것이 아니라 어쨌든이 메서드를 호출해야하는 이유는 무엇입니까?

클래스 구조가 손상 되었기 때문에 부분적으로 문제가 발생했습니다. 데크 클래스는 카드 갑판의 구조와 동작을 나타내는 클래스입니다. public void shuffle()과 같은 메서드 (예 : public Card Deal() 등)가 있어야합니다. 그것은 직접적으로 사용자와 상호 작용하는 코드를 가져서는 안되며,이 코드는 드라이버 나 Game 클래스 나 다른 클래스로 옮겨야합니다.

나는 플레이어 클래스의 플레이어 클래스를 갖고 싶다고 생각한다.이 클래스의 내부에는 아마도 현재 핸드를 다른 핸드와 비교하는 비교 메서드가있다. 매개 변수

게임 클래스에는 1 개 이상의 플레이어 개체가있는 데크를 보유하고있는 승자 나 추첨이있을 때 끝나는 재생을 제어하는 ​​게임 루프가 있어야합니다.

예를 들어,

public enum Value { 
    //.... 
}  

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

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

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

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

고마워요! 조금 실망한 느낌이지만 다시 시작할 수 있고 빠르게 속도를 낼 수 있다고 생각합니다. 좋은 학습 곡선과 나는 이것이 내 개선 동기를 자극 할 것이라고 생각한다. – RyanWantsToLearn

+0

능력을 조금 넘는 프로젝트를 진행하는 것이 가장 좋은 방법입니다. 다른 개발자에게 나쁜 습관을 해결하는 데 도움이되는 코드를 보여주는 것을 주저하지 마십시오. 행운을 빕니다. – Sharcoux

1

이 코멘트 더이지만 너무 오래되었다

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 Deck { 
    private List<Card> cards = new ArrayList<>(); 

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

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

    //.... 

} 

.

이 코드에 대해 많은 이야기가 있습니다. 스위치 케이스 대신에 if를 사용하십시오. 또는 적어도 다른 경우 사용하십시오. 내부에서 사례를 사용한다면 for 루프의 요점은 무엇입니까? 만약 당신이 suitNum 변수를 증가 시킨다면 'i'변수는 무엇입니까? 방법에 대문자를 사용하지 마십시오. 수업 만. Random이 변수를 편집하고 void를 반환하는 이유는 무엇입니까?random()이 원하는 결과를 반환하고 쓸데없는 변수 'rnd'를 없애는 것이 더 논리적 일 것입니다.

더 많은 이야기가 있지만 좋은 시작입니다. 즉, 오류에 관해서는, 스택 오버플로는 프로그램이 너무 많은 메모리를 사용하고 있음을 의미합니다. 이는 특히 무한 재귀 루프가 포함 된 코드에서 일반적입니다. 여기서, 무한 재귀는 compare 메쏘드 안에서 호출 된 compare 메소드에 의한 것입니다 ...

관련 문제