Возникла такая вот алгоритмическая проблема.
Есть 19 коробок. В каждой коробке 19 пронумерованных шаров от 1 до 19.
Скажем начинаем с первой коробки - выбираем там шар номер 2. Во второй коробке я могу выбрать любой шар кроме номер 2.
Скажем выбрал шар номер 3. В третьей коробке я могу выбрать шар только из оставшихся 1,4,5,6,7,8,9,10...и так далее
Проблема как отображать оставшиеся шары на дисплее циклически?
Есть три кнопки ENTER,UP,DOWN.
ENTER выбирает следующую коробку - движение только вверх, вернуться к предыдущей коробке я не могу.
UP, DOWN выбирают следующий доступный шар.
И текущая коробка и выбранный шар отображаются на дисплее.
Я сделал симуляцию на Сшарп
byte g_counter;
int box_number;
byte ball_number;
byte[] mslseq = new byte[20];
byte[] selected = new byte[20];
private void Form1_Load(object sender, EventArgs e)
{
ball_number = 1;
box_number = 0;
g_counter = 1;
DisplayText();
}
private void buttonEnter_Click(object sender, EventArgs e)
{
if (ball_number < 20)
{
mslseq[box_number] = ball_number;
selected[ball_number] = 1;
}
//select next box
box_number++;
//find first available ball
ball_number = GetNextBallNumber(UP_KEY, 1);
g_counter = ball_number;
if (box_number > 18)
{
box_number = 0;
textBoxDisplay.Text = "Finished!!!";
}
DisplayText();
}
private void buttonUp_Click(object sender, EventArgs e)
{
g_counter++;
if (g_counter > 19)
g_counter = 1;
ball_number = GetNextBallNumber(UP_KEY, g_counter);
g_counter = ball_number;
DisplayText();
}
private void buttonDown_Click(object sender, EventArgs e)
{
g_counter--;
if (g_counter > 19)
g_counter = 19;
ball_number = GetNextBallNumber(DOWN_KEY, g_counter);
g_counter = ball_number;
DisplayText();
}
void DisplayText()
{
textBoxBox.Text = (box_number + 1).ToString();
textBoxBall.Text = ball_number.ToString();
}
byte GetNextMissleNumber(int key, byte b_num)
{
int done = 0;
while (done == 0)
{
if (selected[b_num] == 0)
{
done = 1;
return b_num;
}
else
{
if (key == UP_KEY)
{
b_num++;
if (b_num > 19)
{
done = 1;
return 1; //????
}
}
else if (key == DOWN_KEY)
{
b_num--;
if (b_num > 19) //overflow
{
done = 1;
return 19; //????
}
}
}
}
return 0;
}
Проблема в переходах 1-19, 19-1.Не получается разрулить логику.