我必须创建一个播放消除游戏的程序。
用户必须输入玩家数量和"周期数"或者程序的重要程度。
因此,例如,如果我输入8个玩家和4个周期,那么第一个玩家将是玩家4,然后下一个将是玩家8,然后它会一直持续直到有一个赢家。
截至目前,我目前的计划是将周期所有变量更改为999,并一直持续到有一个胜利者为止。但是现在我的代码只将一个值更改为999然后停止。
如何让我的代码更改它所达到的任何值999并一直持续到获胜者被选中?我知道这是因为第33行的代码告诉它一遍又一遍地改变同一个变量。但是我怎么能改变它所以它更多一次呢?这是我的代码
public class numberPicker
{
public static void main(String[] args)
{
String cycles = JOptionPane.showInputDialog("Please input the number of cycles");
int cyclesUse = Integer.parseInt(cycles);
String players = JOptionPane.showInputDialog("Please input the number of players");
int playersUse = Integer.parseInt(players);
String arrayUse = "";
int count = 0;
int[] array = new int [playersUse];
while(count < playersUse)
{
array[count] = count;
count++;
}
int addition = 0;
int counter = 0;
while(counter < 999)
{
addition++;
int stuff = array[cyclesUse];
array[stuff-1] = 999;
arrayUse = Arrays.toString(array);
System.out.println(arrayUse);
if (addition > cyclesUse)
{
addition = 0;
}
}
arrayUse = Arrays.toString(array);
System.out.println(arrayUse);
}
}
答案 0 :(得分:1)
问题是你正在更新相同的数组位置,你需要更改 cycleuse 的值,或者你可以使用其他一些变量
答案 1 :(得分:0)
这里有一些问题。首先,第二个while循环中的条件counter < 999
无法返回false。因此,循环将继续运行而不会结束,因此您应该以最终终止循环的方式更新计数器。其次,cyclesUse
永远不会在循环中更新,因此循环只是将数组中的相同变量重新更新为999.但是,为了实现您的算法,我建议在每次迭代中随机选择一个参与者。 while循环并将其值设置为999.在此while循环中应该有另一个while循环,它找到一个没有值为999的有效随机播放器。这是它应该是什么样的,
int counter = 0;
while(counter < count-1)
{
int randomIndex = (int) Math.random()*count; //picks a random number between 0 and 8
while(array[randomIndex] == 999){
randomIndex = (int) Math.random()*count; //keep finding a random index until one is found whose value is not 999
}
array[randomIndex] = 999;
arrayUse = Arrays.toString(array);
System.out.println(arrayUse);
counter++; //update the counter so that the loop can eventually end
}
答案 2 :(得分:0)
假设我正确理解游戏规则,问题是你的数组索引没有正确递增。 (我认为设置为999的播放器不是随机的,而是 cycle 变量的增量。)看看这是否有意义:
import java.util.*;
import javax.swing.JOptionPane;
public class numberPicker
{
public static void main(String[] args)
{
String cycles = JOptionPane.showInputDialog("Please input the number of cycles");
int cyclesUse = Integer.parseInt(cycles);
String players = JOptionPane.showInputDialog("Please input the number of players");
int playersUse = Integer.parseInt(players);
String arrayUse = "";
int[] array = new int [playersUse];
for(int i = 0; i < playersUse; i++){
array[i] = i+1;
}
int counter = 0;
int shift = -1;
int playersRemoved = 0;
while(true)
{
counter++;
if((cyclesUse*counter)+shift >= array.length){
counter = 0;
shift++;
}
array[(cyclesUse*counter)+shift] = 999;
System.out.println(Arrays.toString(array));
playersRemoved++;
if(playersRemoved >= playersUse){
break;
}
}
System.out.println("Congratulations, player " + ((cyclesUse*counter)+shift+1) + " has won!");
}
}
(简单测试 - 可能无法正常工作,但它应该证明这一点)
首先,在主循环中,计数器递增。这是为了跟踪已经进行了多少跳跃。在这种情况下,当它到达列表的末尾时,它将返回到开头,但是将 shift 增加1.(这是为了防止它被卡住将相同的玩家分配给999和重新开始。) playersRemoved 只是为了跟踪循环何时结束,并显示分配给的最后一个玩家。
稍微玩一下,希望这会让你对这个概念有所了解。 (说实话,这比我原先想象的要复杂得多)
答案 3 :(得分:0)
我重写了循环部分,这是输出:
Out 4th player(array[3]) [0, 1, 2, 999, 4, 5, 6, 7]
Out 8th player(array[7]) [0, 1, 2, 999, 4, 5, 6, 999]
Out 5th player(array[4]) [0, 1, 2, 999, 999, 5, 6, 999]
Out 2th player(array[1]) [0, 999, 2, 999, 999, 5, 6, 999]
Out 1th player(array[0]) [999, 999, 2, 999, 999, 5, 6, 999]
Out 3th player(array[2]) [999, 999, 999, 999, 999, 5, 6, 999]
Out 7th player(array[6]) [999, 999, 999, 999, 999, 5, 999, 999]
The winer is 6th player(array[5])
我的代码是:
int remainNum = playersUse;
int loopCount = 0;
int playerCount = 0;
while (remainNum > 1) {
int pos = ++loopCount % playersUse;
int playerPos = pos == 0 ? playersUse - 1 : pos - 1;
playerCount++;
if (array[playerPos] == 999) {
playerCount--;
continue;
}
if (playerCount % cyclesUse == 0) {
array[playerPos] = 999;
remainNum--;
System.out.println(String.format("Out %dth player(array[%d])\t%s", playerPos + 1, playerPos, Arrays.toString(array)));
}
}
for (int i = 0; i < array.length; i++) {
if (array[i] != 999) {
System.out.println(String.format("The winer is %dth player(array[%d])", i + 1, i));
break;
}
}