我需要将我创建的一款RPG游戏从控制台应用程序转化为Windows窗体应用程序,以供编程课程使用。一切都按照预期进行,但是在将战斗系统转换时卡住了。下面是调用战斗函数的按钮单击事件和战斗函数:
private void btStoryProgression_Click(object sender, EventArgs e)
{
{...}
else if (flagControl == 20)
{
Enemy enemy = new Enemy("Hellhound", "Oblivion Cave", 1);
if (combat(player, enemy) == true)
{
Lines.Text += "You won!\n";
player.itemList.Add(new Item("Fruit", 22));
}
else
{
Lines.Text = "YOU DIED.";
Lines.Text += "GAME OVER.";
return;
}
}
}
bool combat(Player player, Enemy enemy)
{
Lines.Text = enemy.getName() + " appeared!\n";
int damage;
bool battle = true;
int battleChoice = 0, itemChoice = -1;
turns = 0;
Lines.Text += "What are you going to do?";
buttonVisibility();
buttonChoices("Attack", "Item");
while (battle)
{
if (player.getSpeed() > enemy.getSpeed())
{
//Player turn
if (battleChoice == 1)
{
Lines.Text = player.getName() + " attacked!\n";
if (player.getAccuracy() < 100)
{
Random rnd = new Random();
if (rnd.Next(1, 100) > player.getAccuracy())
{
Lines.Text += "The attack missed!\n";
goto enemyturn;
}
}
damage = player.getAtk() - enemy.getDef();
if (damage < 0)
damage = 0;
enemy.setHP(enemy.getHP() - damage);
if (enemy.getHP() < 0)
enemy.setHP(0);
Lines.Text += "You dealt " + damage + " damage to " + enemy.getName();
Lines.Text += "Enemy HP is now " + enemy.getHP();
if (enemy.getHP() == 0)
return true;
}
else if (battleChoice == 2)
{
Lines.Text += "Your items: ";
foreach (Item item in player.itemList)
{
Lines.Text += item.getName();
}
Lines.Text += "Choose a number based on the order the items appeared";
try
{
do
{
itemChoice = Convert.ToInt32(Console.ReadLine());
itemChoice--;
} while (itemChoice > player.itemList.Count());
}
catch (FormatException)
{
Console.WriteLine("SOMETHING WRONG!!");
}
Lines.Text += "Player HP was: " + player.getHP();
player.setHP(player.getHP() + player.itemList[itemChoice].getRecoverQtd());
Lines.Text += "Player HP is now: " + player.getHP();
player.itemList.RemoveAt(itemChoice);
}
enemyturn:
//Enemy turn
if (battleChoice != 0)
{
Lines.Text += enemy.getName() + " attacked!\n";
damage = enemy.getAtk() - player.getDef();
if (damage < 0)
damage = 0;
player.setHP(player.getHP() - damage);
if (player.getHP() < 0)
player.setHP(0);
Lines.Text += enemy.getName() + " dealt " + damage + " damage to " + player.getName();
Lines.Text += player.getName() + " HP is now " + player.getHP();
}
if (player.getHP() == 0)
return false;
turns++;
}
else
{
enemyturn:
//Enemy turn
if (battleChoice != 0)
{
Lines.Text += enemy.getName() + " attacked!\n";
damage = enemy.getAtk() - player.getDef();
if (damage < 0)
damage = 0;
player.setHP(player.getHP() - damage);
if (player.getHP() < 0)
player.setHP(0);
Lines.Text += enemy.getName() + " dealt " + damage + " damage to " + player.getName();
Lines.Text += player.getName() + " HP is now " + player.getHP();
if (player.getHP() == 0)
return false;
}
//Player turn
if (battleChoice == 1)
{
Lines.Text += player.getName() + " attacked!\n";
if (player.getAccuracy() < 100)
{
Random rnd = new Random();
if (rnd.Next(1, 100) > player.getAccuracy())
{
Lines.Text += "The attack missed!";
goto enemyturn;
}
}
damage = player.getAtk() - enemy.getDef();
if (damage < 0)
damage = 0;
enemy.setHP(enemy.getHP() - damage);
if (enemy.getHP() < 0)
enemy.setHP(0);
Lines.Text += "You dealt " + damage + " damage to " + enemy.getName();
Lines.Text += "Enemy HP is now " + enemy.getHP();
if (enemy.getHP() == 0)
return true;
}
else if (battleChoice == 2)
{
Lines.Text += "Your items: ";
for (int i = 0; i < player.itemList.Count; ++i)
{
Lines.Text += player.itemList[i].getName();
}
Lines.Text += "Choose a number based on the order the items appeared";
}
turns++;
}
return true;
}
基本上,当我按下按钮并调用战斗时,整个函数会被跳过,直到找到一些松散的“else”,或者如果我限制每次比较,程序就会冻结。我进行了一些搜索,看到有人建议使用委托或BackgroundWorker,但我仍然对如何使用它们感到困惑。这个链接是我找到的最接近我的问题,但它也不能帮助我(可能因为我是新手...)。
请问你们可以帮我吗?先谢谢!