Ящики с изображениями передают свое изображение ящикам с изображениями под ними

Я делаю простую игру в С# winforms. То, что я пытаюсь сделать, — это игра типа тап-тайл, в которой используются черные и серые тайлы. Цель состоит в том, чтобы попасть в черную плитку, но есть одна загвоздка: каждую секунду черная плитка меняет свое положение.

Я заставил его работать так, как я хочу, но теперь пришло время настроить! При этом я столкнулся с проблемой, которую не могу понять. Вот что я пытаюсь сделать:

http://prntscr.com/3llwoe

У меня есть сетка 3 * 4, сделанная из коробок с картинками. первый ряд генерируется случайным образом из 1 черной и 3 серых плиток. Это должно оставаться таким в течение секунды, затем первый ряд плиток должен быть перемещен во второй ряд, а первый ряд должен быть снова сгенерирован случайным образом. Затем тайлы второго ряда нужно переместить в третий ряд, тайлы первого ряда — во второй, а первый ряд нужно сгенерировать заново.

Я сделал эту работу, но не так, как я хочу.

http://prntscr.com/3llyxy

Поскольку все мои коробки с картинками имеют одинаковую цветовую комбинацию. Может ли кто-нибудь помочь мне понять это? или подтолкнуть меня в правильном направлении? Я предоставлю свой код, если его запросят, так как я понятия не имею, что добавить к моему сообщению прямо сейчас.

Извините за ссылки, но я не смог загрузить изображения!

Это мой метод для плитки:

public void RandomPanel()
    {

        if (i == 1)
        {
                i++;
                Random rnd = new Random();
                int temp = rnd.Next(1, 5);
                switch (temp)
                {
                    case 1:
                        TilelLoc = 1;
                        PbRow3_1.BackgroundImage = _2048Tiles.Properties.Resources.BlackTile;
                        PbRow3_2.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_3.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_4.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;

                        break;
                    case 2:
                        TilelLoc = 2;
                        PbRow3_2.BackgroundImage = _2048Tiles.Properties.Resources.BlackTile;
                        PbRow3_1.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_3.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_4.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        break;
                    case 3:
                        TilelLoc = 3;
                        PbRow3_3.BackgroundImage = _2048Tiles.Properties.Resources.BlackTile;
                        PbRow3_1.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_2.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_4.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        break;
                    case 4:
                        TilelLoc = 4;
                        PbRow3_4.BackgroundImage = _2048Tiles.Properties.Resources.BlackTile;
                        PbRow3_1.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_2.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        PbRow3_3.BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
                        break;
                    default:
                        break;
                }      
        }

        else if (i == 2)
        {
            PbRow2_1.BackgroundImage = PbRow3_1.BackgroundImage;
            PbRow2_2.BackgroundImage = PbRow3_2.BackgroundImage;
            PbRow2_3.BackgroundImage = PbRow3_3.BackgroundImage;
            PbRow2_4.BackgroundImage = PbRow3_4.BackgroundImage;
            i++;
        }
        else if (i == 3)
        {
            i = 1;
            PbRow1_1.BackgroundImage = PbRow2_1.BackgroundImage;
            PbRow1_2.BackgroundImage = PbRow2_2.BackgroundImage;
            PbRow1_3.BackgroundImage = PbRow2_3.BackgroundImage;
            PbRow1_4.BackgroundImage = PbRow2_4.BackgroundImage;
        }
    }

person Tim van Gool    schedule 22.05.2014    source источник
comment
I will provide my code if its requested. Да, пожалуйста.   -  person LarsTech    schedule 22.05.2014
comment
@LarsTech Хорошо, добавил мой метод.   -  person Tim van Gool    schedule 22.05.2014
comment
Не уверен, что вижу проблему. Если я устанавливаю i = 1 и вызываю RandomPanel по таймеру, кажется, все работает нормально. TilelLoc не используется в вашем сообщении.   -  person LarsTech    schedule 23.05.2014
comment
Я использую TileLoc1 для сравнения с панелью, которую контролирует пользователь. На пользовательской панели есть int с именем PlayerLoc, который я сравниваю, чтобы проверить, равна ли позиция пользователей позиции черных плиток.   -  person Tim van Gool    schedule 23.05.2014
comment
В любом случае, что должно происходить, а что не происходит?   -  person LarsTech    schedule 23.05.2014
comment
Все коробки с изображениями имеют одинаковые текстуры, что я не имею в виду. Я хочу сделать так, чтобы первый ряд ящиков с картинками получал случайную комбинацию плиток, например: Серый Серый Черный Серый. Что должно произойти, так это то, что плитки передают свои изображения плиткам под ними, так что тогда это будет: |Пустой Пустой Пустой Пустой | |Серый Серый Черный Серый| || (имеется в виду 1 ряд), то пробелы необходимо заполнить новыми текстурами. например: |Серый Черный Серый Серый| а другая строка по-прежнему будет |Серый Серый Черный Серый| Я надеюсь, что смогу объяснить это достаточно хорошо, поскольку английский не является моим основным языком.   -  person Tim van Gool    schedule 23.05.2014
comment
Итак, строка всегда должна получать случайность при каждом проходе?   -  person LarsTech    schedule 23.05.2014
comment
да. Я сделал визуализацию, используя свои больные навыки рисования. надеюсь, это поможет вам понять немного лучше. картинка   -  person Tim van Gool    schedule 23.05.2014


Ответы (1)


Пара вопросов. Ваша переменная i не работает, потому что вы хотите рандомизировать плитки строки 1 каждый раз, когда вы вызываете этот метод, и после этого цвета должны прокручиваться от одного к другому. Это требует, чтобы вы сначала установили следующие строки в значения строки над ней, прежде чем придать первой строке новую случайность:

private int counter = 0;
Random rnd = new Random();

public void RandomPanel() {
  ++counter;

  if (counter > 2) {
    PbRow1_1.BackgroundImage = PbRow2_1.BackgroundImage;
    PbRow1_2.BackgroundImage = PbRow2_2.BackgroundImage;
    PbRow1_3.BackgroundImage = PbRow2_3.BackgroundImage;
    PbRow1_4.BackgroundImage = PbRow2_4.BackgroundImage;
  }
  if (counter > 1) {
    PbRow2_1.BackgroundImage = PbRow3_1.BackgroundImage;
    PbRow2_2.BackgroundImage = PbRow3_2.BackgroundImage;
    PbRow2_3.BackgroundImage = PbRow3_3.BackgroundImage;
    PbRow2_4.BackgroundImage = PbRow3_4.BackgroundImage;
  }

  int temp = rnd.Next(0, 4);
  Control[] boxes = new Control[] { PbRow3_1, PbRow3_2, PbRow3_3, PbRow3_4 };
  for (int i = 0; i < boxes.Length; ++i) {
    if (i == temp) {
      boxes[i].BackgroundImage = _2048Tiles.Properties.Resources.BlackTile;
    } else {
      boxes[i].BackgroundImage = _2048Tiles.Properties.Resources.GrayTile;
    }
  }
}
person LarsTech    schedule 22.05.2014