使用Java中的文本文件中的随机位置扫描并替换特定字符

时间:2018-01-14 10:32:36

标签: java

我正在尝试制作迷你游戏并且在地图/迷宫中生成随机星星时遇到问题。 我有一个方法将现有的“**”替换为“0”,我希望它再次用“*”替换任意5个随机“0”,这样每次运行程序时,这些星星都会随机生成,但是我无法弄清楚算法。 例如:

before
1111111111
1000*00001
1000000*01
10*0000*01
10000*0001
1111111111

after
1111111111
100*00*001
1*00000001
100000*001
100*000001
1111111111

我目前使用的方法,

 public static void main(String[] args) {
    cheeseReset("maze.txt", "*", "0");     
}

static void cheeseReset(String filePath, String oldString, String newString)
{
    File fileToBeModified = new File(filePath);
    String oldContent = "";
    BufferedReader reader = null;
    FileWriter writer = null;

    try
    {
        reader = new BufferedReader(new FileReader(fileToBeModified));
        String line = reader.readLine();
        while (line != null) 
        {
            oldContent = oldContent + line + System.lineSeparator();
            line = reader.readLine();
        }

        String newContent = oldContent.replace(oldString, newString); 
        //replace 5 random  "0" with "*"
        writer = new FileWriter(fileToBeModified);
        writer.write(newContent);      
    }

    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            reader.close();
            writer.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用Math.random()Random的实例来生成随机数,但是您无法控制其输出以使您的5个地图点成为具有相同概率的星。

但是,如果您随机重新排序积分,则可以选择具有相同概率的5,然后在重新订购后使用前5个。

在伪代码中:

  • 使用单个对象(有两个点)表示地图上的每个点
  • 创建一个列表并使用所有可以成为明星的点
  • 填充它
  • 通过调用Collections.shuffle(list)
  • 随机重新排序列表
  • 在列表的前5个点放置一个星标

答案 1 :(得分:0)

由于您似乎知道如何处理文件,我只是展示了一种方式,只有@ Bohemian的答案启发,但有点不同:

public class RandoMaze {
    public static final String ORGMAZE=
              "11111111111111111  Stay\n"
            + "1*****@@@@0000001   'n'\n"
            + "1000000000000000111 Die\n"
            + "1000000000000000001\n"
            + "11111111111100000011111\n"
            + "           111000000001\n"
            + "Monsters     1110000001\n"
            + "everywhere     11111111\n";
    public static final Set<Character> SHUFFLEPIECES=new HashSet<>(Arrays.asList('0','@','*'));
    public static void main(String[] args) {
        System.out.println("Before:");
        System.out.println(ORGMAZE);
        char maze[]=ORGMAZE.toCharArray();
        List<Character> shuffleme=new ArrayList<>();
        for(int i=0;i<maze.length;i++)
            if(SHUFFLEPIECES.contains(maze[i]))
                shuffleme.add(maze[i]);
        Collections.shuffle(shuffleme);
        for(int i=0;i<maze.length;i++)
            if(SHUFFLEPIECES.contains(maze[i]))
                maze[i]=shuffleme.remove(0);
        System.out.println("After:");
        System.out.println(new String(maze));
    }
}

这个想法是有一个游戏场的表示,由一系列应该保留的项目(墙壁,'装饰')和应该随机化的项目('空'字段和对象)构成)。
然后循环只提取待随机化对象,将它们混洗,然后另一个循环将它们放回去(再次仅对待随机化字段进行处理,保留其他所有对象)。

注意:Set事情特别可怕,在现实代码中,最好选择连续范围的数字/字符来表示“可移动”项目,并检查一对{{1 }和<=