2014-09-11 2 views
0

저는 Java에 익숙하지 않지만 제한된 지식을 사용하여 손가락 게임 'Sticks'를 시뮬레이션하려고합니다. 이것은 가장 깔끔한 것은 아니지만, 제게 뭔가를하도록 제 제안을한다면, 그 내용을 설명하는 페이지를 링크하면됩니다.메서드에서 int 값 반환 java

좋아, 나는 그것이하며 최대 5에 "계산"의 값을 반환하려고 차례 사람을 결정하는 메소드를 호출하지만 복귀하지 때 문제는 기본적으로 온다 그래서 주()

public static int TurnCalcBB(int PLH, int PRH, int BRH, int BLH, int Death) 
{ 
    //Attacking with bot Right hand 
    Random botAtk = new Random(); 
    if(botAtk.nextInt(2) == 1 && PRH <= 5) 
    { 
     PRH = BRH + PRH; 
     JOptionPane.showMessageDialog(null,"Your right hand is now at " + PRH); 
     return PRH; 
    } else if(botAtk.nextInt(2) == 0 && PLH <= 5){ 
     PLH = BRH + PLH; 
     JOptionPane.showMessageDialog(null, "Your left hand is now at " + PLH); 
     return PLH; 
    } 
    return Death; 
} 

정적 값을 반환 할 때마다 항상 반환해야한다고 오류가 표시되기 때문에 사망이 발생했습니다.

기본적으로 문제는 PLH (플레이어 왼손) 또는 PRH (플레이어 오른손)가 메인으로 돌아 오는 것입니다. 내가 잘못하지 않았다면 반환 값이 올바른 초기 변수 이름 (PL 및 PR)으로 반환해야합니다. 그렇지 않다면이 문제를 해결하기 위해 무엇을 할 수 있습니까?

이 코드는 이보다 훨씬 크며이 문제는 전체 프로그램에서 발생합니다. 그래서 나는 단지 하나의 방법만을 보여 주며 모두 동일한 문제라고 가정합니다. 방법은 거의 동일합니다.

또한 질문을 입력하는 동안 nextInt()가 난수 생성기를 수행하는 가장 좋은 방법입니까? 나는 nextInt (1)로 왼손을 독점적으로 공격 할 때 nextInt (2)로 전환했을 때 두 가지 모두를 공격했지만 때로는 코드 ... "충돌"(충돌로 인한 것입니다. If 문이 찾고있는 것 이외의 번호를 생성합니다). 분명히 1 또는 2 (또는 0 카운트 인 경우 0 및 1)를 생성해야합니다.

+1

"초기 변수 이름으로 반환해야합니다"라고 설명 할 수 있습니까? – Fildor

+0

첫 번째 무작위 int가! = 1 일 때 다른 임의의 결과를 다시 얻는 대신 무작위 결과를 저장하는 것이 좋습니다. 그 이유는 아마도 if 문 외부에서 숫자를 생성한다고 생각하는 이유 일 수 있습니다. – user1071777

+0

'PLH = BRH + PLH; 이것은 아마도'PLH = BLH + PLH;'이어야합니다, 그렇지 않아야합니까? – Fildor

답변

0

난수를 두 번 생성하므로 "이상한"행동을 볼 수 있습니다.

Random botAtk = new Random(); 
if(botAtk.nextInt(2) == 1 && PRH <= 5) { 
    ... 
} 
else if(botAtk.nextInt(2) == 0 && PLH <= 5) { 
    ... 
} 

에 한번 랜덤 한 번만 생성 : 허용 된 일이 있기 때문에

내가 답을 알고
Random botAtk = new Random(); 
boolean right = botAtk.nextInt(2) == 1; // flip coin only once 

if(right && PRH <= 5) { 
    ... 
} 
else if(!right && PLH <= 5) { 
    ... 
} 
+0

이것은 RNG 문제를 해결합니다! 고마워요! 나는 nextInt()의 기능을 알지 못합니다. 따라서 A.이 부울이 될 수 있고 인생을 좀 더 쉽게 만들 수 있다고 생각하기 위해 멈추지 않았습니다. B. 나는 2 개의 숫자를 생성하고 있습니다. 저는 항상 변수가 무작위로 인스턴스화 될 때 미리 생성 된 것으로 생각했습니다. –

1

당신은

public static Integer TurnCalcBB(int PLH, int PRH, int BRH, int BLH, int Death) 
{ 
    //Attacking with bot Right hand 
    Random botAtk = new Random(); 
    if(botAtk.nextInt(2) == 1 && PRH <= 5) 
    { 
     PRH = BRH + PRH; 
     JOptionPane.showMessageDialog(null,"Your right hand is now at " + PRH); 
     return PRH; 
    } else if(botAtk.nextInt(2) == 0 && PLH <= 5){ 
     PLH = BRH + PLH; 
     JOptionPane.showMessageDialog(null, "Your left hand is now at " + PLH); 
     return PLH; 
    } 
    return null; 
} 

