【问题标题】:Displaying 5 top scores from txt file java显示来自 txt 文件 java 的 5 个最高分数
【发布时间】:2018-10-13 00:31:54
【问题描述】:

我做了一个纸牌游戏,类似于纸牌。它快完成了。我正在努力的最后一件事是打印前 5 名。每当玩家结束游戏时,它会在 score.txt 文件中写入他在桌子上剩下多少堆,比如说 4。所以在 .txt 文件中我有以下数字:1,2,3,4,5,6,7,8,9。我如何从文件的前 5 个打印,所以它是:1,2,3,4,5。

DeckOfCards class:
import java.io.*;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class DeckOfCards {
private ArrayList<Cards> deck;
private int currentCard=-1; //index of the next card to be dealt
private Scanner in;
private int i;
//ArrayList<Integer> indexesToRemove = new ArrayList();
/**
 *
 * Constructor to build a deck of cards
 */

public DeckOfCards() {
    this.deck = new ArrayList<Cards>();
}

public void removeCard(int i) {
    this.deck.remove(i);
}
public Cards getCard(int i){
    return this.deck.get(i);
}
public void addCard(Cards addCards){
    this.deck.add(addCards);
}

//Draws from the deck1
public void draw(DeckOfCards comingFrom){
    currentCard++;
    this.deck.add(comingFrom.getCard(0));
    comingFrom.removeCard(0);
}
public void saveScore(){
    try (PrintStream out = new PrintStream(new FileOutputStream("scores.txt"))) {
        out.print(deck.size());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

卡类:

public class Cards {
private String suit;
private String value;


public Cards(String suit, String value)
{
  this.suit = suit;
  this.value = value;
}

public String getSuit() {
    return suit;
}

public void setSuit(String suit) {
    this.suit = suit;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

@Override
public String toString() {
    return suit + value;
}
}

希望对您有所帮助。我摆脱了一些我认为它们没有用的方法。还有菜单,就像我说的那样,除了显示前 10 个结果之外,每个案例都有效。 1 - 打印包(这样您可以检查它是否正常播放) 2 - 随机播放 3 - 发牌 4 - 移动,将最后一堆移到前一个上 5 - 移动,将最后一堆移回两堆 6 - 中间的混合物堆(通过给出它们的数字) 7 - 在命令行打印显示的卡片 8 - 为我玩一次(如果有两个可能的移动,则进行“最远”移动) 9 - 为我演奏很多次 10 - 显示前 10 个结果

【问题讨论】:

  • 这有点太模糊了。请包含一些代码并解释您遇到的具体问题。
  • 能贴出你写的相关代码吗? (见stackoverflow.com/help/mcve)
  • 已编辑。很抱歉含糊其辞,认为这是不必要的。

标签: java


【解决方案1】:

游戏结束后,读取内存中的输入文件(如列表),将新结果添加到排行榜中应该进入的位置,将新结果写入文件,然后取前五个列表(元素 0 是最好的分数,元素 n 是最差的分数)。

public void endGame(int finalScore) throws IOException {
    List<String> scores = retrieveScores();
    addNewScore(finalScore, scores);
    writeScores(scores);
    showLeaderBoard(scores);
}

private List<String> retrieveScores() throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("score.txt"));
    String scoreLine = reader.readLine(); // read line that contains scores
    List<String> scores = new ArrayList<>();
    if (scoreLine != null) { // in case of first game
        String[] tempScore = scoreLine.split(", ");
        scores = new ArrayList<>(Arrays.asList(tempScore));
    }
    reader.close();
    return scores;
}

private void addNewScore(int finalScore, List<String> scores) {
    boolean foundSpotForNewScore = false;
    int i = 0;
    while (!foundSpotForNewScore && i < scores.size()) {
        if (finalScore <= Integer.parseInt(scores.get(i))) {
            foundSpotForNewScore = true;
        } 
        i++;
    }
    scores.add(i, String.valueOf(finalScore));
}

private void writeScores(List<String> scores) throws IOException {
    FileWriter writer = new FileWriter("score.txt");
    String outputScores = scores.toString();
    outputScores = outputScores.replace("[", "");
    outputScores = outputScores.replace("]", "");
    writer.write(outputScores);
    writer.close();
}

private void showLeaderBoard(List<String> scores) {
    System.out.println("*** TOP 5 LEADERBOARD ***");
    int i = 0;
    while (i < 5 && i < scores.size()) {
        System.out.println(scores.get(i));
        i++;
    }
    System.out.println("*** TOP 5 LEADERBOARD ***");
}

【讨论】:

  • 添加了一些代码,希望对您有所帮助。问题是我不知道它应该去哪个位置。我也有将其输入到 ArrayList 的想法,所以我可能会这样做,但在这种情况下,您知道如何从 ArrayList 中打印前 10 个(即 10 个最小的数字)。我想我会使用 Collections.min(list),但它只适用于一个数字。有什么想法吗?
  • 首先,创建一个函数retrieveScores()。通过读取文件的第一行并使用 split(",") 返回一个列表。接下来将结果添加到好位置的列表中(如果你总是在好位置添加,分数总是从好到坏)。在此之后,通过使用 list 上的 toString() 并使用 replace("[", "") 删除 "[" 和 "[" 将 List 写入文件。最后,获取列表的前 5 个或 10 个第一个元素,因为它们是最好的分数,因为您的列表始终处于良好的顺序。
  • 我用一些代码编辑了答案,以帮助您理解我的意思。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2018-10-28
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多