2015-12-31 3 views
0

Я пытаюсь сделать игру 2048 на C#, но у меня проблема, когда я перемещаю плитки.Обмен двумя PictureBoxes

Вот где я держу плитки:

picture = new PictureBox[4, 4] { 
       {pic1,pic2,pic3,pic4}, 
       {pic5,pic6,pic7,pic8}, 
       {pic9,pic10,pic11,pic12}, 
       {pic13,pic14,pic15,pic16} }; 

И когда я нажимаю «W» переместить его вверх:

public void Up() 
    { 
     for (int i = 1; i < picture.GetLength(0); i++) 
      for (int j = 0; j < picture.GetLength(1); j++) 
       if(picture[i,j].Image!=null && picture[i-1,j].Image==null) 
       { 
        picture[i - 1, j].Image = picture[i, j].Image; 
        picture[i, j].Image = null;   
        Up();  
       } 

    } 

но код только переставляет образы из PictureBox не сам PictureBox , Как я могу поменять картинку с изображением и всем его свойством?

+0

Почему Поменяв 'Image' внутри изображения недостаточно? Если вы хотите переместить ящики с изображениями, вам нужно изменить свойство 'Location'' PictureBox'. –

+0

Когда я пытаюсь сделать сумму из 2 плиток, мне нужен точный индекс, если я изменяю только изображения, индекс остается в исходной позиции –

+0

Вам нужна лучшая форма данных для «Карты» игры, чем просто двумерная массива 'PictureBox', будет сложно сказать, какое значение представляет pictureBox (даже с отражением и опираясь на имя переменной, если вы об этом подумали). Вы можете, например, используйте 2-мерный массив 'int'. и работать над этим. 'var map = new int [4,4] = {{1, 1, 1, 0}, ....};' Что касается «взаимозаменяемости»: посмотрите http://stackoverflow.com/questions/3473597/it-is-возможно-to-copy-all-the-properties-of-an-an-control-c-window-формы для клонирования элемента управления с отражением. –

ответ

0

В C# нет коммутационных функций, поэтому вам потребуется временная вспомогательная переменная.

Это до вас, чтобы решить, что вы хотите перейти:

  • на PictureBoxes ссылки в массиве
  • только их местоположения
  • их изображения
  • или любая комбинация ..

Ниже приведен пример простой вспомогательной функции, которая обменивает ссылки и их местоположения:

void SwitchControls(PictureBox pb1, PictureBox pb2) 
{ 
    PictureBox temp = pb1; 
    Point tempLoc = pb1.Location; 
    pb1 = pb2; 
    pb2 = temp; 
    pb1.Location = pb2.Location; 
    pb2.Location = tempLoc ; 
} 

Вы могли бы назвать его, например, так:

SwitchControls(picture[i - 1, j], picture[i, j]); 

Чтобы обменять изображения можно было бы написать функцию, как

void SwitchImages(PictureBox pb1, PictureBox pb2) 
{ 
    Image temp = pb1.Image; 
    pb1.Image = pb2.Image; 
    pb2.Image = temp.Image; 
} 

и т.д ..

+0

не работает ... –

+0

Обратите внимание, что это не переключает изображения в вашем графическом интерфейсе или что-то еще, оно просто * обменивает * PictureBox, на которые эти переменные указывали (например, ссылки на переключение). Не уверен, что вы ожидаете от этого кода. –

+0

Как уже было сказано, вам нужно адаптировать код к тому, что вы хотите. Я добавил вариант для обмена изображениями. Обратите внимание, что мы не видим весь ваш код, поэтому вполне могут быть другие свойства, представляющие интерес для PictureBoxes. Вы также можете комбинировать первую версию с дополнительным изменением местоположений для того же визуального эффекта. Я расширил эту версию до первой версии! – TaW

Смежные вопросы