我正在将我的第一个小“计算机游戏”编程为学校项目,这是一个Beat'em up,一个格斗游戏,其中2个Dudes互相击败,这是一个非常简单的游戏。 我需要实现一个方法,该方法可以使敌人在程序运行时以随机的间隔攻击玩家,而您可以输入攻击等信息。
我制作了一种AI方法,说实话,我之前遇到过一些麻烦,但是在测试9/10次时仍然有效。 我添加了一个计时器,该计时器始终以另一个随机数重新启动,以随机间隔启动计时器任务,以使敌人在我的游戏中更加难以预测。 如果您丢失了所有生命值并丢失了游戏,我还添加了一些音效和检查。 损坏健康栏,它是[] Char数组。这是通过我的“ DamageMachen()”方法计算得出的。
现在我的游戏结束了,我想将该方法实现到我的controllerClass中,但是一旦该方法开始使用,我的程序就会崩溃:(
有没有人知道任何解决该问题的解决方案,或者我可以使用与我相同的功能的另一种方法?
在我的测试班中,此AI方法有效...不好,但是有效。我认为有时AI会停止,因为它是随机数,但它可以工作9/10次。我只是无法解决问题。我尝试更改随机数的范围,有时甚至更糟,所以我选择了1到3秒之间的数字,这对我来说效果最好。
当我在游戏中实现该Method时,游戏要么崩溃,要么无法输入其他内容,因为我相信AI-Method首先必须完成,但是我如何编程,它将永远不会完成,直到游戏结束。
如果您对我的代码有疑问,请告诉我。这是我第一次在这里提问,所以我希望我向您展示的内容足以解决我的问题。
// KI-Methode THIS IS MY MAIN PROBLEM. I'LL ALSO ADD THE OTHER METHODS DOWN
//THERE JUST TO HELP YOU VISUALIZE MY WHOLE CODE
public void KI() {
long interval = 0;
gewinnErmitteln();
boolean verloren = noob();
int start = 0;
int zaehler = 0;
while (gewonnen == false && verloren == false) {
try {
Random r = new Random();
double randomValue = 1 + (3 - 1) * r.nextDouble();
ki = new Timer();
interval = (long) (randomValue * 1000);
TimerTask kitask = new TimerTask() {
public void run() {
damageMachen(damageNormal);
// Visualisieren TEST
//visualisieren();
done = true;
ki.cancel();
}
};
if (start == zaehler) {
ki.schedule(kitask, interval);
zaehler++;
} else if (done == true) {
done = false;
ki.schedule(kitask, interval);
}
// THIS METHOD JUST CHECKS, IF YOU EITHER HAVE WON OR LOST BY CHECKING; IF THE //[]CHAR ARRAY IS FULL (All Health lost)
gewinnErmitteln();
verloren = noob();
} catch (IllegalStateException e) {
System.out.println("EXCEPTION: " + e);
}
continue;
}
if (verloren == true) {
ki.cancel();
try {
AudioInputStream sad = AudioSystem.getAudioInputStream(
new File("MySoundHere"));
Clip clip = AudioSystem.getClip();
clip.open(sad);
clip.start();
} catch (Exception ex) {
System.out.println("Error with playing sound.");
ex.printStackTrace();
}
}
}
// HERE IS THE METHOD, WHICH I USE TO CALCULATE THE DAMAGE OF ENEMY ATTACKS
// DAMAGE GETS DONE TO A HEALTHBAR, WHICH IS A []CHAR-ARRAY
// Damage-Methoden
public void damageMachen(int damage) {
int damagedone = 0;
int thisdamage = damage;
int focusdamage = 2;
int focusdamagedone = 0;
if (blocken == false) {
// AUDIO
for (int i = 0; i < lebensbalkenValue; i++) {
if (thisdamage != damagedone && lebensbalken[i] == ' ') {
lebensbalken[i] = 'I';
damagedone++;
try {
AudioInputStream punch = AudioSystem.getAudioInputStream(new File(
"MyOtherAudio"));
Clip clip = AudioSystem.getClip();
clip.open(punch);
clip.start();
} catch (Exception ex) {
System.out.println("Error with playing sound.");
ex.printStackTrace();
}
}
}
for (int i = fokusValue - 1; i >= 0; i--) {
if (focusdamage != focusdamagedone && fokusbalken[i] == 'I') {
fokusbalken[i] = ' ';
focusdamagedone++;
try {
AudioInputStream punch = AudioSystem.getAudioInputStream(new File(
"YetAnotherAudioClip"));
Clip clip = AudioSystem.getClip();
clip.open(punch);
clip.start();
} catch (Exception ex) {
System.out.println("Error with playing sound.");
ex.printStackTrace();
}
}
}
} else {
int focusdone = 0;
int thisfocus = 1;
for (int i = 0; i < fokusValue; i++) {
if (thisfocus != focusdone && fokusbalken[i] == ' ') {
fokusbalken[i] = 'I';
focusdone++;
}
}
}
}
// MY CONSTRUCTOR
public Model() {
lebensbalken = new char[lebensbalkenValue];
for (int i = 0; i < lebensbalkenValue; i++) {
lebensbalken[i] = ' ';
}
fokusbalken = new char[fokusValue];
for (int i = 0; i < fokusValue; i++) {
fokusbalken[i] = ' ';
}
}
// MY CONTROLLER CLASS, I INITIALIZE THE AI METHOD RIGHT AT THE BEGINNING
@Override
public void initialize(URL location, ResourceBundle resources) {
javaFighter = new Model();
//AI_METHOD STARTING
javaFighter.KI();
// other stuff to handle buttons, etc. This all works fine, so I don't think I // have to show it to you
}
我希望AI方法一直运行,直到玩家或敌人赢得比赛为止,并且在AI方法运行并攻击玩家时,玩家仍可以输入攻击内容,等等。
该程序在启动AI方法后立即崩溃。 当时,程序没有崩溃,Timer-Loop没有让我输入其他任何内容,所以我不得不关闭程序。