从标签中减去一个数字
Subtract a number from a label
我是 C# 的新手,我有一个关于如何从标签中减去数字的问题?
我正在尝试申请。情况如下:
我有一个显示 "attack" 的按钮,还有一个名为 "lblTotalEnemyLifes" 的标签。现在,当我按下按钮时,我想从标签的总 hp 中减去 1 "damage",标签将在我按下按钮后自动更新。我尝试了很多不同的东西,但似乎没有任何效果。目前我尝试了类似的东西:
int damage = -1;
int life = Convert.ToInt32(lblTotalEnemyLifes.Text);
life = life - damage;
我尝试了比这更多的东西。如果有人可以帮助我如何从标签中减去数字..那就太好了。
提前致谢!
您正在减去数字但不写回:
lblTotalEnemyLifes.Text = life.ToString();
更改 life
的值不会影响您的 label.You 应该更新标签的 Text
属性.
而且您减去 -1
而不是 1
,表达式变为 life = life + 1
。您可以只使用 decrement
运算符从变量中减去 1
:
int life = Convert.ToInt32(lblTotalEnemyLifes.Text);
life--; // equivelant to life = life - 1;
lblTotalEnemyLifes.Text = life.ToString();
尝试将伤害设置为 1,而不是 -1。
然后在最后添加:
lblTotalEnemyLifes.Text = life.ToString();
另一种可能更优雅且不易出错的方法是:
将您的价值包装在 class:
public class GameState
{
public int TotalEnemyLifes { get; set; }
}
接下来,实例化 class 并将其绑定到 UI:
var ctx = new GameState { TotalEnemyLifes = LIFE_VALUE };
this.DataContext = ctx;
接下来,更新按钮事件处理程序中的值:
private void event_Handler(object sender, RoutedEventArgs e)
{
ctx.TotalEnemyLifes--;
BindingOperations.GetBindingExpression(lblTotalEnemyLifes, Label.ContentProperty).UpdateTarget();
}
将数据存储在标签中是个坏主意。标签和文本框应该只用于用户交互(输入和 output/display)。将数据存储在变量、字段或属性中。最好为您的游戏逻辑使用单独的 classes 而不是在表单
中执行逻辑
public class Game
{
private const int InitialLifesCount = 100;
public Game()
{
EnemyLifes = InitialLifesCount;
}
public int EnemyLifes { get; set; }
public AttackEnemy()
{
EnemyLifes--;
}
}
你可以这样写
private _game = new Game();
在按钮中点击:
_game.AttackEnemy();
lblTotalEnemyLifes.Text = _game.EnemyLifes.ToString();
看看data binding也是个好主意。如果您在游戏 class 中实现 INotifyPropertyChanged
界面并将 class 属性绑定到您的标签,那么标签将自动更新。
除了提高清晰度外,逻辑和 I/O 的分离还允许您为游戏逻辑编写 unit tests。在单元测试中你可以写
[TestMethod]
public void AttackingEnemyReducesHisLifes()
{
var game = new Game();
int lifesBefore = game.EnemyLifes;
game.AttackEnemy();
Assert.AreEqual(lifesBefore - 1, game.EnemyLifes);
}
我是 C# 的新手,我有一个关于如何从标签中减去数字的问题?
我正在尝试申请。情况如下:
我有一个显示 "attack" 的按钮,还有一个名为 "lblTotalEnemyLifes" 的标签。现在,当我按下按钮时,我想从标签的总 hp 中减去 1 "damage",标签将在我按下按钮后自动更新。我尝试了很多不同的东西,但似乎没有任何效果。目前我尝试了类似的东西:
int damage = -1;
int life = Convert.ToInt32(lblTotalEnemyLifes.Text);
life = life - damage;
我尝试了比这更多的东西。如果有人可以帮助我如何从标签中减去数字..那就太好了。
提前致谢!
您正在减去数字但不写回:
lblTotalEnemyLifes.Text = life.ToString();
更改 life
的值不会影响您的 label.You 应该更新标签的 Text
属性.
而且您减去 -1
而不是 1
,表达式变为 life = life + 1
。您可以只使用 decrement
运算符从变量中减去 1
:
int life = Convert.ToInt32(lblTotalEnemyLifes.Text);
life--; // equivelant to life = life - 1;
lblTotalEnemyLifes.Text = life.ToString();
尝试将伤害设置为 1,而不是 -1。 然后在最后添加:
lblTotalEnemyLifes.Text = life.ToString();
另一种可能更优雅且不易出错的方法是:
将您的价值包装在 class:
public class GameState
{
public int TotalEnemyLifes { get; set; }
}
接下来,实例化 class 并将其绑定到 UI:
var ctx = new GameState { TotalEnemyLifes = LIFE_VALUE };
this.DataContext = ctx;
接下来,更新按钮事件处理程序中的值:
private void event_Handler(object sender, RoutedEventArgs e)
{
ctx.TotalEnemyLifes--;
BindingOperations.GetBindingExpression(lblTotalEnemyLifes, Label.ContentProperty).UpdateTarget();
}
将数据存储在标签中是个坏主意。标签和文本框应该只用于用户交互(输入和 output/display)。将数据存储在变量、字段或属性中。最好为您的游戏逻辑使用单独的 classes 而不是在表单
中执行逻辑public class Game
{
private const int InitialLifesCount = 100;
public Game()
{
EnemyLifes = InitialLifesCount;
}
public int EnemyLifes { get; set; }
public AttackEnemy()
{
EnemyLifes--;
}
}
你可以这样写
private _game = new Game();
在按钮中点击:
_game.AttackEnemy();
lblTotalEnemyLifes.Text = _game.EnemyLifes.ToString();
看看data binding也是个好主意。如果您在游戏 class 中实现 INotifyPropertyChanged
界面并将 class 属性绑定到您的标签,那么标签将自动更新。
除了提高清晰度外,逻辑和 I/O 的分离还允许您为游戏逻辑编写 unit tests。在单元测试中你可以写
[TestMethod]
public void AttackingEnemyReducesHisLifes()
{
var game = new Game();
int lifesBefore = game.EnemyLifes;
game.AttackEnemy();
Assert.AreEqual(lifesBefore - 1, game.EnemyLifes);
}