2014-12-08 2 views
3

저는 초보자이며 기본적으로 1 인 5 드로우 게임을 모방 한 2 클래스 프로그램 "VideoPoker"를 만들었습니다. 이 게임에서는 카드 덱을 섞은 다음 상위 5 장의 카드를 사용하여 5 장의 무승부를 기록합니다. 사용자는 카드를 처리 할 때 부여받은 5 장의 카드 중 일부 또는 전부를 제거 할 수 있습니다. 사용자가 카드를 제거하면 카드가 제거되어 다음 상단 카드로 바뀝니다. 나는 사용자가 카드를 제거하기로 결정한 지점에 갇혀있다. 내 프로그램에서 누군가가 카드 또는 때로는 일부 카드 2 (색인 1)과 카드 4 (색인 3)의 모든 카드를 다음 핸드 (5 장) 인쇄물에 항상 남겨 두었습니다.갑판 하단의 카드 교체

Deck.java : 내 시도는 아래 코드 영상에

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Random; 

public class Deck { 
    // Constructing a deck from two arrays 
    String[] suit = { "C", "D", "H", "S" }; 
    String[] rank = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; 
    ArrayList<String> deck = new ArrayList<String>(suit.length * rank.length); 
    int currentCard = 0; 

    // Storing public variables 
    int suits = suit.length; 
    int ranks = rank.length; 
    int deckSize = deck.size(); 

    // Constructs a deck with 52 cards 
    public Deck(){ 
     for(int i = 0; i < suits; i ++){ 
      for(int j = 0; j < ranks; j++){ 
       String temp = rank[j] + suit[i]; 
       deck.add(temp); 
      } 
     } 
    } 

    public String toString(){ 
     return Arrays.deepToString(deck.toArray());  
    } 

    // Fisher-Yates Shuffle 
    public ArrayList<String> shuffle(){ 
     Collections.shuffle(deck); 
     return deck; 
    } 

    public String deal(){ 
     return deck.get(currentCard++); 
    } 

    public String remove(int i){ 
     return deck.remove(i); 
    } 

    public String get(int i){ 
     return deck.get(i); 
    } 

    public ArrayList<String> getList(){ 
     return deck; 
    } 
} 

Dealer.java (테스터 프로그램) :

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Scanner; 

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

     Deck testDeck = new Deck(); 

     System.out.println(testDeck); 

     testDeck.shuffle(); 

     System.out.println(testDeck); 

     for (int i = 0; i < 5; i ++){ 
      System.out.print(testDeck.deal() + " "); 
     } 

     String choice; 

     for (int i = 0; i < 5; i++){ 
      System.out.print("\nWould you like to remove card " + (i + 1) + "? "); 
      choice = in.next(); 
      if (choice.equals("Y")){ 
       testDeck.remove(i); 
      } 
     } 

     for (int i = 0; i < 5; i++){ 
      System.out.print(testDeck.get(i) + " "); 
     } 
    } 
} 

출력 :

output

+1

심미적 인 메모와 마찬가지로,'10'을'T'로 바꾸면 순위가 모두 하나의 문자가되도록 할 수 있습니다. – AJMansfield

+0

@AJMansfield 감사합니다. – mshades

+0

카드 1을 여러 번 제거하거나 각 카드를 제거한 후에 손을 표시해보십시오. 그것은 일어나는 일에 대한 공정한 아이디어를 줄 것입니다. – BevynQ

답변

2

귀하의 문제는 여기에 있습니다 :

for (int i = 0; i < 5; i++){ 
    System.out.print("\nWould you like to remove card " + (i + 1) + "? "); 
    choice = in.next(); 
    if (choice.equals("Y")){ 
     testDeck.remove(i); // <-- removing the 'i'th element is the problem 
    } 
} 

이 블록에서 특정 위치에서 카드를 제거 할 것인지 묻는 메시지가 표시됩니다. 사용자가 "그렇습니다! 첫 번째 카드를 제거하고 싶습니다! "라는 메시지가 나타나면 인덱스 0의 최상위 카드를 제거합니다.하지만 완전히 새로운 데크가 있기 때문에 문제가 발생하는 곳이기도합니다! 이전에 색인 1에 있었던 카드 이제 Hearts 10 개가 실제로 인덱스 0에 있습니다. 따라서 본질적으로 실제로는 동적으로 변경 될 가능성이 있고 코드에서이 값을 고려하지 않을 때 갑자기 변화하지 않는 것처럼 갑판을 다루고 있습니다.

가능한 (원유이기는하지만) 솔루션는 :

// a list used to store the index of cards to be removed  
ArrayList<Integer> indexesToRemove = new ArrayList(); 

for (int i = 0; i < 5; i++) { 
    System.out.print("\nWould you like to remove card " + (i + 1) + "? "); 
    choice = in.next(); 
    if (choice.equals("Y")) { 
     indexesToRemove.add(i); // record index of card to be removed 
    } 
} 

// here we remove the cards all at once  
for(int i = 0; i < indexesToRemove.size(); i++) { 
    // each iteration is a guaranteed removal so 
    // we subtract by i to counteract for each subsequent removal 
    testDeck.remove(indexesToRemove.get(i) - i); 
} 
+0

메신저가 첫 번째 설명에 동의하지만 '해결하려면 :'그가 모두 제거하면 어떻게됩니까? 인쇄 화면을보십시오. 그는 이미 모든 카드를 제거하고 여전히 같은 카드를 얻습니다. – Secondo

+0

맞습니다. 해결할 내 것이 정확하지 않습니다. 지금 편집하십시오. – bwegs

+0

플레이어 카드가 아닌 그의 덱에서 카드를 제거하고 있습니다. 이것이 당신의 대답을 향상시키는 데 도움이되기를 바랍니다. – Secondo

1

문제는 당신이 갑판 로직을 구현하는 방식에 내려 오는 대신 카드를 저장하기 위해 ArrayList를를 사용하는. 그런 다음 인덱싱을 수행하려면 ArrayDeque ("어레이 데크"라고 발음)를 사용하여 저장소 및 제거 논리를 처리해야합니다.

플레이어의 손을 갑판과 별도로 추적해야합니다. 주요한 probem은 당신이 데크와 플레이어의 손을 결합시킨 방식입니다. 프로그램을 좀 더 일반화함으로써 복잡성을 상당 부분 제거 할 수 있습니다.

프로그램을보다 일반적으로 작성하는 것과 마찬가지로 별도의 클래스를 사용하여 카드를 처리해야합니다. 단지 두 개의 public final 필드, 생성자 및 toString 메서드 만 있으면 멋지다고 할 필요는 없습니다.