Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinForms массив button'ов, игра пятнашки 
:(
    Опции темы
Master_
  Дата 11.7.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Как создать Windows::Forms::Button^ в виде массива? Чтобы иметь доступ ко всем элементам как к массиву?

Это нужно для игры в пятнашки - http://ru.wikipedia.org/wiki/Пятнашки.
PM   Вверх
Master_
Дата 11.7.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Вроде сделал, но ошибк на выход за пределы размерности:
Код

    public:
        Form1(void)
        {
            InitializeComponent();//Сгенерированное форм дизигнером
            EmptyPoint = Point();//пустое место
            ArrayList alAllButtons = gcnew ArrayList;//Массив всех кнопок

            //Добавляем все кнопки на панели в этот массив
            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);
            Point^ p = gcnew Point(320,240);
            EmptyPoint.X = 240;
            EmptyPoint.Y = 240;
            NewGame();
        }
....

private: void generate()
             {
                 Random^ r = gcnew Random;
                 Button^ tempBtn = gcnew Button;
                 for (int i=0; i<100; ++i)
                 {
                     int temp = r->Next(alAllButtons.Count );
                     // Случайная кнопка из всех
                     tempBtn = (Button^) alAllButtons[r->Next(alAllButtons.Count )];                     
                     MoveButton(tempBtn);// Перемещаем            
                 }
             }
private: void NewGame()
             {
                 generate();
             }
    };
Ругается на tempBtn = (Button^) alAllButtons[r->Next(alAllButtons.Count )];, не могу понять, в чем дело.
PM   Вверх
voov
Дата 12.7.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: нет
Всего: 8



Цитата(Master_ @  11.7.2009,  22:20 Найти цитируемый пост)
Ругается

как именно ругается?

я не силен в WinForms, но могу предположить, что массивы там тоже индексируются с нуля, а рандом генерит числа включая граничные значения. в этом случае нужно так
Код

alAllButtons[r->Next(alAllButtons.Count - 1)];

PM MAIL   Вверх
Master_
Дата 12.7.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Цитата
Необработанное исключение типа "System.ArgumentOutOfRangeException" произошло в mscorlib.dll

Дополнительные сведения: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.


Если добавить -1, то 
Цитата
Необработанное исключение типа "System.ArgumentOutOfRangeException" произошло в mscorlib.dll

Дополнительные сведения: Значение "maxValue" должно быть больше нуля.

То есть получается, что alAllButtons.Count == 0.
Причем при заполнении в функции Form1(void) 
Код

            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);

alAllButtons заполняется, но ее не видно в другой функции, в той где ошибка.
 smile 
PM   Вверх
voov
Дата 12.7.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: нет
Всего: 8



Цитата(Master_ @  12.7.2009,  12:15 Найти цитируемый пост)
То есть получается, что alAllButtons.Count == 0.
Причем при заполнении в функции Form1(void) 
alAllButtons заполняется, но ее не видно в другой функции, в той где ошибка.

стоп! а где у тебя объявлен массив alAllButtons?
поидее должен быть объявлен членом класса, но я вижу локальное объявление при инициализации
Код

            ArrayList alAllButtons = gcnew ArrayList;//Массив всех кнопок

            //Добавляем все кнопки на панели в этот массив
            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);

скорее всего в этом дело. ты просто заполняешь один массив, а смотришь в другом.


ну а по поводу исключений, естественно, нужно убедиться, что массив не пуст до вызова рандома. и если это так, то вызывать его как я писал (с -1).
PM MAIL   Вверх
diadiavova
Дата 13.7.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



А зачем такие сложности с массивом и прочими прибамбасами? Можно использовать TableLayoutPanel. Коллекцией, содержащей все кнопки будет коллекция Controls этой панели, а индексироваться они будут по ячейке, в которой находятся. Для того, чтобы переместить кнопку понадобится всего лишь поменять ячейку, в которой она находится. Я так делал - получилось неплохо(правда проект не сохранился smile ).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.