2015-01-03 10 views
1

Я новичок в C#, и у меня возник вопрос о том, как вычесть число из метки?Вычесть число из метки

Я пытаюсь подать заявку. Ситуация следующая:

У меня есть кнопка, которая говорит «атака», и есть метка «lblTotalEnemyLifes». Теперь, когда я нажимаю кнопку, я хочу вычесть 1 «урон» от общего количества hp, который имеет метка, и метка будет автоматически обновляться после нажатия кнопки. Я пробовал много разных вещей, и ничего не работает. На данный момент я пробовал такие вещи, как:

int damage = -1; 

int life = Convert.ToInt32(lblTotalEnemyLifes.Text); 

life = life - damage; 

Я пробовал больше, чем это. Если кто-то может помочь мне, как я вычту номер из метки, это было бы здорово.

Заранее благодарен!

+1

Во-первых, вычитание отрицательного значения '- (- 1)' добавит к жизни. Кроме того, что сломано? – Plutonix

+0

С математически неправильным! – agentpx

ответ

3

Вы вычитая число, но не записать его обратно:

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(); 
+0

Спасибо за быстрый ответ –

+0

Это правда, что вы сказали. Я не писал его на свой лейбл. Большое спасибо! –

+0

@MaximedeLange, вы должны щелкнуть по галочке, чтобы указать на эту проблему. Тем более, что это помогло с другой проблемой, о которой вы даже не подозревали. – Plutonix

1

Попытка установить ущерб 1, а не -1. Затем добавьте в конец:

lblTotalEnemyLifes.Text = life.ToString();

2

другой подход, возможно, более элегантный и менее подвержен ошибкам, заключается в следующем:

wrapp ваше значение в классе:

public class GameState 
{ 
    public int TotalEnemyLifes { get; set; } 
} 

следующий объект класса и привязать его к 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(); 
} 
1

Плохая идея хранить ваши данные в ярлыках. Ярлыки и текстовые поля должны использоваться только для взаимодействия с пользователем (ввод и вывод/отображение). Храните данные в переменных, полях или свойствах. Еще лучше использовать отдельные классы для вашей игровой логики вместо выполнения логики внутри формы

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.Если вы реализуете интерфейс INotifyPropertyChanged в своем игровом классе и привязываете свойства класса к вашим меткам, метки будут обновляться автоматически.

Помимо повышения ясности, разделение логики и ввода-вывода позволяет вам написать unit tests для вашей логики игры. В модульном тесте вы можете написать

[TestMethod] 
public void AttackingEnemyReducesHisLifes() 
{ 
    var game = new Game(); 
    int lifesBefore = game.EnemyLifes; 
    game.AttackEnemy(); 
    Assert.AreEqual(lifesBefore - 1, game.EnemyLifes); 
} 
+0

Спасибо за информацию. Я попробую это –

Смежные вопросы