java - 如何使用 math.random 重新随机化网格上的图
问题描述
我将 3 个字符(两个“T”和一个“S”)分配给 10 x 10 网格。我把它记下来了,但我想知道如果它们最终在同一个位置,我如何重新随机化 char 的位置。基本上我正在创建一个小游戏,我是一名士兵(S),并且在一个有两个目标(T)的网格上。最终我将不得不消除目标,但我想确保每个目标最终都在自己的位置。这是我的代码
import java.lang.Math;
public class PaintBall_Thomas{
public static void fillGrid(char[][] battleField){
for ( int i = 0; i < battleField.length; i++){
for ( int j = 0; j < battleField[i].length; j++){
battleField[i][j] = '-';
}
}
battleField[((int)(Math.random()*10))][((int)(Math.random()*10))] = 'S';//assigns a random number between 1-10 and assigns it to either soldier/target
battleField[((int)(Math.random()*10))][((int)(Math.random()*10))] = 'T';
battleField[((int)(Math.random()*10))][((int)(Math.random()*10))] = 'T';
for ( int i = 0; i < battleField.length; i++){
for ( int j = 0; j < battleField[i].length; j++){
System.out.print(battleField[i][j] + " ");
}
System.out.println();
}
}//end of fillGrid method
public static void main(String[] args) {
int columns = 10;
int rows = 10;
System.out.println("----------GRID----------");
//end of main
char[][] battleField = new char [rows][columns];
fillGrid(battleField);
}
}
解决方案
这可能是递归的一个很好的用途,所以就像
public void addChar(char type) {
int row = (int)(Math.random() * battleField.length); // choose rand spot
int col = (int)(Math.random() * battleField.length);
if (battleField[row][col] == '-') { // if chosen space is free
battleField[row][col] = type; // add it
} else {
addChar(type) // try again if space was occupied
}
}
所以这可能会有一些问题......例如如果板子已经满了,可能会出现堆栈溢出......但是如果该方法的唯一预期用途是添加两个 T 和一个 S,那应该没问题
所以你可以像这样添加它们
addChar('T');
addChar('T');
addChar('S');
并且没有一个选择的点会重复
推荐阅读
- javascript - 如何阅读 NPM 依赖项的版本控制
- flutter - 如何在切换按钮打开时更改卡片颜色
- sql - SQL 中可能会出现奇怪的会话范围反转
- javascript - 如何使用具有 3 个输入(月、日、年)的 react-hook-form 创建日期字段?
- java - 我们如何在 android 11 中获取所有图像?
- python - 当语言只包含一种语言时,我无法得到正确的答案以打印出来:“莎拉最喜欢的语言是:C”
- typescript - vue/ 使用 tsx 时没有导出成员 'toRefs'
- java - Maven:为什么在父pom中声明的依赖项没有被子pom继承?
- javascript - 如何在加载之前可靠地删除脚本标签?
- java - 在 AnyLogic 中为代理创建文本文件时出现 NullPointerExection 错误