2015-01-03 85 views
1

我是C#的新手,並且遇到了有關如何從標籤中減去數字的問題?從標籤中減去一個數字

我想提出申請。情況如下:

我得到一個按鈕,說「攻擊」,並有一個名爲「lblTotalEnemyLifes」的標籤。現在,當我按下按鈕時,我想從標籤所具有的總馬力中減去1個「傷害」,並且按下按鈕後標籤將自動更新。我嘗試了很多不同的東西,似乎沒有任何工作。此刻我嘗試的東西如下:

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接口並將類屬性綁定到標籤,則標籤將自動更新。

除了提高清晰度外,邏輯和I/O的分離允許您爲遊戲邏輯編寫unit tests。在單元測試中你可以寫出

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

感謝您的信息。我會試試這個 –