所以很不幸我现在有点超级菜鸟,哈哈,所以如果可能的话请容忍我。
我正在尝试做的程序是一个钢琴音符随机发生器,为了有效地记忆音符/音阶。我想这将是一个有趣的小程序,以帮助我的钢琴之旅和编程之旅哈哈。Image of program。
在这个程序里,我放了一个组合框,里面有每个钢琴音阶的选项,看起来像这样:picture of combo box.
然后我继续为每个音阶和该音阶的音符做了一个数组,如下所示:
//Arrays to store each scale
string[] cMajor = { "C", "D", "E", "F", "G", "A", "B", "C", };
string[] dMajor = { "D", "E", "F#", "G", "A", "B", "C#", "D", };
string[] eMajor = { "E", "F#", "G#", "A", "B", "C#", "D#", "E", };
string[] fMajor = { "F", "G", "A", "Bb", "C", "D", "E", "F", };
string[] gMajor = { "G", "A", "B", "C", "D", "E", "F#", "G", };
然后我使用了一个随机数生成器,作为数组的索引,这样它会随机选择一个0到7之间的数,理想情况下,随机选择一个数组索引,然后我们可以将其传递到一个标签中,该标签将是屏幕上显示的钢琴音符。
//Number Generator to pass into the newNumber variable which will act as an index for the array
Random generator = new Random();
int newNumber = generator.Next(0, 7); // Generating a number that equates to the number of notes in a particular scale
然后我输入代码,选中所选输入的组合框,然后根据所选的比例创建标签:
if (comboBox1.SelectedIndex == 0)
{
OUTPUTLABEL1.Font = new Font("Segoe UI", 100);
OUTPUTLABEL1.Location = new Point(80, 5);
OUTPUTLABEL1.Text = cMajor[newNumber];
}
大部分时候,一切都是按计划进行的。我可以选择音阶,音符会弹出在屏幕上,问题是没有一个是动态的。音阶的选择是硬编码到程序中的,正如你所看到的。c大调的音阶也是硬编码的。
我可以从ComboBox中选择一个比例,文本将根据ComboBox中选择的比例动态更改。我能想到的唯一完成此操作的方法将创建大量冗余的if语句,我觉得可能有更好的方法可以完成此操作。
非常感谢你们,如果这是显而易见的,或者我可能犯了其他错误,我再次向你们道歉。这是我在这里的第一篇文章,我希望我已经为你们提供了足够的信息!再次感谢!
完整编码(忽略计时器):
public void RandomizeButton_Click(object sender, EventArgs e)
{
//Arrays to store each scale
string[] cMajor = { "C", "D", "E", "F", "G", "A", "B", "C", };
string[] dMajor = { "D", "E", "F#", "G", "A", "B", "C#", "D", };
string[] eMajor = { "E", "F#", "G#", "A", "B", "C#", "D#", "E", };
string[] fMajor = { "F", "G", "A", "Bb", "C", "D", "E", "F", };
string[] gMajor = { "G", "A", "B", "C", "D", "E", "F#", "G", };
//Number Generator to pass into the newNumber variable which will act as an index for the array
Random generator = new Random();
int newNumber = generator.Next(0, 7); // Generating a number that equates to the number of notes in a particular scale
if (comboBox1.SelectedIndex == 0)
{
OUTPUTLABEL1.Font = new Font("Segoe UI", 100);
OUTPUTLABEL1.Location = new Point(80, 5);
OUTPUTLABEL1.Text = cMajor[newNumber];
}
if (TimerCheckbox.Checked)
{
seconds = int.Parse(timeInterval.Text);
timer1.Start();
}
}
如果我对数组和组合框的思考方式不太理想,那么如果需要的话,我愿意接受一个全新的解决方案!非常感谢你们!
1条答案
按热度按时间gpfsuwkq1#
看起来你需要一个链接的数据结构。在一个变量和另一个变量之间建立Map的最常用的方法是使用字典
上面的代码将根据组合框的值(用组合框使用的任何值替换a、b、c、d和e)获取数组
字典是C#中非常强大的工具
你的问题有点模糊,所以我不知道我是否完全涵盖了你的问题,让我知道