首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >桌面rpg点购买系统

桌面rpg点购买系统
EN

Stack Overflow用户
提问于 2016-02-04 17:19:04
回答 4查看 141关注 0票数 1

我试着用数字升降来说明购买系统的重要性。这里的想法是:有六个数字升降,每个特征一个(力量,灵巧,体质,智力,智慧和魅力)。每个特征从10分开始。你不能让你的性格低于7或超过18岁。

我是个十足的菜鸟,但我做到了:

代码语言:javascript
运行
复制
private void numericUpDown1_ValueChanged(object sender, EventArgs e)

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

我做了六次。在我的表格中,现在有六个数字的升降。现在我试着做一些对我微不足道的知识来说太多的事情。

我想要一个系统,在这个系统中,六个数字的升降值合并在一起,不能超过,这意味着在这种情况下,我们将有60分,不能增加任何分数,除非我们减少一个。我会在这个“点池”中增加15分,这样用户就不必马上减少一个属性,从而增加另一个属性。

例子:我还有1分,我的分数如下: 15,15,14,10,10,10,10,10。我把第三个分数提高了1分。我现在有一个: 15, 15, 15, 10, 10, 10. 现在我什么都没有了,但我想要我的第四分,以15分。为了达到这个目标,我必须降低第五和第六,直到我有5分释放。我现在有一个: 15, 15, 15, 15, 7, 8.

如果在我的表格中有一个Lil‘box来显示还剩多少分,那将是一颗樱桃。

我尽了最大的努力来解释这件事。请注意,英语不是我的母语,我有时会与它作斗争。

我对如何做到这一点一无所知,因为我对C#几乎一无所知。代码会丢失什么?

EN

回答 4

Stack Overflow用户

发布于 2016-02-04 18:13:00

如果您创建一个字符类,它会更容易。

您可以为构造函数中的每个属性定义默认值,还可以定义单个方法来增加或减少其点数。

代码语言:javascript
运行
复制
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...

}

您只需要在开始时执行实例,您的UI按钮只需要调用CharacterFoo.IncreaseStrength()或CharacterFoo.DecreaseWisdom() .等。

此外,有了这个选项,您可以随时在游戏的任何部分重用此选项。(如果你的角色发现了任何特殊的药剂..。然后是CharacterFoo.IncreaseStrength()

希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2016-02-04 17:33:38

有几种方法可以做到。

首先,将这些移出事件函数之外:

代码语言:javascript
运行
复制
numericUpDown1.Maximum = 18;
numericUpDown1.Minimum = 7;

我的建议是设置一个具有最大点数的变量:

private int MAX_POINTS = 60;

然后,当它们中的一个被更改时,您可以调用另一个方法,该方法将所有当前框加起来,并确定它是否超出了限制:

代码语言:javascript
运行
复制
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
    }

}

这样做的一个优点是,您可以对所有6个stat框重用相同的事件方法numericUpDown1_ValueChanged

票数 0
EN

Stack Overflow用户

发布于 2016-02-04 18:16:42

如果我是你,我会选择一个角色类,因为这将大大简化你未来的工作,虽然如果你是新的,这可能会更难在一开始。尽管如此,您仍然可以按照以下基本方法进行后续工作:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35207475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档