2015-08-23 2 views
-1

Я пишу программу для покера.Почему мои карты не печатаются в текстовом файле?

В настоящее время, я думаю, проблема в способе тасования. Он должен генерировать 52 карты, все отличные друг от друга, генерируя случайное число от 0 до 51 (всего 52), сопоставляя этот «идентификатор» с конкретной картой (через конструктор класса «Карта»), а затем проверяя чтобы увидеть, была ли карта уже сгенерирована. Если бы это было так, это не получилось бы, и счетчик не посчитал бы это. Если бы это не было, это было бы напечатано в текстовом файле под названием «Deck.txt» и так далее, пока не было напечатано 52 карты.

Программа работает нормально, но когда я проверяю файл Deck.txt, там никогда ничего нет.

Вот мой код:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.NoSuchElementException; 
import java.util.Random; 
import java.util.Scanner; 

public class Deck { 

static private File deck = new File("Deck.txt"); 
static private Random shuffler = new Random(); 
static private Scanner dreader; 

static public void shuffle() { 
    int card; 
    for (int i = 0; i < 52; i++) { 
     card = shuffler.nextInt(52)+1; 
     PrintWriter cwriter = null; 
     try { 
      cwriter = new PrintWriter(deck); 
     } catch (FileNotFoundException e) { 
      // File not found 
     } 
     if (DeckChecker(card)) { 
      try { 
       cwriter.println((new Card(card)).toString()); 
      } catch (NullPointerException e) { 
       // File never opened 
      } 
     } 
     else n--; 
    } 
} 

private static boolean DeckChecker(int card) { 
    try { 
     dreader = new Scanner(deck); 
    } catch (FileNotFoundException e) { 
    } 
    boolean switch1 = true; 
    String s = null; 
    while (switch1) { 
     try{ 
      s = dreader.nextLine(); 
     }catch(NoSuchElementException e){ 
      return true; 
     } 
     if (Card.getId(s) == card) 
      return false; 

    } 
    return true; 
} 
} 

.

public class Card { 

static final private String[] number = { "2", "3", "4", "5", "6", "7", "8", 
     "9", "10", "J", "Q", "K", "A" }; 
static final private String[] symbol = { "Diamond", "Spades", "Hearts", 
     "Clubs" }; 
private String cnumber; 
private String csymbol; 
private String cardName; 
private StringBuilder namer; 

public Card(int id) { 
    csymbol = symbol[(int) id/13]; 
    cnumber = number[id - (((int) id/13) * 13)]; 
    namer.append(cnumber).append(" of ").append(csymbol); 
    cardName = namer.toString(); 
} 

@Override 
public String toString() { 
    return cardName; 
} 

static public int getId(String card) { 
    int s = 0; 
    int n = 0; 
    boolean switch1 = true; 
    String cards = card.substring(6); 
    String cardn = card.substring(0, 1); 
    while (switch1) { 
     if (cardn.equals(number[n])) 
      switch1 = false; 
     else 
      n++; 
    } 
    switch1 = true; 
    while (switch1) { 
     if (cards.equals(number[s])) 
      switch1 = false; 
     else 
      s++; 
    } 
    return (s * 13) + n; 
} 
} 
+0

Этот код не компилируется. У вас 'n -', но 'n' не определен. – durron597

+2

Игнорирование 'FileNotFoundException', а затем игнорирование« NullPointerException »вызывает и никогда не закрывает автора, все * внутри цикла *. Хлоп !!!!!! – Andreas

ответ

3

Прежде всего, эта карточка не компилируется. У вас есть:

else n--; 

Кроме n не существует в этой точке.

Вы также создаете много разных объектов PrintWriter для этого файла, но никогда не закрываете поток, а это значит, что они все в конфликте, чтобы писать в один и тот же файл, и поэтому он никогда не пишет им.

Все, что было сказано, это действительно плохой способ перетасовать колоду карт; он мог бы попробовать много, много раз подряд искать последнюю пропущенную карту, каждый раз делая Disk IO, что является одной из самых медленных вещей, которые может сделать программа. Поэтому я полностью удалил метод DeckChecker, так как он не нужен.

Вместо этого, просто генерировать все карты, затем перетасовать их, а затем записать их в файл, например:

import java.util.*; 

// snip, your code 

public static void shuffleAndPrint() { 
    List<Card> cardList = createShuffledDeck(); 
    writeDeckToFile(cardList); 
} 

private static List<Card> createShuffledDeck() { 
    List<Card> cardList = new ArrayList<>(); 
    for (int i = 0; i < 52; i++) { 
    cardList.add(new Card(i)); 
    } 
    Collections.shuffle(cardList); 
    return cardList; 
} 

private static void writeDeckToFile(List<Card> cardList) { 
    try (PrintWriter cwriter = new PrintWriter(deck)) { 
    for (Card c : cardList) { 
     cwriter.println(c); 
    } 
    } catch (FileNotFoundException e) { 
    e.printStackTrace(); 
    } 
} 
+0

th n - на самом деле была опечатка, это я - в коде, но спасибо, что я попытаюсь это сделать –

Смежные вопросы