2016-02-04 11 views
1

Я пытаюсь сделать систему покупки точки, используя числовые вверх/вниз. Вот идея: Есть шесть числовых вверх/вниз, по одному для каждой черты (Сила, Ловкость, Конституция, Интеллект, Мудрость и Харизма). Каждая черта начинается с 10 баллов. Вы не можете принести черту ниже 7 или выше 18.Точка покупки системы для настольного rpg

я полный нуб, но мне удалось это сделать:

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 

     { 
      numericUpDown1.Maximum = 18; 
      numericUpDown1.Minimum = 7; 
     } 

Я сделал это один раз шесть. В моей форме есть шесть числовых вверх/вниз. Теперь я пытаюсь сделать что-то слишком много для моих незначительных знаний.

Я хочу систему, в которой значение шести числовых пусков вниз объединено и не может быть превышено, а это значит, что в этом случае у нас будет 60 очков, и мы не сможем увеличить оценку, если только мы не уменьшим ее. Я бы добавил 15 пунктов к этому «пулу томов», поэтому пользователю не нужно сразу уменьшать стат, чтобы увеличить его.

Пример: У меня есть 1 балл слева, и мои оценки идут следующим образом: 15, 15, 14, 10, 10, 10. Я увеличиваю третий балл на 1 очко. Теперь у меня есть это:

15, 15, 15, 10, 10, 10.

Теперь у меня ничего не осталось, но я хочу, чтобы мой четвертый счет в 15 очков. Для этого я должен уменьшить пятый и шестой балл, пока у меня не будет 5 очков. Теперь у меня есть это:

15, 15, 15, 15, 7, 8.

Имея ящик Lil»в моей форме, чтобы показать, сколько очков осталось бы вишенкой на вершине.

Я сделал все возможное, чтобы объяснить это. Пожалуйста, обратите внимание, что английский язык не является моим родным языком, и я иногда борюсь с ним.

Я не знаю, как я могу достичь этого, так как я едва знаю какие-либо знания C#. Какой код будет отсутствовать?

+0

Если вы вызываете 'numericUpDown1.Maximum = 18; numericUpDown1.Minimum = 7; 'on' valueChanged', он будет выполняться при каждом изменении каждого элемента. Вы можете просто установить это значение в конструкторе или вместо него вместо 'formLoaded'. – mcy

+0

Можете ли вы показать свой код aspx? – mikeyq6

+0

@ mikeyq6 Он помечен WinForms. – LarsTech

ответ

0

Существует несколько способов сделать это.

Во-первых, переместить их за пределами функции события:

numericUpDown1.Maximum = 18; 
numericUpDown1.Minimum = 7; 

Моя рекомендация будет установить переменную с максимальными точками:

private int MAX_POINTS = 60;

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

private bool TotalOfStatsIsOverLimit() { 
    int total = GetTotalOfStats(); 
    return total > MAX_POINTS; 
} 

private int GetTotalOfStats() { 
    int total = 0; 

    // TODO: Go through each number box and add to the total 

    return total; 
} 

private void numericUpDown1_ValueChanged(object sender, EventArgs e) { 

    if(TotalOfStatsIsOverLimit()) { 
     // TODO: Decrease the value of the stat box that was updated 
    } 

} 

Одно из преимуществ этого способа состоит в том, что вы можете повторно использовать один и тот же метод событий numericUpDown1_ValueChanged для всех 6 своих полей статистики.

1

Было бы проще, если вы создаете класс символов,

Вы можете определить значения по умолчанию для каждого свойства в конструкторе, а также отдельные методы, чтобы увеличить или уменьшить ее точку.

public class Character 
{ 
    private int totalPointsMax = 60; 
    private int maxPoints = 18; 
    private int minPoints = 7; 

    public int Strength { get; set; } 
    public int Dexterity { get; set; } 
    public int Constitution { get; set; } 
    public int Intelligence { get; set; } 
    public int Wisdom { get; set; } 
    public int Charisma { get; set; } 

    public Character() 
    { 
     // create new Character defaults... 
     Strength = 10; 
     Dexterity = 10; 
     Constitution = 10; 
     Intelligence = 10; 
     Wisdom = 10; 
     Charisma = 10; 
    } 

    private int GetTotalCharacterPoints() 
    { 
     return Strength + Dexterity + Constitution + Intelligence + Wisdom + Charisma; 
    } 

    //example of method to increase Strength 
    public void IncreaseStrength() 
    { 
     int availablePoints = totalPointsMax - GetTotalCharacterPoints(); 
     if (availablePoints > 0 && Strength < maxPoints) 
      Strength++; 
    } 

    //example of method to decrease Strength 
    public void DecreaseStrength() 
    { 
     if (Strength >= minPoints) 
      Strength--; 
    } 

    //missing the other increase/decrease methods for the rest of features... 

} 

Вам просто нужно, например в начале и ваши кнопки интерфейса нужно только вызвать CharacterFoo.IncreaseStrength() или CharacterFoo.DecreaseWisdom() ... и т.д.

Кроме того, с помощью этой опции вы можете ВСЕГДА повторно использовать это в любой части игры .. (например: если ваш персонаж находит какой-либо специальный напиток .. то CharacterFoo.IncreaseStrength())

Надеется, что это помогает ...

0

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

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    private const int totalPoints = 60 + 15; // sum of each trait plus the pool bonus 

    public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control control in this.Controls) 
     { 
      if (control is NumericUpDown) 
      { 
       NumericUpDown numControl = control as NumericUpDown; 
       numControl.Minimum = 7; 
       numControl.Maximum = 18; 
       numControl.Value = 10; 
       numControl.ValueChanged += nud_ValueChanged; 
       lblPointsLeft.Text = "15"; // bonus points 
      } 
     } 
    } 

    private void nud_ValueChanged(object sender, EventArgs e) 
    { 
     int sum = (int)(nudCha.Value + nudCon.Value + nudDex.Value + nudInt.Value + nudStr.Value + nudWis.Value); 
     int pointsLeft = totalPoints - sum; 
     NumericUpDown nudSender = (NumericUpDown)sender; 

     if (pointsLeft < 0) 
     { 
      MessageBox.Show("No points left"); 
      // restore last change 
      // undo the last change 

      nudSender.Value = nudSender.Value - 1; 
      pointsLeft++; 



     } 
     lblPointsLeft.Text = pointsLeft.ToString(); 
    } 
} 
} 
0

Вот некоторые псевдокод: Вы хотите создать переменную для хранения текущих точек. Создайте несколько ярлыков, чтобы удерживать эту переменную, и убедитесь, что вы выполняете вызовы AJAX, иначе каждый раз, когда вы обновляете, вы снова вызываете это с сервера. Вероятно, это лучше сделать в Javascript/JQuery.

int pointsUsed = numericUpDown1.value + numericUpDown2.value + numericUpDown6.value; //add all 6 of your values. 

//for your textbox: 
label1.text = "points left is:" 
label2.text = 75 - pointsUsed; 

private void checkBox1_Click(Object sender, EventArgs e) 
{//to add points 
    if (pointsUsed < 75) 
    { 
     numericUpDown1.Value += 1; 
     pointsUsed += 1; 
    } 
} 

Проверьте, пожалуйста, MSDN NumericUpDown.

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

  • Нет связанных вопросов^_^