Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2013, 23:36   #1
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию Проблема с созданием массива кнопок

Заранее извиняюсь, если такая тема уже была, по поиску не нашёл, если что- киньте ссылками.
Итак, суть дела: пишу курсовик - игра "пятнашки", написал создание кнопок с текстом, хотел начинать передвижение по клику, но подумал, что лучше бы делать всё через классы, а не в процедурном стиле. Так вот, создал класс, в нём создал метод создания кнопок, на форме создаю экземпляр этого класса и вызываю его метод.
Проблема в том, что кнопки не создаются, хотя если в том же методе вывести любое сообщение - оно выводится.
Копировал код в главную форму и пробовал запустить - работает, через классы нет. А надо именно через классы, чтобы показать преподу, что мы умеем работать с ооп ))

Коды ниже:
файл Create.cs
Код:

    public class Create : Button
    {

        int n, i, j;
        Button[,] square = new Button[4, 4];
        int[,] num = new int[4, 4];
        Random r = new Random();


        public void gen()
        {
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    for (n = 0; n < 16; n++)
                    {

                        square[i, j] = new Button();
                        square[i, j].Parent = this;
                        square[i, j].Size = new Size(50, 50);
                        square[i, j].Location = new Point(5 + i * 50, 5 + j * 50);
                        square[i, j].Text = (j * 4 + i + 1).ToString();
                        square[i, j].Tag = j * 4 + 1;
                        if (num[i, j] != 16)
                        // square[i, j].Click += new EventHandler(button_click);//пока что не работает, разобраться потом
                        this.Controls.Add(square[i, j]);
                    }
        }


    }
form1.cs
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace game_ver_1._0
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
             Create q = new Create();
             q.gen();
        }

    }
}
Буду благодарен за любой ответ.
ElviS1992 вне форума Ответить с цитированием
Старый 14.01.2013, 00:15   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Попробуйте так, у вас this указывает на текущий класс а не на форму
Код:
 public class ButtonFactory
    {
        private int n, i, j;

        private Button[,] square = new Button[4,4];

        private int[,] num = new int[4,4];

        private Random r = new Random();

        private Form container;

        public ButtonFactory(Form container)
        {
            this.container = container;
        }

        public void gen()
        {
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    for (n = 0; n < 16; n++)
                    {
                        square[i, j] = new Button();
                        square[i, j].Parent = container;
                        square[i, j].Size = new Size(50, 50);
                        square[i, j].Location = new Point(5 + i * 50, 5 + j * 50);
                        square[i, j].Text = (j * 4 + i + 1).ToString();
                        square[i, j].Tag = j * 4 + 1;
                        if (num[i, j] != 16) // square[i, j].Click += new EventHandler(button_click);//пока что не работает, разобраться потом
                            container.Controls.Add(square[i, j]);
                    }
        }


    }
Код:
private void Form1_Load(object sender, EventArgs e)
        {

            ButtonFactory q = new ButtonFactory(this);
            q.gen();
        }
Reskov вне форума Ответить с цитированием
Старый 14.01.2013, 01:52   #3
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Уже разобрался, спасибо! Да, именно в этом и была проблема!!
Завтра буду писать перемещение кнопок!)
ElviS1992 вне форума Ответить с цитированием
Старый 20.01.2013, 14:59   #4
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Ээх, теперь запнулся на рандомном перемешивании текста на кнопках и перемещения их по клику...
ElviS1992 вне форума Ответить с цитированием
Старый 20.01.2013, 15:32   #5
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Перемещение сделал кое как конечно(не своей головой, увы), а вот проверку на верность расставленных шашек не могу додумать...
Подтолкните идею хоть какую-то?

Сейчас банально проверяю:

Код:
  public void check()
        {
            for (i = 0; i < 16; i++)
            {
               
                if (mass[i].ToString() == price)
                {
                    MessageBox.Show("You win!");
                }
                else
                {
                    MessageBox.Show("NO, the game is still waiting for you");
                }
            }
        }
метод вызываю на кнопке формы..

но если нажать когда не сложено - выдаёт 16 раз no... и это понятно ибо оно в цикле выводится, как вот бы сделать так, чтобы при нажатии на кнопку проверять совпал ли массив text кнопок с эталонным? это временный ход , потом просто буду проверять при клике на кнопку если правильно расставлены фишки - выигрыш.

