Код должен сначала сделать одну вещь, затем подождать пару секунд, а затем продолжить - PullRequest
0 голосов
/ 20 октября 2018

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

Мой код:

public class MemoryGrid
{
    private Grid grid;
    private int rows, cols;

    public MemoryGrid(Grid grid, int rows, int cols)
    {
        this.grid = grid;
        this.rows = rows;
        this.cols = cols;

        InitializeGrid();
        AddImages();
    }


    private void InitializeGrid()
    {
        for (int i = 0; i < rows; i++)
        {
            grid.RowDefinitions.Add(new RowDefinition());
        }
        for (int i = 0; i < cols; i++)
        {
            grid.ColumnDefinitions.Add(new ColumnDefinition());
        }
    }

    private void AddImages()
    {
        List<ImageSource> images = GetImagesList();
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < cols; col++)
            {
                Image back = new Image();
                back.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));

                back.MouseDown += new System.Windows.Input.MouseButtonEventHandler(CardClick);

                back.Tag = images.First();
                images.RemoveAt(0);
                Grid.SetColumn(back, col);
                Grid.SetRow(back, row);
                grid.Children.Add(back);
            }
        }
    }



    static int numberOfClicks = 0;
    private Image card;
    static int score;
    private Image Image1;
    private Image Image2;



    private void CardClick(object sender, MouseButtonEventArgs e)
    {
        Image card = (Image)sender;
        ImageSource front = (ImageSource)card.Tag;
        card.Source = front;
        numberOfClicks++;

        checkCards(card);
    }

    private void checkCards(Image card)
    {

        this.card = card;
        if (numberOfClicks < 2 || numberOfClicks == 2)
        {

            if (this.Image1 == null)
            {
                Image1 = card;
            }
            else if (this.Image2 == null)
            {
                Image2 = card;
            }
        }

        if (numberOfClicks == 2)
        {
            checkPair();

            numberOfClicks = 0;
            Image1 = null;
            Image2 = null;
        }
    }

    public void checkPair()
    {
        resetCards(Image1, Image2);
       // more code here to check if the 2 cards are a pair.
       // First only a reset after 2 cards.
    }

    private void resetCards(Image card1, Image card2)
    {
        this.Image1 = card1;
        this.Image2 = card2;


        card1.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
        card2.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
    }

    public List<ImageSource> GetImagesList()
    {
        List<ImageSource> images = new List<ImageSource>();
        List<string> random = new List<string>();

        for (int i = 0; i < 16; i++)
        {

            int imageNR = 0;

            Random rnd = new Random();
            imageNR = rnd.Next(1, 17);
            if (random.Contains(Convert.ToString(imageNR)))
            {
                i--;
            }
            else
            {
                random.Add(Convert.ToString(imageNR));
                ImageSource source = new BitmapImage(new Uri("images/" + imageNR + ".png", UriKind.Relative));
                images.Add(source);
            }
        }
        return images;
    }
}

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Если код должен просто ждать и ничего не делать, когда отображается вторая карта, вы можете просто использовать команду System.Threading.Thread.Sleep(1000);.«1000», которое вы видите, означает, что оно будет ждать 1 секунду.2000 будет 2 секунды и так далее.Эта команда просто предотвращает выполнение следующего шага в течение заданного промежутка времени.Надеюсь, это поможет!

Удачи!

Редактировать: Мне только что сказали, что это не работает.Извините!

0 голосов
/ 20 октября 2018

Самый простой способ сделать это - использовать метод Thread.Sleep :

Thread.Sleep(2000);

Но я бы порекомендовал вам работать с Задачами .Это дает вам асинхронный процесс, и интерфейс не останавливается.Тогда вы могли бы сделать что-то вроде этого:

    public static async Task TaskMethod()
    {
        Debug.WriteLine("Start Waiting");
        Task t = Task.Run(() => DoSomething() );
    }

    private static void DoSomething()
    {
        Thread.Sleep(3000);
        Console.WriteLine("Wake up !");
    }
0 голосов
/ 20 октября 2018

если я правильно понимаю случай без создания и запуска примера приложения, последовательность будет такой:

нажмите первую карту - все в порядке

нажмите вторую карту:

  • показывает фронт (card.Source = front;)

  • выполняет checkCards

  • выполняет checkPair, потому что numberOfClicks == 2

  • выполнить resetCards, и на карте отображается изображение очень быстро .переднее изображение не было замечено

ввести некоторую задержку перед отображением заднего изображения:

private bool hasDelay;
private async void resetCards(Image card1, Image card2)
{
    this.Image1 = card1;
    this.Image2 = card2;

    hasDelay = true;
    await Task.Delay(2000);

    card1.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
    card2.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
    hasDelay = false;
}

не обрабатывать щелчки, когда есть задержка!

private void CardClick(object sender, MouseButtonEventArgs e)
{
    if (hasDelay) return;

    Image card = (Image)sender;
    ImageSource front = (ImageSource)card.Tag;
    card.Source = front;
    numberOfClicks++;

    checkCards(card);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...