Как я узнаю, какая карта нажата? - PullRequest
0 голосов
/ 16 октября 2018

Я делаю игру памяти в WPF и C #.До сих пор все идет хорошо.Когда я нажимаю (поворачиваю) 2 карты, я хочу, чтобы мой код зарегистрировал это, а когда изображения не совпадают, тогда я хочу, чтобы изображение back.png вернулось.

Теперь мой код считает, сколько раз тамбыла нажата, но я не знаю, как заставить карты «повернуться» снова и заставить их уйти, когда совпадают 2 изображения.У меня 16 изображений, 1 и 9 - пары, 2 и 10 - пары и т. Д.

Я планировал создать метод, который называется resetCards().

Это мойMainWindow.cs:

    public partial class MainWindow : Window
{
    private MemoryGrid grid;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void start_Click(object sender, RoutedEventArgs e)
    {
        grid = new MemoryGrid(GameGrid, 4, 4);
        start.Visibility = Visibility.Collapsed;
    }

Это мой MemoryGrid.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace SpellenScherm
{
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 void resetCards()
    {

    }

    private void CardClick(object sender, MouseButtonEventArgs e)
    {

        if (numberOfClicks < 2)
        {
            Image card = (Image)sender;
            ImageSource front = (ImageSource)card.Tag;
            card.Source = front;
            numberOfClicks++;

        }
        if (numberOfClicks == 2)
        {

            resetCards();

            numberOfClicks = numberOfClicks -2;
        }
    }

    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;
    }
}
}

1 Ответ

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

Вы можете попробовать этот подход - оставьте два поля в вашем классе MemoryGrid по одному для каждого из изображений, которые показывают их лицевые грани.(Давайте назовем их Image1 и Image2).Затем вы можете отслеживать, какие карты перевернуты во всей сетке, и передавать их в качестве аргументов методу resetCards следующим образом:

private void CardClick(object sender, MouseButtonEventArgs e)
{

    if (numberOfClicks < 2)
    {
        Image card = (Image)sender;
        ImageSource front = (ImageSource)card.Tag;
        card.Source = front;
        if(this.Image1 == null){
           Image1 = card;
        }
        else if(this.Image2 == null){
           Image2 = card;
        }
        numberOfClicks++;

    }
    if (numberOfClicks == 2)
    {

        resetCards(Image1, Image2);

        numberOfClicks = numberOfClicks -2;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...