Может быть неверно сформулировал вопрос...сам алгоритм я понимаю игры, а вот реализацию её не особо, давно уже делал что-либо на шарпе =\
ElviS1992 вне форума Ответить с цитированием
Старый 20.01.2013, 15:56   #6
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Сейчас работает перемещение и перемешивание, НО если заюзать перемешивание, то все цифры, где есть 0 получаются перестают работать и фактически сделать ничего нельзя, с кодом я по-моему что-то намутил всё же ((


Класс create

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace game_ver_1._0
{
    public class Create
    {

        int[,] field = new int[4, 4];
        int[] mass = new int[16];
        Random myRand = new Random();
        Button[] ButtonArray = new Button[16];
        int i;
        string price = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15";
        List<int> array = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 };

        public void create(Form1 form)
        {
            int x = 0, y = 0;
            for (i = 0; i < ButtonArray.Count(); i++)
            {
                ButtonArray[i] = new Button();
               /* int randomNumber = myRand.Next(array.Count);
                ButtonArray[i].Text = array[randomNumber].ToString();*/
                ButtonArray[i].Text = ((i-1)+1).ToString();
              
                switch (i)
                {
                    case 4: y = y + 40;
                        x = 0;
                        break;
                    case 8: y = y + 40;
                        x = 0;
                        break;
                    case 12: y = y + 40;
                        x = 0;
                        break;
                }

                ButtonArray[i].SetBounds(x, y, 50, 40);
             // array.RemoveAt(randomNumber);
                x = x + 50;
                if (ButtonArray[i].Text == "0")
                {
                    ButtonArray[i].Visible = false;
                }
                form.Controls.Add(ButtonArray[i]);
                this.ButtonArray[i].Click += new EventHandler(Button_Click);

            }
        }


        public void rand()
        {
            for (i = 0; i < ButtonArray.Count(); i++)
            {
                int randomNumber = myRand.Next(array.Count);
                ButtonArray[i].Text = array[randomNumber].ToString();
                
            }
            
        }


        private void Button_Click(object sender, EventArgs e)
        {
            Button bt = (sender) as Button;
            Button bt0 = new Button();
            for (int i = 0; i < ButtonArray.Count(); i++)
            {
                if (ButtonArray[i].Text == "0")
                {
                    bt0 = ButtonArray[i];

                }
            }
            if (bt0.Location.X == bt.Location.X + 50 && bt0.Location.Y == bt.Location.Y ||
                bt0.Location.X == bt.Location.X - 50 && bt0.Location.Y == bt.Location.Y ||
                bt0.Location.Y == bt.Location.Y + 40 && bt0.Location.X == bt.Location.X ||
                bt0.Location.Y == bt.Location.Y - 40 && bt0.Location.X == bt.Location.X)
            {
                for (int i = 0; i < ButtonArray.Count(); i++)
                {

                    if (ButtonArray[i].Text == "0")
                    {
                        Point pt = bt.Location;
                        bt.Location = ButtonArray[i].Location;
                        ButtonArray[i].Location = pt;

                        int Index = bt.TabIndex;
                        bt.TabIndex = ButtonArray[i].TabIndex;
                        ButtonArray[i].TabIndex = Index;
                    }
                     mass[i] = int.Parse(ButtonArray[i].Text);
                }
            }

        }
        public void check()
        {
            for (i = 0; i < 16; i++)
            {
               
                if (mass[i].ToString() == price)
                {
                    MessageBox.Show("You win!");
                }
                else
                {
                    MessageBox.Show("NO, the game is still waiting for you");
                }
            }
        }
        
     
    }
}
form1


Код:
namespace game_ver_1._0
{
    public partial class Form1 : Form
    {

        Create q = new Create();
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
             q.create(this);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            q.rand();
        }

       
    }
}
Уважаемые знатоки, ответьте, пожалуйста, что я делаю не так? Логика где-то подводит
ElviS1992 вне форума Ответить с цитированием
Старый 20.01.2013, 23:49   #7
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Никто не знает в чём проблема (?
ElviS1992 вне форума Ответить с цитированием
Старый 22.01.2013, 22:48   #8
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

Почти сделал всё, что нужно, осталось выигрыш сымитировать и проверить работает ли :D
Если кому-то надо будет - выложу код(может быть) ))
ElviS1992 вне форума Ответить с цитированием
Старый 23.01.2013, 12:46   #9
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Тоже стало интересно) написать простенькие пятнашки, вот можете посмореть что получилось использовал TableLayoutPanel c ним на много проще
Вложения
Тип файла: zip WindowsFormsApplication1.zip (52.8 Кб, 34 просмотров)
Reskov вне форума Ответить с цитированием
Старый 23.01.2013, 16:01   #10
ElviS1992
Пользователь
 
Аватар для ElviS1992
 
Регистрация: 09.02.2010
Сообщений: 26
По умолчанию

В методе проверки вылазят 2 предупреждения, кто может сказать, что они значат?
ElviS1992 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с созданием экземпляра С# Sanuch89 Помощь студентам 5 30.07.2011 16:15
роблема с созданием объекта динамического массива Класса GDA230105 C++ Builder 3 26.07.2011 09:25
Обработчик OnClick у массива кнопок MyLastHit Общие вопросы Delphi 15 18.05.2011 11:33
Проблема с созданием двумерного массива из объектов производных классов Vang Общие вопросы C/C++ 15 28.05.2010 17:04
Проблема с созданием CButton st1q Общие вопросы C/C++ 5 14.09.2008 13:57