참고로 코드를 변경할 수 있습니다 :이 함수를 호출 null 값에 대한 있는지 먼저 확인합니다.

+2

문제를 나타 내기 위해 이런 종류의 경우 -1을 반환하는 것도 일반적입니다. 이것은 객체 autoboxing을 사용하지 않는 장점이 있지만 잠재적으로 의도가 덜 명확하다는 단점이 있습니다. – Eben

+0

맛의 문제로, 나는 당신이 정말로 그들을 필요로하지 않는 곳에서 nullchecks를 소개하지 않는 것을 선호합니다. 그러나 그것은 단지 개인적인 감정 일뿐입니다. 당신은 프로와 죄수를 논할 수 있습니다. 그럼에도 불구하고, 나는 OP의 문제가 아니라고 의심하고있다. – Fildor

+0

이것은 이전에 정적 변수를 포함하여 해결했음을 설명한 문제를 해결합니다. 그럼에도 불구하고, 내가 그것을 비 전통적으로하고 있다면, 적어도 나는 지금 그것을하는 전통적인 방법을 안다. –

0

이 인정되지 않지만, 그럼에도 불구하고 :

난 당신이 잘못이 있다고 의심 Java로 전달되는 메서드 매개 변수에 대한 이해.

public static int psInt = 0; 

static void main() { 
    int someNumber = 1; 
    int someOtherNumber = 5; 

    method1(someNumber, someOtherNumber); 
    // You expect "someNumber" to be 6 right now. 
    // But in fact, the value will be unchanged. 

    // What WILL work: psInt is 0 now 
    method3(); // this method will modify the static class var 
    // psInt is 5 now. 
} 


static void method1(int numParam, int someothervalue){ 
    numParam = numParam + someothervalue; 
} 

static void method2(int someNumber, int someothervalue){ 
    someNumber = someNumber + someothervalue; // <- same name won't work either! 
} 

public static void method3(){ 
    psInt = 5; 
} 

그러나 Java 메소드 인수에

이 값에 의해 전달된다 : 나는 귀하의 질문에 읽고 코멘트 무엇 는이 작업을 기대한다는 것입니다. 즉 : 사본! 변수와 인수의 이름을 어떻게 지정하든 여기에는 "out"인수가 없습니다.

당신이 할 수있는 일 : 당신이 사용하고 정적 클래스 변수를 수정할 수 있습니다

  1. 을 정적 방법.
  2. 비 정적 메서드에서 비 정적 및 정적 클래스 변수를 사용하고 수정할 수 있습니다.
  3. 필드 값을 수정할 수있는 상태 개체를 전달할 수 있습니다.
  4. 값을 반환 할 수 있습니다.
  5. ... 더 많은 가능성이 있습니다. 이것들은 단지 시작합니다.

귀하의 경우, 새로운 권리 또는 왼손 값인지 여부를 알지 못해서 4.별로 의미가 없습니다.

+0

if 문 내에서 나는 영향을받은 손의 값이 무엇인지 출력합니다. 당신이 다른 방향을 의미한다면 (나는 어느 핸드가 공격하고 있는지 알지 못한다.) 그것이 사실이지만, 나는 다른 핸드와 마찬가지로 어떤 핸드가 뽑혔는지를 알려줌으로써 나 자신을 알릴 수있다. 그래도 여전히 이것은 반환하지 않는 값으로 인해 발생하는 문제를 해결하는 데 도움이되지 않습니다. 그것은 그것이 효과가있을 것이라고 생각하지 않습니다. 그것은 그것이 가능한지 모르겠습니다. 나는 당신의 대답에 기초하여 당신을위한 질문을 가지고 있습니다.즉, 같은 이름의 변수를 반환하면 손의 가치를 반환할까요? –

+0

위의 설명을 분명히하겠습니다. 내 말은 변수 PL을 main()에있는 것처럼 유지해야한다는 것입니다. 대신 PLH 대신 반환해야합니다. –

+0

아니요. 해당 설정에서 로컬 변수를 수정할 수 없습니다. 해당 정적 메서드를 호출하고 변수를 전달하면 변수가 복사되고 메서드 실행 중에 복사본이 사용됩니다. 원본은 건드리지 않습니다. 변수가 정적 클래스 변수 인 경우 변수를 전달할 필요가 없습니다. 메소드에서 사용하면 변경 사항이 반영됩니다. – Fildor