C# найти панели, прилегающие к панели при нажатии - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь сделать небольшую игру, в которой вы поворачиваете все панели в зеленый цвет. Я делаю это, получая сетку панелей 5х5, у каждой панели есть шанс 1/3 быть зеленым, в противном случае он будет красным. моя проблема в том, что я не имею ни малейшего понятия, как начать основную проблему. когда я щелкаю панель, панель выше, слева, справа и ниже должна изменить цвет, а также. на данный момент я не знаю, как определить, какие панели находятся рядом с той, по которой щелкают.

это мой код:

public partial class Form1 : Form
{
    Panel[,] PanelArray = new Panel[5,5];
    Random R = new Random();
    int R1;

    public Form1()
    {
        InitializeComponent();
        for (int r = 0; r < 5; r++)
        {
            for (int c = 0; c < 5; c++)
            {
                R1 = R.Next(0, 3);

                PanelArray[r, c] = new Panel
                {
                    Size = new Size(50, 50),
                    Location = new Point(PanelContainer.Width / 5 * c, PanelContainer.Height / 5 * r),
                    BackColor = Color.Red,
                    BorderStyle = BorderStyle.Fixed3D
                };
                PanelArray[r, c].Click += new EventHandler(PanelArray_Click);
                if (R1 == 1) PanelArray[r, c].BackColor = Color.Green;
                PanelContainer.Controls.Add(PanelArray[r, c]);
            }
        }
    }

    private void PanelArray_Click(object sender, EventArgs e)
    {
        Panel P = (Panel)sender;

        if (P.BackColor == Color.Red) P.BackColor = Color.Green;
        else if (P.BackColor == Color.Green) P.BackColor = Color.Red;

        if (CheckWin()) MessageBox.Show("test");
    }

    private bool CheckWin()
    {
        //foreach panel green blah blah
        return false;
    }
}

} `

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете использовать свойство Tag в ваших Panel объектах для хранения некоторой информации.

PanelArray[r, c] = new Panel
{
    Size = new Size(50, 50),
    Location = new Point(PanelContainer.Width / 5 * c, PanelContainer.Height / 5 * r),
    BackColor = Color.Red,
    BorderStyle = BorderStyle.Fixed3D,
    Tag = (Row: r, Column: c)
};   

В вашем методе PanelArray_Click вы можете получить индексы:

var indexes = ((int Row, int Column))P.Tag;
var row = indexes.Row;
var column = indexes.Column;
// Todo: your logic here

В свойстве Tag вы можете хранить любой объект, поэтому при необходимости вы можете создать некоторый класс для хранения данных.

Другое решение - два для циклов, чтобы получить индексы, такие как:

private (int Row, int Column) GetIndexes(Panel panel)
{
    for (int x = 0; x < PanelArray.GetLength(0); x++)
    {
        for (int y = 0; y < PanelArray.GetLength(1); y++)
        {
            if (PanelArray[x, y] == panel)
            {
                return (x, y);
            }
        }
    }

    throw new Exception("Not found.");
}

А затем вы можете использовать в своем методе PanelArray_Click:

var indexes = this.GetIndexes(P);
var row = indexes.Row;
var column = indexes.Column;
// Todo: your logic here
0 голосов
/ 02 апреля 2020

Вот простой трюк для получения строки и столбца. Создайте класс, который наследует Panel и добавляет строку и столбец. Смотрите код ниже

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        MyPanel[,] PanelArray = new MyPanel[5, 5];
        Random R = new Random();
        int R1;

        public Form1()
        {
            InitializeComponent();
            for (int r = 0; r < 5; r++)
            {
                for (int c = 0; c < 5; c++)
                {
                    R1 = R.Next(0, 3);

                    PanelArray[r, c] = new MyPanel
                    {
                        Size = new Size(50, 50),
                        Location = new Point(PanelContainer.Width / 5 * c, PanelContainer.Height / 5 * r),
                        BackColor = Color.Red,
                        BorderStyle = BorderStyle.Fixed3D,
                        row = r,
                        col = c
                    };
                    PanelArray[r, c].Click += new EventHandler(PanelArray_Click);
                    if (R1 == 1) PanelArray[r, c].BackColor = Color.Green;
                    PanelContainer.Controls.Add(PanelArray[r, c]);
                }
            }
        }

        private void PanelArray_Click(object sender, EventArgs e)
        {
            MyPanel P = sender as MyPanel;
            int row = P.row;
            int col = P.col;

            if (P.BackColor == Color.Red) P.BackColor = Color.Green;
            else if (P.BackColor == Color.Green) P.BackColor = Color.Red;

            if (CheckWin()) MessageBox.Show("test");
        }

        private bool CheckWin()
        {
            //foreach panel green blah blah
            return false;
        }
    }
    public class MyPanel : Panel
    {
        public int row { get; set; }
        public int col { get; set; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...