我正在尝试制作迷你游戏并且在地图/迷宫中生成随机星星时遇到问题。 我有一个方法将现有的“**”替换为“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();
}
}
}
答案 0 :(得分:1)
您可以使用Math.random()
或Random
的实例来生成随机数,但是您无法控制其输出以使您的5个地图点成为具有相同概率的星。
但是,如果您随机重新排序积分,则可以选择具有相同概率的5,然后在重新订购后使用前5个。
在伪代码中:
Collections.shuffle(list)
答案 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 }和<=
。